1. Premier aperçu par la pratique
Nous continuons par la suite de l'exemple du premier aperçu par la pratique de la présentation précédente. Montrons partiellement la vue de la fenêtre du projet sous Eclipse nommé projetMSLPOJO2 :

Petit remarque sur la structure du projet sous Eclipse :
Nous devons importer déjà dans le projet deux package de XStream 1.2.2 que l'on peut télécharger gratuitement chez http: //xstream.codehaus.org/. Ces deux bibliothèques nous seront utiles ultérieurement même si pour le moment on ne va pas l'exploiter directement dans les exemples que l'on va traiter.
Nous montrons aussi partiellement une partie de la structure du package de MSL-POJO. A savoir 3 classes et 1 interface très importante du noyau de l'API : ModeleUCM2.java, IXmlModel.java, UtilUCM.java puis Util.java. Seule la première classe ModeleUCM2.java est très importante, car elle implémente des services bas-niveau pour nos classes de modélisation des composants de notre application.
Rappelons alors que dans l'exemple d'application proposé auparavant, nous avons 2 classes de modèle : les classes Membre.java et Post.java que nous présentons ci-dessous les sources et qui parleront d'eux-même par rapport aux autres classes de l'API MSL-POJO :
| import org.agir.msl.ucm.ModeleUCM2; public class Membre extends ModeleUCM2{ private String idMembre; // ID membre private String nom; private String email; private String adresse; private String qualite; // compétence, emploi, etc ... public Membre() {} public Membre( String idMembre, String nom, String email, String adresse, String qualite) { super(); this.idMembre = idMembre; this.nom = nom; this.email = email; this.adresse = adresse; this.qualite = qualite; } public String getIdMembre() { return idMembre; } public void setIdMembre(String idMembre) { this.idMembre = idMembre; } public String getNom() { return nom; } public void setNom(String nom) { this.nom = nom; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAdresse() { return adresse; } public void setAdresse(String adresse) { this.adresse = adresse; } public String getQualite() { return qualite; } public void setQualite(String qualite) { this.qualite = qualite; } public String toString() { return "Membre =>"+ idMembre+":"+nom+":"+email+":"+adresse+":"+qualite; }} |
| import java.util.Date;import java.util.HashMap; import org.agir.msl.ucm.ModeleUCM2; public class Post extends ModeleUCM2{ private String idPost; // ID post private String idMembre; // ID membre propriétaire private Date dateCreer; private Date dateModif; private String titre; private String contenu; // contenu du post (texte, image) private HashMap indexMedia; // liste des médias image dans un Map {nom,chemin fichier} public Post() {} public Post(String idPost, String idMembre, Date dateCreer, Date dateModif, String titre, String contenu, HashMap indexMedia) { super(); this.idPost = idPost; this.idMembre = idMembre; this.dateCreer = dateCreer; this.dateModif = dateModif; this.titre = titre; this.contenu = contenu; this.indexMedia = indexMedia; } public String getIdPost() { return idPost; } public void setIdPost(String idPost) { this.idPost = idPost; } public String getIdMembre() { return idMembre; } public void setIdMembre(String idMembre) { this.idMembre = idMembre; } public Date getDateCreer() { return dateCreer; } public void setDateCreer(Date dateCreer) { this.dateCreer = dateCreer; } public Date getDateModif() { return dateModif; } public void setDateModif(Date dateModif) { this.dateModif = dateModif; } public String getTitre() { return titre; } public void setTitre(String titre) { this.titre = titre; } public String getContenu() { return contenu; } public void setContenu(String contenu) { this.contenu = contenu; } public HashMap getIndexMedia() { return indexMedia; }/** Accès en profondeur attribut conteneur HashMap de l'objet Post */ public void setIndexMedia(HashMap indexMedia) { HashMap newList = new HashMap(); newList.putAll(indexMedia); this.indexMedia = newList; } public void addIndexMedia( String nomMedia, String chemin) { this.indexMedia.put(nomMedia,chemin); } public String getCheminIndexMedia(String nomMedia) { if(this.indexMedia.containsKey(nomMedia)) return this.indexMedia.get(nomMedia).toString(); else return null; } public HashMap removeIndexMedia(String nomMedia) { if(null != this.indexMedia.remove(nomMedia)) { return this.indexMedia; } else return null; } public String toString() { return "Post =>"+ idPost+":"+idMembre+":"+dateCreer+":"+dateModif+":"+titre+":"+ contenu+":"+indexMedia; }} |
2. Le conteneur universel UCM.
Nous avons conçu cette notion de conteneur UCM dans le but d'uniformiser par rapport à l'API MLS-POJO la vision des attributs d'un objet quelconque. Nous utilisons pour cela alors les conteneurs d'objets de Java SE dont les qualités étaient de pouvoir stocker n'importe quels objets du moment qu'on puisse définir leurs classes de création.
Dès maintenant nous annonçons qu'il existe de type de conteneur UCM :
| /**************************** * UCM - Première forme ****************************/ /** * Placer les attributs de cet objet dans un Vector et le renvoie * @return type Vector */ public Vector objectToVector() { Vector v = new Vector(); try { BeanInfo model = Introspector.getBeanInfo(this.getClass()); Field[] champ = this.getClass().getDeclaredFields(); PropertyDescriptor[] attrib = model.getPropertyDescriptors(); for(int i = 0; i < champ.length; i++) { champ[i].setAccessible(true); for(int j = 0; j < attrib.length; j++) { if(0 == champ[i].getName().compareTo(attrib[j].getName())) { Method method = attrib[j].getReadMethod(); v.add(method.invoke(this,null)); break; } } } return v; } catch (Exception e) { return null; } }/** * Renvoyer l'objet stocké dans un vector passé en paramètre s'il est conforme * aux spécification UCM du composant * @param v * @return Objet modèle */ public Object vectorToObject(List v) { try { BeanInfo model = Introspector.getBeanInfo(this.getClass()); Field[] champ = this.getClass().getDeclaredFields(); PropertyDescriptor[] attrib = model.getPropertyDescriptors(); int index = 0; // index champ attribut Iterator it = v.iterator(); while(it.hasNext()) { Object obj = it.next(); champ[index].setAccessible(true); Object arg[] = new Object[1]; arg[0] = obj; for(int i = 0; i < attrib.length; i++) { if(0 == champ[index].getName().compareTo(attrib[i].getName())) { if( null != arg[0] && // modif en heure (type attribut) d'une date Time.class == attrib[i].getPropertyType() && Date.class == arg[0].getClass()) { arg[0] = new Time(((Date)arg[0]).getTime()); } if(null != arg[0] && String.class == arg[0].getClass()) arg[0]=arg[0].toString().trim(); // trim espace Method method = attrib[i].getWriteMethod(); if(null == arg[0] || 0 == arg[0].toString().compareTo("")) arg[0] = UtilUCM.preventNull(attrib[i].getPropertyType()); method.invoke(this,arg); break; } } index++; } return this; } catch (Exception e) { return null; } } |
NB : On utilisera l'Introspection en Java pour généraliser cette opération pour toutes les classes de nos composants.
Dans la classe ModeleUCM2.java, nous avons implémenté aussi des méthodes permettant de mettre dans une structure de données en XML, les attributs de n'importe quels objets de nos composants et vice versa ; c'est-à-dire créer des objets de nos composants à partir d'une structure de données en XML et conforme aux spécifications de l'objet de la classe du composant.
Nous publierons dans la suite de nos présentations la liste des méthodes intéressantes de la classe ModeleUCM2.java.
... à suivre ... |