Subversion Repositories eFlore/Applications.cel

Rev

Rev 1315 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package org.tela_botanica.client.modeles.objets;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

import org.tela_botanica.client.i18n.VocabulaireMetadonnees;
import org.tela_botanica.client.util.Util;

import com.google.gwt.json.client.JSONObject;
import com.google.gwt.xml.client.Document;
import com.google.gwt.xml.client.Node;
import com.google.gwt.xml.client.NodeList;
import com.google.gwt.xml.client.Text;
import com.google.gwt.xml.client.XMLParser;
import com.google.gwt.xml.client.impl.DOMParseException;

/**
 * 
 * Classe representant une image du carnet, elle ne contient pas d'image à
 * proprement parler mais plutôt les informations associées ainsi que l'url
 * distante. C'est une table de hachage qui contient des paires propriété/valeur
 * 
 */
public class ImageCarnet extends HashMap<String, String> {

        /**
         * 
         */
        private static final long serialVersionUID = -6220175386957259859L;

        /**
         * Constructeur avec un objet JSON
         * 
         * @param image
         */
        public ImageCarnet(JSONObject image) {
                // l'objet JSON est une table de hachage
                Set<String> im = image.keySet();

                // on la parcourt pour chaque clé
                for (Iterator<String> iterator = im.iterator(); iterator.hasNext();) {

                        // si elle est associée à une valeur, on l'ajoute
                        String key = iterator.next();
                        if (Util.jsonNonNull(image, key)) {
                                String valeur = image.get(key).isString().stringValue();
                                this.put(key, valeur);
                        } else {
                                // sinon on ajoute la clé avec une valeur vide
                                String valeur = " ";
                                this.put(key, valeur);
                        }

                }

        }
        
        public ImageCarnet(String[][] image) {

                for (int i = 0; i < image.length; i++) {
                        if (image[i][0] != null && image[i][1] != null) {
                                this.put(image[i][0], image[i][1]);
                        }
                }
        }

        /**
         * Surcharge de toString qui affiche toutes les propriétés de l'image
         */

        @Override
        public String toString() {
                String valeur = " ";

                for (Iterator<String> iterator = this.keySet().iterator(); iterator
                                .hasNext();) {

                        String key = iterator.next();
                        if (this.get(key) != null) {
                                valeur += "cle : " + key + " valeur :" + this.get(key) + "\n";
                        }

                }

                return valeur;
        }

        /**
         * Pour éviter que l'on traite des valeurs nulles à l'affichage on passe par
         * cette fonction qui retire les charactères nuls qui font planter
         * l'affichage, il ne faut pas utiliser get directement
         * 
         * @param cle
         * @return la valeur associée à la clé
         */
        public String renvoyerValeurCorrecte(String cle) {
                if (this.containsKey((cle))) {
                        String valeur = this.get(cle);
                        if (valeur.equals("null") || valeur == null) {
                                return " ";
                        } else {
                                char nullChar = '\u0000';
                                String sNull = "" + nullChar;
                                valeur = valeur.replaceAll(sNull, "");
                                return valeur;
                        }
                } else {
                        return " ";
                }
        }

        /**
         * Acesseur pour l'id de l'image
         * 
         * @return l'id de l'image
         */
        public String getId() {

                return renvoyerValeurCorrecte("id_image");
        }

        /**
         * Acesseur pour le numero d'ordre de l'image
         * 
         * @return l'ordre de l'image
         */
        public String getOrdre() {

                return renvoyerValeurCorrecte("ordre");
        }

        /**
         * Base de l'url serveur pour les images
         * 
         * @return url racine pour les images
         */
        public String getVraieBaseUrl() {
                return Configuration.getImageBaseUrl() ;
        }
        
        /**
         * Base de l'url serveur pour les images
         * 
         * @return url racine pour les images
         */
        public String getBaseUrlRedirect() {
                return Configuration.getImageRedirectUrl() ;
        }
        
        public String getIdAvecPadding() {
                
                String id = getId();

                int maxZeros = 9 - id.length();

                for (int i = 0; i < maxZeros; i++) {
                        id = "0" + id;
                }
                
                return id;
        }
        
