Subversion Repositories eFlore/Applications.coel

Rev

Rev 875 | Rev 891 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
69 jpm 1
package org.tela_botanica.client.modeles;
2
 
3
import java.io.Serializable;
385 gduche 4
import java.util.Collection;
248 gduche 5
import java.util.HashMap;
193 jp_milcent 6
import java.util.Iterator;
248 gduche 7
import java.util.LinkedList;
306 jp_milcent 8
import java.util.Map;
193 jp_milcent 9
import java.util.Set;
306 jp_milcent 10
import java.util.TreeSet;
69 jpm 11
 
233 jp_milcent 12
import org.tela_botanica.client.util.UtilArray;
13
 
534 gduche 14
import com.extjs.gxt.ui.client.core.FastMap;
69 jpm 15
import com.extjs.gxt.ui.client.data.BaseModelData;
602 jp_milcent 16
import com.google.gwt.core.client.GWT;
385 gduche 17
import com.google.gwt.http.client.URL;
775 jpm 18
import com.google.gwt.json.client.JSONObject;
69 jpm 19
 
193 jp_milcent 20
/**
21
 * @author jpm
22
 *
23
 */
69 jpm 24
public abstract class aDonnee extends BaseModelData implements Serializable {
25
 
26
	private static final long serialVersionUID = 3527760464061629791L;
748 jpm 27
 
789 jpm 28
	public static final String TYPE_AUTRE = "AUTRE";
29
	public static final String TYPE_TOTAL = "TOTAL";
30
	public static final String SEPARATEUR_TYPE_VALEUR = "##";
31
	public static final String SEPARATEUR_VALEURS = ";;";
32
	public static final String SEPARATEUR_DONNEES = "||";
875 jpm 33
	public static final String ETAT_AJOUTE = "A";
883 jpm 34
	public static final Object ETAT_MODIFIE = "M";
789 jpm 35
 
748 jpm 36
	protected abstract String getPrefixe();
37
 
789 jpm 38
	public String getDateModification() {
39
		return (String) renvoyerValeurCorrecte("cmhl_date_modification");
40
	}
41
 
42
	public String getNotes() {
43
		return (String) renvoyerValeurCorrecte("cmhl_notes");
44
	}
45
 
46
	public String getIdModifierPar() {
47
		return (String) renvoyerValeurCorrecte("cmhl_ce_modifier_par");
48
	}
49
 
50
	public String getIdEtat() {
51
		return (String) renvoyerValeurCorrecte("cmhl_ce_etat");
52
	}
53
 
54
	public String getIp() {
55
		return (String) renvoyerValeurCorrecte("cmhl_ip");
56
	}
57
 
775 jpm 58
	protected void initialiserModele(JSONObject jsonObjet) {
59
		// l'objet JSON est une table de hachage
60
		Set<String> im = jsonObjet.keySet();
61
 
62
		// Parcourt pour chaque clé
63
		for (Iterator<String> it = im.iterator(); it.hasNext();) {
64
			// Si elle est associée à une valeur, nous l'ajoutons
65
			String cle = it.next();
66
			if (cle.startsWith(getPrefixe()+"_")) {
67
				// Suppression de l'abréviation du champ. Inutile dans le contexte d'un objet
68
				String cleObjet = cle.replaceFirst("^"+getPrefixe()+"_", "");
69
				// Sinon, nous ajoutons la clé avec une valeur vide
70
				String valeur = "";
71
				if (jsonObjet.get(cle).isString() != null) {
72
					valeur = jsonObjet.get(cle).isString().stringValue();
73
				}
74
				this.set(cleObjet, valeur);
75
			}
76
		}
77
	}
78
 
69 jpm 79
	/**
80
	 * Pour éviter que l'on traite des valeurs nulles à l'affichage on passe par
81
	 * cette fonction qui retire les charactères nuls qui font planter
82
	 * l'affichage, il ne faut pas utiliser get directement
83
	 *
84
	 * @param cle
85
	 * @return la valeur associée à la clé
86
	 */
193 jp_milcent 87
	protected String renvoyerValeurCorrecte(String cle) {
188 jp_milcent 88
		String sortie = "";
69 jpm 89
		if (this.get(cle) != null) {
90
			String valeur = this.get(cle);
188 jp_milcent 91
			if (! valeur.equals("null")) {
69 jpm 92
				char nullChar = '\u0000';
93
				String sNull = "" + nullChar;
94
				valeur = valeur.replaceAll(sNull, "");
188 jp_milcent 95
				sortie =  valeur;
69 jpm 96
			}
97
		}
188 jp_milcent 98
		return sortie;
69 jpm 99
	}
233 jp_milcent 100
 
193 jp_milcent 101
	/**
242 jp_milcent 102
	 * Ajoute un nouvel élément avec son type à une chaine dénormalisée.
103
	 * Champ de type "truk" contenant des valeurs séparées par ";;" qui elle même possèdent un type séparé par "##".
104
	 * Si l'élément existe déjà, il ne sera pas ajouté.
193 jp_milcent 105
	 *
106
	 * @param champ le nom du champ dénormalisé
107
	 * @param type le type de la valeur à ajouter
108
	 * @param valeur la valeur à ajouter
109
	 */
242 jp_milcent 110
	protected void ajouterChaineDenormaliseAvecType(String champ, String type, Object valeur) {
193 jp_milcent 111
		if (valeur instanceof String) {
112
			String chaineExistante = renvoyerValeurCorrecte(champ);
113
			if (chaineExistante.equals("")) {
789 jpm 114
				this.set(champ, type+SEPARATEUR_TYPE_VALEUR+valeur);
193 jp_milcent 115
			} else {
242 jp_milcent 116
				// Si la valeur à ajouter n'est pas déjà présente, nous l'ajoutons
789 jpm 117
				if (!chaineExistante.matches("(^|"+SEPARATEUR_VALEURS+")"+type+SEPARATEUR_TYPE_VALEUR+valeur+"("+SEPARATEUR_VALEURS+"|$)")) {
118
					this.set(champ, chaineExistante+";;"+type+SEPARATEUR_TYPE_VALEUR+valeur);
242 jp_milcent 119
				}
193 jp_milcent 120
			}
121
		}
122
	}
119 jpm 123
 
306 jp_milcent 124
	protected void supprimerTypeDansChaineDenormalise(String champ, String type) {
125
		String chaineExistante = renvoyerValeurCorrecte(champ);
126
		if (!chaineExistante.equals("")) {
789 jpm 127
			if (chaineExistante.matches("(?:^|.*"+SEPARATEUR_VALEURS+")"+type+SEPARATEUR_TYPE_VALEUR+".*")) {
128
				chaineExistante = chaineExistante.replaceFirst("(^|.*"+SEPARATEUR_VALEURS+")"+type+SEPARATEUR_TYPE_VALEUR+".*?("+SEPARATEUR_VALEURS+".*|$)", "$1$2");
129
				chaineExistante = chaineExistante.replaceAll("(.*)"+SEPARATEUR_VALEURS+SEPARATEUR_VALEURS+"(.*)", "$1"+SEPARATEUR_VALEURS+"$2");
130
				chaineExistante = chaineExistante.replaceAll("^"+SEPARATEUR_VALEURS+"(.*)", "$1");
131
				chaineExistante = chaineExistante.replaceAll("(.*)"+SEPARATEUR_VALEURS+"$", "$1");
306 jp_milcent 132
				this.set(champ, chaineExistante);
133
			}
134
		}
135
	}
136
 
137
	protected void remplacerTypeDansChaineDenormalise(String champ, String type, Object valeur) {
138
		if (valeur != null && !valeur.equals("")) {
139
			ajouterChaineDenormaliseAvecType(champ, type, valeur);
140
		} else {
141
			supprimerTypeDansChaineDenormalise(champ, type);
142
		}
143
	}
233 jp_milcent 144
	/**
242 jp_milcent 145
	 * Ajoute un nouvel élément sans type à une chaine dénormalisée.
146
	 * Champ de type "truk" contenant seulement des valeurs séparées par ";;".
147
	 * Si l'élément existe déjà, il ne sera pas ajouté.
148
	 *
149
	 * @param champ le nom du champ dénormalisé
150
	 * @param valeur la valeur à ajouter
151
	 */
152
	protected void ajouterChaineDenormalise(String champ, Object valeur) {
153
		if (valeur instanceof String) {
154
			String chaineExistante = renvoyerValeurCorrecte(champ);
155
			if (chaineExistante.equals("")) {
156
				this.set(champ, valeur);
157
			} else {
158
				// Si la valeur à ajouter n'est pas déjà présente, nous l'ajoutons
789 jpm 159
				if (!chaineExistante.matches("(^|"+SEPARATEUR_VALEURS+")"+valeur+"("+SEPARATEUR_VALEURS+"|$)")) {
160
					this.set(champ, chaineExistante+SEPARATEUR_VALEURS+valeur);
242 jp_milcent 161
				}
162
			}
163
		}
164
	}
165
 
166
	/**
233 jp_milcent 167
	 * Permet de constuire correctement une chaine dénormalisée unique (champ de type "ce_truk").
168
	 *
169
	 * @param champ le nom du champ dénormalisé
170
	 * @param type le type de la valeur à ajouter
171
	 * @param valeur la valeur à ajouter
172
	 */
793 jpm 173
	protected void setChaineDenormaliseUnique(String champ, String type, String valeur) {
608 jp_milcent 174
		if (valeur == null || valeur.equals("")) {
175
			this.set(champ, "");
176
		} else if (valeur instanceof String) {
793 jpm 177
			if (((String) valeur).matches("^[0-9]+$")) {
178
				this.set(champ, valeur);
179
			} else {
180
				this.set(champ, type+SEPARATEUR_TYPE_VALEUR+valeur);
181
			}
233 jp_milcent 182
		}
183
	}
184
 
245 jp_milcent 185
	/**
186
	 * Permet de récupérer pour l'affichage une chaine dénormalisée unique (champ de type "ce_truk").
187
	 *
188
	 * @param champ le nom du champ dénormalisé
189
	 */
190
	protected String getChaineDenormaliseUnique(String champ) {
793 jpm 191
		String valeur = renvoyerValeurCorrecte(champ);
245 jp_milcent 192
 
793 jpm 193
		if (!valeur.equals("")) {
194
			valeur = valeur.replaceFirst("^"+TYPE_AUTRE+SEPARATEUR_TYPE_VALEUR, "");
245 jp_milcent 195
		}
196
 
793 jpm 197
		return valeur;
245 jp_milcent 198
	}
199
 
208 jp_milcent 200
	protected String getInfoDenormaliseParType(String chaineExistante, String type) {
201
		String sortie = "";
202
		if (!chaineExistante.equals("")) {
789 jpm 203
			String[] valeurs = chaineExistante.split(SEPARATEUR_VALEURS);
208 jp_milcent 204
			for (int i = 0; i < valeurs.length; i++) {
789 jpm 205
				if (valeurs[i].startsWith(type+SEPARATEUR_TYPE_VALEUR)) {
206
					sortie =  valeurs[i].replaceFirst("^"+type+SEPARATEUR_TYPE_VALEUR, "");
208 jp_milcent 207
				}
208
			}
209
		}
210
		return sortie;
211
	}
212
 
248 gduche 213
 
233 jp_milcent 214
	/**
248 gduche 215
	 * Permet de récupérer une map avec toutes les valeurs de la chaine truk sous la forme clé => valeur
216
	 *
217
	 * @param champ le nom du champ dénormalisé
218
	 * @return map ou liste en fonction du type de chaine truk (list si champ;;champ;; map si type##champ;;)
219
	 */
220
 
221
	public Object getChaineDenormaliseAsMapOrList(String champ)	{
222
 
223
			Object retourObjet = null;
224
 
225
			String valeurChamp = renvoyerValeurCorrecte(champ);
252 gduche 226
 
227
			if ((valeurChamp!=null)&&(!valeurChamp.trim().equals("")))	{
789 jpm 228
				String[] valeurs = valeurChamp.split(SEPARATEUR_VALEURS);
252 gduche 229
 
230
				if (valeurs.length > 0)	{
789 jpm 231
					if (valeurs[0].contains(SEPARATEUR_TYPE_VALEUR))	{
252 gduche 232
						// Les champs sont typés, on en fait une Map
748 jpm 233
						HashMap<String,String> mapValeurs = new HashMap<String,String>();
252 gduche 234
						for (int i = 0; i < valeurs.length; i++)	{
789 jpm 235
							String typeEtValeur[] = valeurs[i].split(SEPARATEUR_TYPE_VALEUR);
236
							mapValeurs.put(typeEtValeur[1], typeEtValeur[0]);
252 gduche 237
						}
238
						retourObjet = mapValeurs;
248 gduche 239
					}
252 gduche 240
					else	{
241
 
242
						//Les champs ne sont pas typés, on en fait une Liste
748 jpm 243
						LinkedList<String> listeValeurs = new LinkedList<String>();
252 gduche 244
						for (int i = 0; i < valeurs.length; i++)	{
245
							if ((valeurs[i]!=null)&&(!valeurs[i].equals("")))	{
246
								listeValeurs.add(valeurs[i]);
247
							}
249 gduche 248
						}
252 gduche 249
						retourObjet = listeValeurs;
248 gduche 250
					}
252 gduche 251
 
248 gduche 252
				}
253
			}
254
 
255
			return retourObjet;
256
 
257
	}
258
 
259
 
260
	/**
233 jp_milcent 261
	 * Permet de modifier correctement une chaine dénormalisée (champ de type "truk").
262
	 * Remplace par la valeur de la première instance du type indiqué dans la chaine dénormalisée.
602 jp_milcent 263
	 * Si aucun type n'est trouvé, nous en ajoutons un avec la nouvelle valeur.
233 jp_milcent 264
	 *
265
	 * @param champ le nom du champ dénormalisé
266
	 * @param type le type de la valeur à modifier
267
	 * @param valeur la valeur pour le type en question
268
	 */
242 jp_milcent 269
	protected void modifierChaineDenormaliseParType(String champ, String type, Object valeur) {
608 jp_milcent 270
		if (valeur == null || valeur.equals("")) {
602 jp_milcent 271
			supprimerTypeDansChaineDenormalise(champ, type);
272
		} else if (valeur instanceof String) {
233 jp_milcent 273
			String chaineExistante = renvoyerValeurCorrecte(champ);
602 jp_milcent 274
 
233 jp_milcent 275
			if (chaineExistante.equals("")) {
789 jpm 276
				this.set(champ, type+SEPARATEUR_TYPE_VALEUR+valeur);
233 jp_milcent 277
			} else {
789 jpm 278
				String[] valeurs = chaineExistante.split(SEPARATEUR_VALEURS);
602 jp_milcent 279
				HashMap<String,String> valeursModifiees = new HashMap<String,String>();
233 jp_milcent 280
				for (int i = 0; i < valeurs.length; i++) {
789 jpm 281
					if (valeurs[i].startsWith(type+SEPARATEUR_TYPE_VALEUR)) {
282
						valeursModifiees.put(type, type+SEPARATEUR_TYPE_VALEUR+valeur);
283
					} else if (i == (valeurs.length -1) && !valeurs[i].startsWith(type+SEPARATEUR_TYPE_VALEUR)) {
284
						valeursModifiees.put(valeurs[i].split(SEPARATEUR_TYPE_VALEUR)[0], valeurs[i]);
285
						valeursModifiees.put(type, type+SEPARATEUR_TYPE_VALEUR+valeur);
602 jp_milcent 286
					} else {
789 jpm 287
						valeursModifiees.put(valeurs[i].split(SEPARATEUR_TYPE_VALEUR)[0], valeurs[i]);
233 jp_milcent 288
					}
289
				}
602 jp_milcent 290
				String[] tableauValeursModifiees = valeursModifiees.values().toArray(new String[valeursModifiees.size()]);
789 jpm 291
				this.set(champ, UtilArray.implode(tableauValeursModifiees, SEPARATEUR_VALEURS));
233 jp_milcent 292
			}
293
		}
294
	}
295
 
208 jp_milcent 296
	protected String getInfoDenormaliseParPosition(String chaineExistante, int position) {
297
		String sortie = "";
298
		if (!chaineExistante.equals("")) {
789 jpm 299
			String[] valeurs = chaineExistante.split(SEPARATEUR_VALEURS);
208 jp_milcent 300
			if (valeurs.length >= position) {
301
				for (int i = 0; i < valeurs.length; i++) {
302
					if (i == (position - 1)) {
789 jpm 303
						if (valeurs[i].contains(SEPARATEUR_TYPE_VALEUR)) {
304
							sortie = valeurs[i].replaceFirst("^[^#]+"+SEPARATEUR_VALEURS, "");
208 jp_milcent 305
						} else {
603 jp_milcent 306
							sortie = valeurs[i];
208 jp_milcent 307
						}
308
						break;
309
					}
310
				}
311
			}
312
		}
313
		return sortie;
314
	}
315
 
233 jp_milcent 316
	/**
317
	 * Permet de modifier correctement une chaine dénormalisée (champ de type "truk").
318
	 * Remplace par la valeur l'instance dont la position a été indiquée.
242 jp_milcent 319
	 * Si la chaine dénormalisée est vide, l'élement est ajouté quelque soit la position indiquée.
320
	 * Si la position est supérieure au nombre d'élément de la chaine dénormalisé, rien n'est modifié.
233 jp_milcent 321
	 *
322
	 * @param champ le nom du champ dénormalisé
323
	 * @param position le type de la valeur à modifier
324
	 * @param valeur la valeur à remplacer à la position indiquée
325
	 */
242 jp_milcent 326
	protected void modifierChaineDenormaliseParPosition(String champ, int position, Object valeur) {
608 jp_milcent 327
		if (valeur == null || valeur.equals("")) {
603 jp_milcent 328
			supprimerChaineDenormaliseParPosition(champ, position);
329
		} else if (valeur instanceof String) {
233 jp_milcent 330
			String chaineExistante = renvoyerValeurCorrecte(champ);
603 jp_milcent 331
			if (chaineExistante.equals("")) {
332
				this.set(champ, valeur);
333
			} else {
789 jpm 334
				String[] valeurs = chaineExistante.split(SEPARATEUR_VALEURS);
603 jp_milcent 335
				if (valeurs.length >= position) {
233 jp_milcent 336
					for (int i = 0; i < valeurs.length; i++) {
337
						if (i == (position - 1)) {
338
							valeurs[i] = (String) valeur;
339
							break;
340
						}
341
					}
789 jpm 342
					this.set(champ, UtilArray.implode(valeurs, SEPARATEUR_VALEURS));
233 jp_milcent 343
				}
344
			}
345
		}
346
	}
347
 
603 jp_milcent 348
	protected void supprimerChaineDenormaliseParPosition(String champ, int position) {
349
		String chaineExistante = renvoyerValeurCorrecte(champ);
350
		if (!chaineExistante.equals("")) {
789 jpm 351
			String[] valeurs = chaineExistante.split(SEPARATEUR_VALEURS);
603 jp_milcent 352
			HashMap<String,String> valeursModifiees = new HashMap<String,String>();
353
			if (valeurs.length >= position) {
354
				for (int i = 0; i < valeurs.length; i++) {
355
					if (i != (position - 1)) {
356
						valeursModifiees.put(""+i, valeurs[i]);
357
					}
358
				}
359
				String[] tableauValeursModifiees = valeursModifiees.values().toArray(new String[valeursModifiees.size()]);
789 jpm 360
				this.set(champ, UtilArray.implode(tableauValeursModifiees, SEPARATEUR_VALEURS));
603 jp_milcent 361
			}
362
		}
363
	}
364
 
193 jp_milcent 365
	/** (non-Javadoc)
366
	 * @see java.lang.Object#toString()
367
	 */
368
	public String toString() {
369
		String sortie = "";
370
 
371
		// Champs du BaseModelData
372
		Set<String> proprietes = this.getProperties().keySet();
306 jp_milcent 373
		TreeSet<String> proprietesTriees = new TreeSet<String>(proprietes);
374
		for (Iterator<String> it = proprietesTriees.iterator(); it.hasNext();) {
193 jp_milcent 375
			String cle = it.next();
306 jp_milcent 376
			if (this.get(cle) != null && !this.get(cle).equals("")) {
202 jp_milcent 377
				sortie += cle+" : "+this.get(cle)+"\n";
378
			}
193 jp_milcent 379
		}
380
 
381
		return sortie;
382
	}
306 jp_milcent 383
 
384
	public Boolean comparer(BaseModelData objetAComparer) {
385
		Boolean retour = true;
386
		Map<String, Object> a = this.getProperties();
387
		Map<String, Object> b = objetAComparer.getProperties();
388
		if (a.size() != b.size()) {
389
			retour = false;
390
		} else {
391
			Set<String> cles = a.keySet();
392
			Iterator<String> it = cles.iterator();
393
			while (it.hasNext()) {
394
				String cle = it.next();
395
				if (a.get(cle) != null && !a.get(cle).equals(b.get(cle))) {
396
					retour = false;
397
					break;
398
				}
399
			}
400
		}
401
 
402
		return retour;
403
	}
404
 
405
	public Object cloner(BaseModelData nouvelleInstance) {
406
		Map<String, Object> proprietes = this.getProperties();
407
		Set<String> cles = proprietes.keySet();
408
		for (Iterator<String> it = cles.iterator(); it.hasNext();) {
409
			String cle = it.next();
410
			nouvelleInstance.set(cle, this.get(cle));
411
		}
412
 
413
		return nouvelleInstance;
414
	}
385 gduche 415
 
416
	/**
748 jpm 417
	 * Renvoie une chaîne de caractère formatée et encodée pour POST avec toutes les propriétés du modèle
385 gduche 418
	 * */
748 jpm 419
	public String obtenirChainePOST() {
420
		String post = "";
385 gduche 421
 
748 jpm 422
		FastMap<?> proprietees = (FastMap<?>) getProperties();
423
		Collection<String> cles = proprietees.keySet();
424
		Iterator<String> it = cles.iterator();
385 gduche 425
 
426
		while (it.hasNext())	{
748 jpm 427
			String cle = it.next();
826 gduche 428
			//Les Radio Box couplées à la fonction autobind créer des variables gxt.RadioGroup.X, qu'il ne faut pas mettre dans la requête
429
			if (!cle.startsWith("gxt."))	{
430
				post += getPrefixe() + "_" +  cle + "=" + URL.encodeComponent(renvoyerValeurCorrecte(cle));
431
				if (it.hasNext())	{
432
					post += "&";
433
				}
385 gduche 434
			}
435
		}
436
 
748 jpm 437
		return post;
786 jpm 438
	}
439
 
440
	/**
441
	 * Met à jour l'objet this avec les données de l'objet passé en paramêtre.
442
	 *
443
	 * */
444
	public void mettreAJour(aDonnee nouveau) {
445
		Collection<String> cles = nouveau.getProperties().keySet();
446
		Iterator<String> it = cles.iterator();
447
		while (it.hasNext())	{
448
			String cle = it.next();
449
			if (!this.get(cle).equals(nouveau.get(cle))) {
450
				this.set(cle, nouveau.get(cle));
451
			}
452
		}
453
	}
69 jpm 454
}