Subversion Repositories eFlore/Applications.coel

Rev

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

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