        private String getUrlFormat(String format) {
                
                String urlImage = "";
                
                if(Configuration.utiliseRedirectionImages()) {
                
                        String identifiantRedirect = getIdAvecPadding()+format;
                        urlImage = getBaseUrlRedirect()+identifiantRedirect;
                } else {
                        urlImage = getVraieUrlFormat(format);
                }

                return urlImage;
        }

        /**
         * Renvoie le nom de base du fichier image et ses sous dossier
         * 
         * @return le nom de base du fichier de type (XXX_XXX_XXX), et ses sous
         *         dossier
         */
        public String[] getVraiCheminBaseFichier() {
                
                String id = getIdAvecPadding();

                String dossierNv1 = id.substring(0, 3);
                String dossierNv2 = id.substring(3, 6);
                String fichierNv = id.substring(6, 9);

                String nomFichier = dossierNv1 + "_" + dossierNv2 + "_" + fichierNv;

                String[] infosFichier = { nomFichier, dossierNv1, dossierNv2 };
                
                return infosFichier;
        }
        
        private String getVraieUrlFormat(String format) {
                
                String[] infosFichier = getVraiCheminBaseFichier();

                return getVraieBaseUrl() + infosFichier[1] + "/" + infosFichier[2] + "/"+format+"/"
                                + infosFichier[0] + "_"+format+".jpg";
        }
        
        /**
         * Renvoie le chemin et nom du fichier format original
         * 
         * @return le chemin du fichier grand original
         */
        public String getUrlFormatOriginal() {

                return getUrlFormat(Configuration.getFormatOriginal());
        }

        /**
         * Renvoie le chemin et nom du fichier grand format
         * 
         * @return le chemin du fichier grand format
         */
        public String getUrlFormatZoom() {

                return getUrlFormat(Configuration.getFormatZoom());
        }

        /**
         * Renvoie le chemin et nom du fichier petit format
         * 
         * @return le chemin du fichier petit format
         */
        public String getUrlFormatGalerie() {

                return getUrlFormat(Configuration.getFormatGalerie());
        }

        /**
         * Renvoie le chemin et nom du fichier moyen format
         * 
         * @return le chemin du fichier moyen format
         */
        public String getUrlFormatListe() {

                return getUrlFormat(Configuration.getFormatListe());
        }

        /**
         * Renvoie la taille de l'image
         * 
         * @return un tableau de deux string contenant la hauteur puis la largeur
         */
        public String[] getTailleImage() {
                String[] XY = { renvoyerValeurCorrecte("hauteur"),
                                renvoyerValeurCorrecte("largeur") };
                return XY;
        }

        public String[] getNote() {
                String[] note = { renvoyerValeurCorrecte("note_qualite") };
                return note;
        }

        /**
         * Renvoie la date exif associée à l'image
         * 
         * @return la date associée à l'image
         */
        public String getDate() {

                if(renvoyerValeurCorrecte("date_prise_de_vue").equals("00/00/0000"))
                {
                        return "" ;
                }
                return renvoyerValeurCorrecte("date_prise_de_vue");
        }

        /**
         * Renvoie la ville associée à l'image
         * 
         * @return la ville iptc
         */
        public Object getIptcCity() {

                return renvoyerValeurCorrecte("");
        }

        /**
         * Renvoie le fabricant de l'appareil
         * 
         * @return le fabricant
         */
        public String getFabriquantAppareil() {

                return renvoyerValeurCorrecte("appareil_fabricant");
        }

        /**
         * Renvoie le modele de l'appareil
         * 
         * @return le modele
         */
        public String getModeleAppareil() {

                return renvoyerValeurCorrecte("appareil_modele");
        }

        /**
         * Renvoie un tableau nom / valeur de toutes les metadonnées Iptc
         * 
         * @return les métadonnées iptc
         */
        public String[][] getMetadonnesIptc() {         
                return getMetadonneesXml("meta_iptc");
        }

        /**
         * Renvoie un tableau nom / valeur de toutes les metadonnées Exif
         * 
         * @return les métadonnées Exif
         */
        public String[][] getMetadonnesExif() {
                return getMetadonneesXml("meta_exif");
        }
        
