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
		String invalidXmlPattern = "[^"
317
            + "\\u0009\\u000A\\u000D"
318
            + "\\u0020-\\uD7FF"
319
            + "\\uE000-\\uFFFD"
320
            + "\\u10000-\\u10FFFF"
321
            + "]+";
322
		xml = xml.replaceAll(invalidXmlPattern, " ");
990 aurelien 323
 
324
		//FIXME: pq ça marche pour exif et pas pour iptc ?
965 aurelien 325
		try {
326
			Document d = XMLParser.parse(xml);
989 aurelien 327
			if(d.hasChildNodes()) {
328
				NodeList attributs = d.getFirstChild().getChildNodes();
329
 
330
				int taille = attributs.getLength();
331
				metaIptc = new String[taille][2];
332
 
333
				for(int i = 0; i < taille; i++)  {
334
					if(attributs.item(i) != null) {
335
						XMLParser.removeWhitespace(attributs.item(i));
336
						attributs.item(i).normalize();
337
						metaIptc[i][0] = attributs.item(i).getNodeName();
338
						if(attributs.item(i).hasChildNodes()) {
339
							Node valeur = attributs.item(i).getFirstChild();
340
							if(valeur.getNodeType() == Node.TEXT_NODE) {
341
								metaIptc[i][1] = ((Text)valeur).getData();
342
							} else {
343
								metaIptc[i][1] = "";
344
							}
345
						}
346
					}
347
				}
5 aperonnet 348
			}
965 aurelien 349
 
350
			return metaIptc;
351
		} catch(DOMParseException e) {
352
 
353
		}
354
 
5 aperonnet 355
		return metaIptc;
2 aperonnet 356
	}
5 aperonnet 357
 
2 aperonnet 358
	/**
359
	 * Renvoie un tableau nom / valeur de toutes les metadonnées Exif
5 aperonnet 360
	 *
2 aperonnet 361
	 * @return les métadonnées Exif
362
	 */
363
	public String[][] getMetadonnesExif() {
965 aurelien 364
 
365
		String[][] metaExif = {{},{}};
366
 
367
		String xml = renvoyerValeurCorrecte("meta_exif");
368
 
369
		String invalidXmlPattern = "[^"
370
		                             + "\\u0009\\u000A\\u000D"
371
		                             + "\\u0020-\\uD7FF"
372
		                             + "\\uE000-\\uFFFD"
373
		                             + "\\u10000-\\u10FFFF"
374
		                             + "]+";
375
		xml = xml.replaceAll(invalidXmlPattern, " ");
5 aperonnet 376
 
965 aurelien 377
		try {
378
			Document d = XMLParser.parse(xml);
989 aurelien 379
			if(d.hasChildNodes()) {
380
				NodeList attributs = d.getFirstChild().getChildNodes();
381
 
382
				int taille = attributs.getLength();
383
				metaExif = new String[taille][2];
384
 
385
				for(int i = 0; i < taille; i++)  {
386
					if(attributs.item(i) != null) {
387
						XMLParser.removeWhitespace(attributs.item(i));
388
						attributs.item(i).normalize();
389
						metaExif[i][0] = attributs.item(i).getNodeName();
390
						if(attributs.item(i).hasChildNodes()) {
391
							Node valeur = attributs.item(i).getFirstChild();
392
							if(valeur.getNodeType() == Node.TEXT_NODE) {
393
								metaExif[i][1] = ((Text)valeur).getData();
394
							} else {
395
								metaExif[i][1] = "";
396
							}
397
						}
398
					}
399
				}
400
			}
965 aurelien 401
 
989 aurelien 402
			return metaExif;
965 aurelien 403
		} catch(DOMParseException e) {
404
 
405
		}
406
 
5 aperonnet 407
		return metaExif;
408
 
2 aperonnet 409
	}
5 aperonnet 410
 
2 aperonnet 411
	/**
412
	 * Renvoie un tableau nom / valeur contenant les infos générales
5 aperonnet 413
	 *
2 aperonnet 414
	 * @return les infos générales
415
	 */
416
	public String[][] getInfoGenerales() {
5 aperonnet 417
 
418
		String[][] metaGen = new String[2][2];
419
 
965 aurelien 420
		metaGen[0][0] = "commentaire";
421
		metaGen[0][1] = this.renvoyerValeurCorrecte("commentaire");
5 aperonnet 422
 
965 aurelien 423
		metaGen[1][0] = "date_prise_de_vue";
424
		metaGen[1][1] = this.renvoyerValeurCorrecte("date_prise_de_vue");
5 aperonnet 425
 
426
		return metaGen;
2 aperonnet 427
	}
5 aperonnet 428
 
2 aperonnet 429
	/**
430
	 * Renvoie une string contenant les mots clés séparés par des ','
5 aperonnet 431
	 *
2 aperonnet 432
	 * @return les mots clés
433
	 */
434
	public String getMotsCles() {
5 aperonnet 435
 
965 aurelien 436
		return renvoyerValeurCorrecte("mots_cles");
2 aperonnet 437
	}
5 aperonnet 438
 
2 aperonnet 439
	/**
440
	 * Met à jour le commenentaire et la date
5 aperonnet 441
	 *
442
	 * @param commentaires
443
	 *            le nouveau commentaire
444
	 * @param date
445
	 *            la nouvelle date
2 aperonnet 446
	 */
5 aperonnet 447
	public void miseAJourInfoGenerales(String commentaires, String date,
448
			String note) {
965 aurelien 449
		put("commentaire", commentaires);
450
		put("note_qualite", note);
451
		put("date_prise_de_vue", date);
2 aperonnet 452
	}
5 aperonnet 453
 
2 aperonnet 454
	/**
455
	 * Met à jour les mots clés
5 aperonnet 456
	 *
457
	 * @param motsClesEnCours
458
	 *            la liste de mots clés séparés par des ','
2 aperonnet 459
	 */
460
	public void mettreAjourMotsCles(String motsClesEnCours) {
5 aperonnet 461
 
965 aurelien 462
		put("mots_cles", motsClesEnCours);
5 aperonnet 463
 
2 aperonnet 464
	}
211 aurelien 465
 
399 aurelien 466
	public void mettreAjourObsAssociees(String idsObsAssociees) {
965 aurelien 467
		put("id_observation", idsObsAssociees);
399 aurelien 468
	}
469
 
211 aurelien 470
	/**
471
	 * Accesseur pour le nom original
472
	 *
473
	 * @return le nom orginal de l'image
474
	 */
475
	public String getNomOriginal() {
965 aurelien 476
		return renvoyerValeurCorrecte("nom_original");
211 aurelien 477
	}
399 aurelien 478
 
479
	public String getIdsObsAssociees() {
633 aurelien 480
 
965 aurelien 481
		String observationsAssociees = renvoyerValeurCorrecte("id_observation");
633 aurelien 482
		observationsAssociees = observationsAssociees.replaceAll("null", "");
483
 
484
		return observationsAssociees;
399 aurelien 485
	}
5 aperonnet 486
 
2 aperonnet 487
}