Subversion Repositories eFlore/Applications.coel

Rev

Rev 1800 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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