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