Subversion Repositories eFlore/Applications.coel

Rev

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