Subversion Repositories eFlore/Applications.cel

Rev

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