martedì 8 febbraio 2011

UML per NetBeans 6.9.1

In questi giorni ho dovuto creare alcuni diagraammi UML riguardanti un progetto sviluppato con NetBeans 6.9.1. Trattandosi di alcune classi con una gran quantità di metodi, ho deciso di ricorrere ad un plugin per generare i diagrammi in automatico. Ricercando su Google ho trovato alcuni plugins adatti solo a vecchie versioni di NetBeans, ma poi ho finalmente trovato quello che faceva al caso mio: UML Modeler for Netbeans 6.9 (252).
Purtroppo non è esente da alcuni bug di visualizzazione, ma con un po' di pazienza sono riuscita a generare tutti i class diagrams voluti a partire dalle mie classi.
Per poterlo utilizzare non dovete far altro che chiudere NetBeans 6.9, estrarre la cartella uml dallo zip scaricato e inserirla nella cartella di installazione di NetBeans. Se state lavorando sotto Mac, andate nella cartella in cui si trova l'applicazione NetBeans --> mostra contenuto pacchetto --> Contents --> Resources --> NetBeans. Quindi avviate NetBeans e cliccate su Nuovo Progetto. Se nella lista compare anche UML, allora avete fatto tutto correttamente. Annullate pure la creazione del nuovo progetto.
Aprite il progetto per cui volete crere i class diagrams, cliccate con il pulsante destro sul package che vi interessa e scegliete Reverse Engineer. Nella schermata che comparirà create un nuovo progetto UML, se ancora non lo possedete. Ora espandete il nuovo progetto creato e anche la sezione model. Cliccate con il destro sul file che ha il nome del vostro package e scegliete Create Diagram From Selected Elements. Scegliete class diagram e terminate la procedura. Comparirà un alert, confermate. Il vostro diagramma si aprirà immediatamente.
Purtroppo non ho trovato un modo per esportare tali diagrammi. Potete provare a stamparli su pdf, diminuendo lo zoom del diagramma stesso, oppura utilizzate print screen (su Mac cmd+shift+4 per selezionare la porzione di schermo da catturare).

sabato 5 febbraio 2011

Fase 7 : Ultimi ritocchi

Utilizzando JSF e Richfaces ho avuto molte difficoltà a capire come poter ricavare, da un Bean, il percorso assoluto per poter salvare le immagini caricate. Riporto il frammento di codice che ho utilizzato e grazie a cui ho risolto il problema:

FacesContext context = FacesContext.getCurrentInstance();
ServletContext servletContext = (ServletContext)context.getExternalContext().getContext();
String path = servletContext.getRealPath("/img/products/");

"/img/products/" è il percorso relativo alla root della mia web application. Attenzione alla barra finale. Se volete concatenare il nome dell'immagine che verrà salvata, dovrete aggiungere  un'altra barra "/nomeImg.jpg", perchè in "path" la barra finale non c'è.

martedì 1 febbraio 2011

Fase 6 : Problema con le query JPA

Implementando la sezione relativa alle operazioni CRUD sulle entità mi sono dovuta confrontare con le queries JPA. Non è complicato generare una query utilizzando la sintassi adatta perchè si tratta di un linguaggio molto simile all' sql, ma allo stesso tempo con delle importanti differenze che ho dovuto imparare.
Riporto alcuni esempi di queries che ho utilizzato:

Seleziono i prodotti che possegono l'attributo "deleted" = 0 ordinandoli per data di inserimento. Da notare che Product è l'entità, non la tabella.
entityManager.createQuery("SELECT p FROM Product p WHERE p.deleted = 0 ORDER BY p.inserted").getResultList();

Stessa query di prima, ma seleziono solo i primi 10 elementi.
entityManager.createQuery("SELECT p FROM Product p WHERE p.deleted = 0 ORDER BY p.inserted DESC LIMIT 0,10").getResultList();

Posso selezionare anche un solo attributo (in questo caso itemsNum).
entityManager.createQuery("SELECT p.itemsNum FROM Product p WHERE p.productCode = 333").getSingleResult();

Posso fare JOIN tra due entità solo se esiste una relazione tra di esse. In questo caso setto "orderShop" nella query attraverso il metodo "setParameter".
Query q = entityManager.createQuery("SELECT p FROM Product p JOIN p.orderShopList o WHERE o = :orderShop ORDER BY p.inserted");
q.setParameter("orderShop", new OrderShop(orderId));
obj = q.getResultList();


Per salvare un oggetto nel DB non devo far altro che richiamare il metodo "persist" passandogli l'oggetto( ma solo se si tratta di un'entità).
entityManager.persist(product);
Fatto ciò, per vedere il nuovo id assegnato a product, non devo far altro che scrivere product.getProductCode();

Per aggiornare un oggetto.
Product p = em.find(Product.class, productCode);
p.setDeleted(false);