Subversion Repositories eFlore/Applications.cel

Rev

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