Réseau ACOM
ACOM
  05 Sept. 2010
session : visiteur
 
Contenu du Post
Opérateur :
visiteur
Retour    
Titre MSL-POJO Titulaire post jeanpaul
Date création 26/12/08 07:16 Date modif 27/12/08 00:28

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 :

 img

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 :

  • Le premier et le plus utilisé consiste à placer dans un vecteur de vecteurs (2 dimensions) les attributs de n'importe quels objets de nos composants. Des méthodes dans la classe ModeleUCM2.java permettent de placer/récupérer des objets dans/de ce conteneur UCM. Les noms de ces méthodes et leurs codes sont respectivement :

/****************************
 * 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.

  • Le second sera très utilisé dans le cas où nous voulons mettre en cache ces objets du conteneur UCM. Les éléments en cache seront identifiés par un système de repérage par des ID extrait des objets du conteneur eux-mêmes.

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 ...