Subversion Repositories eFlore/Applications.coel

Rev

Rev 875 | Rev 891 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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