Rev 28 | Rev 31 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
package org.tela_botanica.client.image;import java.util.HashMap;import java.util.Iterator;import org.tela_botanica.client.interfaces.Rafraichissable;import org.tela_botanica.client.modeles.ImageAsynchroneDAO;import org.tela_botanica.client.modeles.ImageCarnet;import org.tela_botanica.client.modeles.ImageUploaderAsynchroneDAO;import org.tela_botanica.client.modeles.ListeImageCarnet;import org.tela_botanica.client.modeles.ListeImageAsynchroneDAO;import org.tela_botanica.client.modeles.MotsClesAsynchroneDAO;import com.google.gwt.json.client.JSONArray;import com.google.gwt.json.client.JSONObject;import com.gwtext.client.data.ArrayReader;import com.gwtext.client.data.FieldDef;import com.gwtext.client.data.IntegerFieldDef;import com.gwtext.client.data.MemoryProxy;import com.gwtext.client.data.Node;import com.gwtext.client.data.NodeTraversalCallback;import com.gwtext.client.data.RecordDef;import com.gwtext.client.data.Store;import com.gwtext.client.data.StringFieldDef;import com.gwtext.client.data.Tree;import com.gwtext.client.widgets.tree.TreeNode;/*** Modèle d'accès aux données pour les images.* C'est un singleton* @author aurelien**/public class ImageModele implements Rafraichissable {private static boolean estInstancie = false ;private ImageMediateur iMediateur = null ;private ListeImageCarnet cacheImage = new ListeImageCarnet(0) ;private HashMap motsCles = new HashMap(0) ;private Store st = null ;private com.gwtext.client.data.Tree arbreMotsCles = new Tree() ;static ImageModele Instance(ImageMediateur im){if(!estInstancie){return new ImageModele(im);}else{return null ;}}private ImageModele(ImageMediateur im) {iMediateur = im ;}public ImageMediateur getIMediateur(){return iMediateur ;}/*** Appelle le DAO asynchrone pour obtenir la liste des images* @param r le rafraichissable auxquel on enverra les données*/public void obtenirPhotoGalerie(Rafraichissable r){ListeImageAsynchroneDAO liaDAO = new ListeImageAsynchroneDAO();liaDAO.ObtenirListeImages(this);}/*** Appelle le DAO d'upload qui va choisir la methode d'upload adaptée* et lancer l'interface appropriée*/public void uploaderImages(){ImageUploaderAsynchroneDAO IuADaO = new ImageUploaderAsynchroneDAO() ;IuADaO.setIMediateur(getIMediateur());IuADaO.choisirMethodeUpload() ;}/*** Met à jour la liste des images à partir d'un objet* @param o la nouvelle liste d'image*/public void rafraichirListeImage(Object o){cacheImage = (ListeImageCarnet)o ;}/*** Met à jour l'arbre des mots clés à partir d'un objet* @param o le nouvel arbre de mots clés*/public void rafraichirArbreMotsCles(Object o){arbreMotsCles = (com.gwtext.client.data.Tree)o ;}/*** Met à jour la table de correspondance mots clés / ids* à partir d'un objet* @param o la nouvelle table des mots clés*/public void rafraichirMotsCles(Object o){motsCles = (HashMap)o ;}/*** Va chercher les métadonnées associées à une image dans la liste* des images chargée dans le modèle* @param r le rafraichissable auquel on enverra les informations* @param id l'identifiant de l'image*/public void obtenirMetadonnees(Rafraichissable r, String id){ImageCarnet im = (ImageCarnet)cacheImage.get(id) ;Object meta[] = new Object[3] ;meta[0] = im.getMetadonnesExif() ;meta[1] = im.getMetadonnesIptc() ;meta[2] = im.getInfoGenerales() ;r.rafraichir(meta,false) ;}/*** Va chercher les mots clés associés à une image dans la liste* des images chargée dans le modèle* @param r le rafraichissable auquel on enverra les informations* @param id l'identifiant de l'image*/public void obtenirMotsClesId(Rafraichissable r, String id){ImageCarnet im = (ImageCarnet)cacheImage.get(id) ;String motsClesId = im.getMotsCles() ;String[] motsClesIdTab = motsClesId.split(",") ;r.rafraichir(motsClesIdTab, false) ;}/*** Met à jour la liste des images en local et appelle le DAO de mise* à jour pour les commentaires et la date des images selectionnées* @param commentaires le commentaire à appliquer* @param date la date à appliquer* @param ids les identifiants des images selectionnées*/public void mettreAJourCacheImage(String commentaires, String date, String ids[]){for (int i = 0; i < ids.length; i++){String key = ids[i] ;ImageCarnet ic = (ImageCarnet)cacheImage.get(key) ;ic.miseAJourInfoGenerales(commentaires, date) ;mettreAjourBaseDeDonneesImageCarnet(ic) ;}}/*** Ajoute un nouveau mot clés à la liste des mots clés locale* @param text le mot clé* @param id l'identifiant du mot clé*/public void mettreAjourMotsClesId(String text, String id){motsCles.put(id, text) ;}/*** Appelle le DAO chargé de mettre à jour la base de données avec* les toutes les informations des images modifiées par l'utilisateur*/public void mettreAJourBaseDeDonneesListeImageCarnet(){ListeImageAsynchroneDAO liDaO = new ListeImageAsynchroneDAO();liDaO.setIMediateur(iMediateur);liDaO.SynchroniserBaseDeDonnees(cacheImage);}/*** Appelle le DAO chargé de mettre à jour la base de données avec* les toutes les informations d'une image donnée* @param ic l'image à synchroniser avec la base*/public void mettreAjourBaseDeDonneesImageCarnet(ImageCarnet ic){ImageAsynchroneDAO iaDaO = new ImageAsynchroneDAO();iaDaO.setIMediateur(iMediateur);iaDaO.SynchroniserBaseDeDonnees(ic) ;}/*** Supprime les images données du cache local et appelle le DAO* qui les supprime de la base de données* @param ids les identifiants des images selectionnées*/public void supprimerImages(String[] ids){String rids[] = new String[ids.length] ;ListeImageAsynchroneDAO liDao = new ListeImageAsynchroneDAO() ;liDao.setIMediateur(iMediateur);for (int i = 0; i < ids.length; i++){String key = ids[i] ;ImageCarnet ic = (ImageCarnet)cacheImage.get(key) ;rids[i] = ic.getId() ;}if(rids.length != 0){liDao.supprimerBaseDeDonnees(rids);}}/*** Met à jour les données locales suivant le type des nouvelles données* et appelle le médiateur pour le notifier de la mise à jour*/public void rafraichir(Object nouvelleDonnees, boolean repandreRafraichissement){if(nouvelleDonnees instanceof ListeImageCarnet){ListeImageCarnet data = (ListeImageCarnet) nouvelleDonnees ;Object[][] photoData = new Object[data.size()][7];int i = 0 ;for (Iterator it = data.keySet().iterator(); it.hasNext();){ImageCarnet im = (ImageCarnet) data.get(it.next());photoData[i][0] = im.getOrdre() ;photoData[i][1] = im.getDate() ;photoData[i][2] = im.getIptcCity() ;photoData[i][3] = im.getMake()+" "+im.getModel() ;photoData[i][4] = im.getSUrl() ;photoData[i][5] = im.getMUrl() ;photoData[i][6] = im.getUrl() ;i++ ;}// creation du storeFieldDef defNumImage = new IntegerFieldDef("num_image");FieldDef defDatImage = new StringFieldDef("dat_image");FieldDef defLieImage = new StringFieldDef("lie_image");FieldDef defAppImage = new StringFieldDef("app_image");FieldDef defUrlImageS = new StringFieldDef("url_image_S");FieldDef defUrlImageM = new StringFieldDef("url_image_M");FieldDef defUrlImage = new StringFieldDef("url_image");FieldDef[] defTab = {defNumImage,defDatImage,defLieImage,defAppImage,defUrlImageS,defUrlImageM,defUrlImage};RecordDef rd = new RecordDef(defTab) ;final MemoryProxy dataProxy = new MemoryProxy(photoData);final ArrayReader reader = new ArrayReader(rd);final Store photoStore = new Store(dataProxy, reader);rafraichirListeImage(nouvelleDonnees);st = photoStore ;if(repandreRafraichissement){getIMediateur().synchroniserDonneesZoomListeGalerie(st, this) ;}}if(nouvelleDonnees instanceof JSONArray){JSONArray reponse = (JSONArray)nouvelleDonnees ;final int taillemax = reponse.size();if(taillemax == 0){TreeNode root = new TreeNode() ;root.setId("racine") ;root.setText("Tags") ;root.setIcon("tela.png") ;String[] usObj = {"Tags","racine"} ;root.setUserObject(usObj) ;arbreMotsCles.setRootNode(root) ;}for (int j = 0; j < taillemax ; j++){if(reponse.get(j).isObject() != null){JSONObject noeud = (JSONObject)reponse.get(j) ;String id_noeud = noeud.get("cmc_id_mot_cle_utilisateur").isString().stringValue() ;String mot_cle = noeud.get("cmc_mot_cle").isString().stringValue() ;String parent = noeud.get("cmc_id_parent").isString().stringValue() ;String[] usObj = {mot_cle, id_noeud} ;if(id_noeud.equals("racine")){TreeNode root = new TreeNode() ;root.setId(id_noeud) ;root.setText(mot_cle) ;root.setIcon("tela.png") ;root.setUserObject(usObj) ;arbreMotsCles.setRootNode(root) ;}else{TreeNode node = new TreeNode() ;node.setId(id_noeud) ;node.setText(mot_cle) ;node.setChecked(false) ;Node parentNode = arbreMotsCles.getNodeById(parent) ;node.setIcon("tela.png") ;node.setUserObject(usObj) ;parentNode.appendChild(node) ;}}}rafraichirArbreMotsCles(arbreMotsCles) ;getIMediateur().getMetadonneesIptcExif().getPanneauMotsCles().rafraichir(arbreMotsCles, true) ;}}/*** Affiche les paires / valeur de tous les mots clés stockés*/public void afficherMotsCles(){for(Iterator it = motsCles.keySet().iterator() ; it.hasNext() ;){String key = (String)it.next() ;String valeur = (String)motsCles.get(key) ;System.out.println("clé : "+key+" valeur : "+valeur);}}/*** Met à jour les mots clés associés à une image et appelle le DAO pour synchroniser la base de données* @param ids les identifiants des images selectionnées* @param motsClesEnCours les mots clés à appliquer aux images* @param arbreMC l'arbre de mots clés en cours*/public void mettreAjourMotsCles(String[] ids, String motsClesEnCours, com.gwtext.client.data.Tree arbreMC){for (int i = 0; i < ids.length; i++){if(cacheImage.containsKey(ids[i])){ImageCarnet ic = (ImageCarnet)cacheImage.get(ids[i]) ;ic.mettreAjourMotsCles(motsClesEnCours) ;ImageAsynchroneDAO imgDao = new ImageAsynchroneDAO() ;imgDao.setIMediateur(getIMediateur()) ;imgDao.SynchroniserMotsClesImageBaseDeDonnees(ic) ;}}rafraichirArbreMotsCles(arbreMC) ;}/*** Appelle le DAO des mots clés pour obtenir l'arbre complet stocké dans la base de données*/public void initialiserArbreMotsCles(){MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;MCDao.setIMediateur(getIMediateur()) ;MCDao.obtenirListeMotsCles(this) ;}/*** Envoie l'arbre des mots clés stocké localement à l'élément rafrachissable donné, qui le demande* @param r le rafraichissable demandeur de l'arbre*/public void obtenirArbreMotCle(Rafraichissable r){r.rafraichir(arbreMotsCles, false) ;}/*** Ajoute un mot clé à l'arbre des mots clés local et appelle le DAO qui fait la mise* à jour de l'arbre des mots clés dans la base* @param n le nouveau noeud contenant le mot clé* @param arbreMC l'arbre des mots cles en cours*/public void ajouterMotCleDansArbre(TreeNode n, com.gwtext.client.data.Tree arbreMC){MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;MCDao.setIMediateur(getIMediateur()) ;String[] usObj = (String[])n.getUserObject() ;String motCle = usObj[0] ;String id = usObj[1] ;String parentId = "" ;if(!id.equals("racine")){String[] parentUsObj = (String[])n.getParentNode().getUserObject() ;parentId = parentUsObj[1] ;}else{parentId = "racine" ;}rafraichirArbreMotsCles(arbreMC) ;String nouveauMotCle = "&motcle="+motCle+"&id="+id+"&parent="+parentId ;MCDao.ajouterBaseDeDonnees(nouveauMotCle) ;}/*** Supprime un noeud de l'arbre des mots clés et appelle le DAO qui va supprimer* les mots clés associés dans la base* @param n le noeud à supprimer* @param arbreMC l'arbre des mots clés en cours*/public void supprimerMotCleDansArbre(TreeNode n, Tree arbreMC){MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;MCDao.setIMediateur(getIMediateur()) ;String[] usObj = (String[])n.getUserObject() ;String motCle = usObj[0] ;String id = usObj[1] ;String motCleASupprimer = id ;MCDao.supprimerBaseDeDonnees(id) ;}/*** Modifie le noeud donné dans l'arbre des mots clés en cours et appelle le DAO* qui synchronise la modification dans la base de données* @param n le noeud modifié* @param arbreMC l'arbre des mots clés en cours*/public void modifierMotCleDansArbre(TreeNode n, Tree arbreMC){MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;MCDao.setIMediateur(getIMediateur()) ;String[] usObj = (String[])n.getUserObject() ;String motCle = usObj[0] ;String id = usObj[1] ;String parentId = "" ;if(!id.equals("racine")){String[] parentUsObj = (String[])n.getParentNode().getUserObject() ;parentId = parentUsObj[1] ;}else{parentId = "racine" ;}rafraichirArbreMotsCles(arbreMC) ;String motCleModifie = "&motcle="+motCle+"&id="+id+"&parent="+parentId ;MCDao.modifierBaseDeDonnees(motCleModifie) ;}/*** Deplace un noeud dans l'arbre des mots cles et appelle le DAO qui reorganise l'arbre* dans la base de donnees suivant le changement* @param n le noeud deplace (et son sous arbre associe)* @param arbreMC l'arbre des mots cles en cours*/public void deplacerMotCleDansArbre(TreeNode n, Tree arbreMC){MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;MCDao.setIMediateur(getIMediateur()) ;String[] usObj = (String[])n.getUserObject() ;String motCle = usObj[0] ;String id = usObj[1] ;String parentId = "" ;if(!id.equals("racine")){String[] parentUsObj = (String[])n.getParentNode().getUserObject() ;parentId = parentUsObj[1] ;}else{parentId = "racine" ;}rafraichirArbreMotsCles(arbreMC) ;String motCleModifie = "&motcle="+motCle+"&id="+id+"&parent="+parentId ;MCDao.deplacerBaseDeDonnees(motCleModifie) ;}}