        private String[][] getMetadonneesXml(String type) {
                
                String[][] metadonnees = {{},{}};
                
                String xml = renvoyerValeurCorrecte(type);
                
                String invalidXmlPattern = "[^"
                                             + "\\u0009\\u000A\\u000D"
                                             + "\\u0020-\\uD7FF"
                                             + "\\uE000-\\uFFFD"
                                             + "\\u10000-\\u10FFFF"
                                             + "]+";
                xml = xml.replaceAll(invalidXmlPattern, " ");

                try {
                        Document d = XMLParser.parse(xml);
                        if(d.hasChildNodes()) {
                                NodeList attributs = d.getFirstChild().getChildNodes();
                                
                                int taille = attributs.getLength();
                                metadonnees = new String[taille][2];
                                
                                for(int i = 0; i < taille; i++)  {
                                        if(attributs.item(i) != null) {
                                                XMLParser.removeWhitespace(attributs.item(i));
                                                attributs.item(i).normalize();
                                                String nomMetaDonneestraduite = VocabulaireMetadonnees.getTraduction(attributs.item(i).getNodeName());
                                                metadonnees[i][0] = nomMetaDonneestraduite;
                                                if(attributs.item(i).hasChildNodes()) {
                                                        Node valeur = attributs.item(i).getFirstChild();
                                                        if(valeur.getNodeType() == Node.TEXT_NODE) {
                                                                metadonnees[i][1] = ((Text)valeur).getData();
                                                        } else {
                                                                metadonnees[i][1] = "";
                                                        }
                                                }
                                        }
                                }
                        }
                } catch(DOMParseException e) {
                        
                }       
                
                return metadonnees;
        }

        /**
         * Renvoie un tableau nom / valeur contenant les infos générales
         * 
         * @return les infos générales
         */
        public String[][] getInfoGenerales() {

                String[][] metaGen = new String[2][2];

                metaGen[0][0] = "commentaire";
                metaGen[0][1] = this.renvoyerValeurCorrecte("commentaire");

                metaGen[1][0] = "date_prise_de_vue";
                metaGen[1][1] = this.renvoyerValeurCorrecte("date_prise_de_vue");

                return metaGen;
        }

        /**
         * Renvoie une string contenant les mots clés séparés par des ','
         * 
         * @return les mots clés
         */
        public String getMotsCles() {

                return renvoyerValeurCorrecte("mots_cles");
        }

        /**
         * Met à jour le commenentaire et la date
         * 
         * @param commentaires
         *            le nouveau commentaire
         * @param date
         *            la nouvelle date
         */
        public void miseAJourInfoGenerales(String commentaires, String date,
                        String note) {
                put("commentaire", commentaires);
                put("note_qualite", note);
                put("date_prise_de_vue", date);
        }

        /**
         * Met à jour les mots clés
         * 
         * @param motsClesEnCours
         *            la liste de mots clés séparés par des ','
         */
        public void mettreAjourMotsCles(String motsClesEnCours) {

                put("mots_cles", motsClesEnCours);

        }
        
        public void mettreAjourObsAssociees(String idsObsAssociees) {
                put("id_observation", idsObsAssociees);
        }
        
        /**
         * Accesseur pour le nom original
         * 
         * @return le nom orginal de l'image
         */
        public String getNomOriginal() {
                return renvoyerValeurCorrecte("nom_original");
        }
        
        public String getIdsObsAssociees() {
                
                String observationsAssociees = renvoyerValeurCorrecte("id_observation");
                observationsAssociees = observationsAssociees.replaceAll("null", "");
                
                return observationsAssociees;
        }
        
        
        public String[][] obtenirChampsModifiablesImage() {
                String[][] champs = {
                                {"commentaire", renvoyerValeurCorrecte("commentaire")},
                                {"note_qualite", renvoyerValeurCorrecte("note_qualite")},
                                {"date_prise_de_vue",renvoyerValeurCorrecte("date_prise_de_vue")}
                };
                return champs;
        }
}