Subversion Repositories eFlore/Applications.coel

Rev

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

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