Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
989 aurelien 1
package org.tela_botanica.client.modeles.objets;
2 aperonnet 2
 
3
import java.util.HashMap;
4
import java.util.Iterator;
5
import java.util.Set;
6
 
997 aurelien 7
import org.tela_botanica.client.i18n.VocabulaireMetadonnees;
1286 aurelien 8
import org.tela_botanica.client.util.Util;
997 aurelien 9
 
2 aperonnet 10
import com.google.gwt.json.client.JSONObject;
965 aurelien 11
import com.google.gwt.xml.client.Document;
989 aurelien 12
import com.google.gwt.xml.client.Node;
965 aurelien 13
import com.google.gwt.xml.client.NodeList;
989 aurelien 14
import com.google.gwt.xml.client.Text;
965 aurelien 15
import com.google.gwt.xml.client.XMLParser;
16
import com.google.gwt.xml.client.impl.DOMParseException;
5 aperonnet 17
 
2 aperonnet 18
/**
19
 *
5 aperonnet 20
 * Classe representant une image du carnet, elle ne contient pas d'image à
21
 * proprement parler mais plutôt les informations associées ainsi que l'url
22
 * distante. C'est une table de hachage qui contient des paires propriété/valeur
2 aperonnet 23
 *
24
 */
25
public class ImageCarnet extends HashMap<String, String> {
26
 
27
	/**
28
	 *
29
	 */
30
	private static final long serialVersionUID = -6220175386957259859L;
31
 
32
	/**
33
	 * Constructeur avec un objet JSON
5 aperonnet 34
	 *
2 aperonnet 35
	 * @param image
36
	 */
5 aperonnet 37
	public ImageCarnet(JSONObject image) {
2 aperonnet 38
		// l'objet JSON est une table de hachage
5 aperonnet 39
		Set<String> im = image.keySet();
40
 
2 aperonnet 41
		// on la parcourt pour chaque clé
42
		for (Iterator<String> iterator = im.iterator(); iterator.hasNext();) {
5 aperonnet 43
 
2 aperonnet 44
			// si elle est associée à une valeur, on l'ajoute
45
			String key = iterator.next();
1286 aurelien 46
			if (Util.jsonNonNull(image, key)) {
5 aperonnet 47
				String valeur = image.get(key).isString().stringValue();
48
				this.put(key, valeur);
49
			} else {
2 aperonnet 50
				// sinon on ajoute la clé avec une valeur vide
5 aperonnet 51
				String valeur = " ";
52
				this.put(key, valeur);
2 aperonnet 53
			}
5 aperonnet 54
 
2 aperonnet 55
		}
56
 
57
	}
729 aurelien 58
 
59
	public ImageCarnet(String[][] image) {
5 aperonnet 60
 
729 aurelien 61
		for (int i = 0; i < image.length; i++) {
62
			if (image[i][0] != null && image[i][1] != null) {
63
				this.put(image[i][0], image[i][1]);
64
			}
65
		}
66
	}
67
 
2 aperonnet 68
	/**
69
	 * Surcharge de toString qui affiche toutes les propriétés de l'image
70
	 */
5 aperonnet 71
 
72
	public String toString() {
2 aperonnet 73
		String valeur = " ";
5 aperonnet 74
 
75
		for (Iterator<String> iterator = this.keySet().iterator(); iterator
76
				.hasNext();) {
77
 
2 aperonnet 78
			String key = iterator.next();
5 aperonnet 79
			if (this.get(key) != null) {
80
				valeur += "cle : " + key + " valeur :" + this.get(key) + "\n";
2 aperonnet 81
			}
5 aperonnet 82
 
2 aperonnet 83
		}
5 aperonnet 84
 
85
		return valeur;
2 aperonnet 86
	}
5 aperonnet 87
 
2 aperonnet 88
	/**
5 aperonnet 89
	 * Pour éviter que l'on traite des valeurs nulles à l'affichage on passe par
90
	 * cette fonction qui retire les charactères nuls qui font planter
91
	 * l'affichage, il ne faut pas utiliser get directement
92
	 *
2 aperonnet 93
	 * @param cle
94
	 * @return la valeur associée à la clé
95
	 */
5 aperonnet 96
	public String renvoyerValeurCorrecte(String cle) {
97
		if (this.containsKey((cle))) {
98
			String valeur = this.get(cle);
99
			if (valeur.equals("null") || valeur == null) {
100
				return " ";
101
			} else {
102
				char nullChar = '\u0000';
103
				String sNull = "" + nullChar;
104
				valeur = valeur.replaceAll(sNull, "");
105
				return valeur;
2 aperonnet 106
			}
5 aperonnet 107
		} else {
108
			return " ";
2 aperonnet 109
		}
110
	}
111
 
112
	/**
113
	 * Acesseur pour l'id de l'image
5 aperonnet 114
	 *
2 aperonnet 115
	 * @return l'id de l'image
116
	 */
117
	public String getId() {
5 aperonnet 118
 
965 aurelien 119
		return renvoyerValeurCorrecte("id_image");
2 aperonnet 120
	}
5 aperonnet 121
 
2 aperonnet 122
	/**
123
	 * Acesseur pour le numero d'ordre de l'image
5 aperonnet 124
	 *
2 aperonnet 125
	 * @return l'ordre de l'image
126
	 */
127
	public String getOrdre() {
5 aperonnet 128
 
965 aurelien 129
		return renvoyerValeurCorrecte("ordre");
2 aperonnet 130
	}
5 aperonnet 131
 
2 aperonnet 132
	/**
133
	 * Base de l'url serveur pour les images
5 aperonnet 134
	 *
2 aperonnet 135
	 * @return url racine pour les images
136
	 */
729 aurelien 137
	public String getVraieBaseUrl() {
100 jpm 138
		return Configuration.getImageBaseUrl() ;
2 aperonnet 139
	}
729 aurelien 140
 
2 aperonnet 141
	/**
729 aurelien 142
	 * Base de l'url serveur pour les images
5 aperonnet 143
	 *
729 aurelien 144
	 * @return url racine pour les images
2 aperonnet 145
	 */
729 aurelien 146
	public String getBaseUrlRedirect() {
147
		return Configuration.getImageRedirectUrl() ;
148
	}
149
 
150
	public String getIdAvecPadding() {
151
 
5 aperonnet 152
		String id = getId();
153
 
154
		int maxZeros = 9 - id.length();
155
 
156
		for (int i = 0; i < maxZeros; i++) {
157
			id = "0" + id;
2 aperonnet 158
		}
729 aurelien 159
 
160
		return id;
161
	}
162
 
163
	private String getUrlFormat(String format) {
164
 
165
		String urlImage = "";
166
 
167
		if(Configuration.utiliseRedirectionImages()) {
168
 
169
			String identifiantRedirect = getIdAvecPadding()+format;
170
			urlImage = getBaseUrlRedirect()+identifiantRedirect;
171
		} else {
172
			urlImage = getVraieUrlFormat(format);
173
		}
5 aperonnet 174
 
729 aurelien 175
		return urlImage;
176
	}
177
 
178
	/**
179
	 * Renvoie le nom de base du fichier image et ses sous dossier
180
	 *
181
	 * @return le nom de base du fichier de type (XXX_XXX_XXX), et ses sous
182
	 *         dossier
183
	 */
989 aurelien 184
	public String[] getVraiCheminBaseFichier() {
729 aurelien 185
 
186
		String id = getIdAvecPadding();
187
 
5 aperonnet 188
		String dossierNv1 = id.substring(0, 3);
189
		String dossierNv2 = id.substring(3, 6);
190
		String fichierNv = id.substring(6, 9);
191
 
192
		String nomFichier = dossierNv1 + "_" + dossierNv2 + "_" + fichierNv;
193
 
194
		String[] infosFichier = { nomFichier, dossierNv1, dossierNv2 };
157 aurelien 195
 
5 aperonnet 196
		return infosFichier;
2 aperonnet 197
	}
596 aurelien 198
 
729 aurelien 199
	private String getVraieUrlFormat(String format) {
633 aurelien 200
 
989 aurelien 201
		String[] infosFichier = getVraiCheminBaseFichier();
633 aurelien 202
 
729 aurelien 203
		return getVraieBaseUrl() + infosFichier[1] + "/" + infosFichier[2] + "/"+format+"/"
633 aurelien 204
				+ infosFichier[0] + "_"+format+".jpg";
205
	}
206
 
596 aurelien 207
	/**
208
	 * Renvoie le chemin et nom du fichier format original
209
	 *
210
	 * @return le chemin du fichier grand original
211
	 */
633 aurelien 212
	public String getUrlFormatOriginal() {
2 aperonnet 213
 
633 aurelien 214
		return getUrlFormat(Configuration.getFormatOriginal());
596 aurelien 215
	}
216
 
2 aperonnet 217
	/**
218
	 * Renvoie le chemin et nom du fichier grand format
5 aperonnet 219
	 *
2 aperonnet 220
	 * @return le chemin du fichier grand format
221
	 */
633 aurelien 222
	public String getUrlFormatZoom() {
5 aperonnet 223
 
633 aurelien 224
		return getUrlFormat(Configuration.getFormatZoom());
2 aperonnet 225
	}
5 aperonnet 226
 
2 aperonnet 227
	/**
228
	 * Renvoie le chemin et nom du fichier petit format
5 aperonnet 229
	 *
2 aperonnet 230
	 * @return le chemin du fichier petit format
231
	 */
633 aurelien 232
	public String getUrlFormatGalerie() {
5 aperonnet 233
 
633 aurelien 234
		return getUrlFormat(Configuration.getFormatGalerie());
2 aperonnet 235
	}
5 aperonnet 236
 
2 aperonnet 237
	/**
238
	 * Renvoie le chemin et nom du fichier moyen format
5 aperonnet 239
	 *
2 aperonnet 240
	 * @return le chemin du fichier moyen format
241
	 */
633 aurelien 242
	public String getUrlFormatListe() {
5 aperonnet 243
 
633 aurelien 244
		return getUrlFormat(Configuration.getFormatListe());
2 aperonnet 245
	}
5 aperonnet 246
 
2 aperonnet 247
	/**
248
	 * Renvoie la taille de l'image
5 aperonnet 249
	 *
250
	 * @return un tableau de deux string contenant la hauteur puis la largeur
2 aperonnet 251
	 */
5 aperonnet 252
	public String[] getTailleImage() {
965 aurelien 253
		String[] XY = { renvoyerValeurCorrecte("hauteur"),
254
				renvoyerValeurCorrecte("largeur") };
5 aperonnet 255
		return XY;
2 aperonnet 256
	}
5 aperonnet 257
 
258
	public String[] getNote() {
965 aurelien 259
		String[] note = { renvoyerValeurCorrecte("note_qualite") };
5 aperonnet 260
		return note;
2 aperonnet 261
	}
5 aperonnet 262
 
263
	/**
2 aperonnet 264
	 * Renvoie la date exif associée à l'image
5 aperonnet 265
	 *
2 aperonnet 266
	 * @return la date associée à l'image
267
	 */
268
	public String getDate() {
5 aperonnet 269
 
965 aurelien 270
		if(renvoyerValeurCorrecte("date_prise_de_vue").equals("00/00/0000"))
63 jpm 271
		{
272
			return "" ;
273
		}
965 aurelien 274
		return renvoyerValeurCorrecte("date_prise_de_vue");
2 aperonnet 275
	}
276
 
277
	/**
278
	 * Renvoie la ville associée à l'image
5 aperonnet 279
	 *
2 aperonnet 280
	 * @return la ville iptc
281
	 */
282
	public Object getIptcCity() {
5 aperonnet 283
 
965 aurelien 284
		return renvoyerValeurCorrecte("");
2 aperonnet 285
	}
286
 
287
	/**
288
	 * Renvoie le fabricant de l'appareil
5 aperonnet 289
	 *
2 aperonnet 290
	 * @return le fabricant
291
	 */
989 aurelien 292
	public String getFabriquantAppareil() {
5 aperonnet 293
 
965 aurelien 294
		return renvoyerValeurCorrecte("appareil_fabricant");
2 aperonnet 295
	}
296
 
297
	/**
298
	 * Renvoie le modele de l'appareil
5 aperonnet 299
	 *
2 aperonnet 300
	 * @return le modele
301
	 */
989 aurelien 302
	public String getModeleAppareil() {
5 aperonnet 303
 
965 aurelien 304
		return renvoyerValeurCorrecte("appareil_modele");
2 aperonnet 305
	}
5 aperonnet 306
 
2 aperonnet 307
	/**
308
	 * Renvoie un tableau nom / valeur de toutes les metadonnées Iptc
5 aperonnet 309
	 *
2 aperonnet 310
	 * @return les métadonnées iptc
311
	 */
997 aurelien 312
	public String[][] getMetadonnesIptc() {
991 aurelien 313
		return getMetadonneesXml("meta_iptc");
2 aperonnet 314
	}
5 aperonnet 315
 
2 aperonnet 316
	/**
317
	 * Renvoie un tableau nom / valeur de toutes les metadonnées Exif
5 aperonnet 318
	 *
2 aperonnet 319
	 * @return les métadonnées Exif
320
	 */
321
	public String[][] getMetadonnesExif() {
991 aurelien 322
		return getMetadonneesXml("meta_exif");
323
	}
324
 
325
	private String[][] getMetadonneesXml(String type) {
965 aurelien 326
 
991 aurelien 327
		String[][] metadonnees = {{},{}};
965 aurelien 328
 
991 aurelien 329
		String xml = renvoyerValeurCorrecte(type);
965 aurelien 330
 
331
		String invalidXmlPattern = "[^"
332
		                             + "\\u0009\\u000A\\u000D"
333
		                             + "\\u0020-\\uD7FF"
334
		                             + "\\uE000-\\uFFFD"
335
		                             + "\\u10000-\\u10FFFF"
336
		                             + "]+";
337
		xml = xml.replaceAll(invalidXmlPattern, " ");
5 aperonnet 338
 
965 aurelien 339
		try {
340
			Document d = XMLParser.parse(xml);
989 aurelien 341
			if(d.hasChildNodes()) {
342
				NodeList attributs = d.getFirstChild().getChildNodes();
343
 
344
				int taille = attributs.getLength();
991 aurelien 345
				metadonnees = new String[taille][2];
989 aurelien 346
 
347
				for(int i = 0; i < taille; i++)  {
348
					if(attributs.item(i) != null) {
349
						XMLParser.removeWhitespace(attributs.item(i));
350
						attributs.item(i).normalize();
997 aurelien 351
						String nomMetaDonneestraduite = VocabulaireMetadonnees.getTraduction(attributs.item(i).getNodeName());
352
						metadonnees[i][0] = nomMetaDonneestraduite;
989 aurelien 353
						if(attributs.item(i).hasChildNodes()) {
354
							Node valeur = attributs.item(i).getFirstChild();
355
							if(valeur.getNodeType() == Node.TEXT_NODE) {
991 aurelien 356
								metadonnees[i][1] = ((Text)valeur).getData();
989 aurelien 357
							} else {
991 aurelien 358
								metadonnees[i][1] = "";
989 aurelien 359
							}
360
						}
361
					}
362
				}
363
			}
965 aurelien 364
		} catch(DOMParseException e) {
365
 
366
		}
367
 
991 aurelien 368
		return metadonnees;
2 aperonnet 369
	}
5 aperonnet 370
 
2 aperonnet 371
	/**
372
	 * Renvoie un tableau nom / valeur contenant les infos générales
5 aperonnet 373
	 *
2 aperonnet 374
	 * @return les infos générales
375
	 */
376
	public String[][] getInfoGenerales() {
5 aperonnet 377
 
378
		String[][] metaGen = new String[2][2];
379
 
965 aurelien 380
		metaGen[0][0] = "commentaire";
381
		metaGen[0][1] = this.renvoyerValeurCorrecte("commentaire");
5 aperonnet 382
 
965 aurelien 383
		metaGen[1][0] = "date_prise_de_vue";
384
		metaGen[1][1] = this.renvoyerValeurCorrecte("date_prise_de_vue");
5 aperonnet 385
 
386
		return metaGen;
2 aperonnet 387
	}
5 aperonnet 388
 
2 aperonnet 389
	/**
390
	 * Renvoie une string contenant les mots clés séparés par des ','
5 aperonnet 391
	 *
2 aperonnet 392
	 * @return les mots clés
393
	 */
394
	public String getMotsCles() {
5 aperonnet 395
 
965 aurelien 396
		return renvoyerValeurCorrecte("mots_cles");
2 aperonnet 397
	}
5 aperonnet 398
 
2 aperonnet 399
	/**
400
	 * Met à jour le commenentaire et la date
5 aperonnet 401
	 *
402
	 * @param commentaires
403
	 *            le nouveau commentaire
404
	 * @param date
405
	 *            la nouvelle date
2 aperonnet 406
	 */
5 aperonnet 407
	public void miseAJourInfoGenerales(String commentaires, String date,
408
			String note) {
965 aurelien 409
		put("commentaire", commentaires);
410
		put("note_qualite", note);
411
		put("date_prise_de_vue", date);
2 aperonnet 412
	}
5 aperonnet 413
 
2 aperonnet 414
	/**
415
	 * Met à jour les mots clés
5 aperonnet 416
	 *
417
	 * @param motsClesEnCours
418
	 *            la liste de mots clés séparés par des ','
2 aperonnet 419
	 */
420
	public void mettreAjourMotsCles(String motsClesEnCours) {
5 aperonnet 421
 
965 aurelien 422
		put("mots_cles", motsClesEnCours);
5 aperonnet 423
 
2 aperonnet 424
	}
211 aurelien 425
 
399 aurelien 426
	public void mettreAjourObsAssociees(String idsObsAssociees) {
965 aurelien 427
		put("id_observation", idsObsAssociees);
399 aurelien 428
	}
429
 
211 aurelien 430
	/**
431
	 * Accesseur pour le nom original
432
	 *
433
	 * @return le nom orginal de l'image
434
	 */
435
	public String getNomOriginal() {
965 aurelien 436
		return renvoyerValeurCorrecte("nom_original");
211 aurelien 437
	}
399 aurelien 438
 
439
	public String getIdsObsAssociees() {
633 aurelien 440
 
965 aurelien 441
		String observationsAssociees = renvoyerValeurCorrecte("id_observation");
633 aurelien 442
		observationsAssociees = observationsAssociees.replaceAll("null", "");
443
 
444
		return observationsAssociees;
399 aurelien 445
	}
5 aperonnet 446
 
2 aperonnet 447
}