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;
}
}