Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 989 Rev 1293
1
package org.tela_botanica.client.modeles.dao;
1
package org.tela_botanica.client.modeles.dao;
2
 
2
 
3
import java.util.HashMap;
3
import java.util.HashMap;
4
 
4
 
5
import org.tela_botanica.client.interfaces.FournisseurListe;
5
import org.tela_botanica.client.interfaces.FournisseurListe;
6
import org.tela_botanica.client.interfaces.Rafraichissable;
6
import org.tela_botanica.client.interfaces.Rafraichissable;
7
import org.tela_botanica.client.modeles.objets.Configuration;
7
import org.tela_botanica.client.modeles.objets.Configuration;
8
import org.tela_botanica.client.modeles.objets.ListeReferentielNom;
8
import org.tela_botanica.client.modeles.objets.ListeReferentielNom;
9
import org.tela_botanica.client.modeles.objets.ReferentielNom;
9
import org.tela_botanica.client.modeles.objets.ReferentielNom;
10
import org.tela_botanica.client.observation.ObservationModele;
10
import org.tela_botanica.client.observation.ObservationModele;
11
import org.tela_botanica.client.util.Util;
-
 
12
 
11
 
13
import com.google.gwt.http.client.Request;
12
import com.google.gwt.http.client.Request;
14
import com.google.gwt.http.client.RequestBuilder;
13
import com.google.gwt.http.client.RequestBuilder;
15
import com.google.gwt.http.client.RequestCallback;
14
import com.google.gwt.http.client.RequestCallback;
16
import com.google.gwt.http.client.RequestException;
15
import com.google.gwt.http.client.RequestException;
17
import com.google.gwt.http.client.Response;
16
import com.google.gwt.http.client.Response;
18
import com.google.gwt.http.client.URL;
17
import com.google.gwt.http.client.URL;
19
import com.google.gwt.json.client.JSONArray;
18
import com.google.gwt.json.client.JSONArray;
20
import com.google.gwt.json.client.JSONParser;
19
import com.google.gwt.json.client.JSONParser;
21
import com.google.gwt.json.client.JSONString;
20
import com.google.gwt.json.client.JSONString;
22
import com.google.gwt.json.client.JSONValue;
21
import com.google.gwt.json.client.JSONValue;
23
 
22
 
24
/**
23
/**
25
 * DAO  liste noms scientifiques // utilisation d'un cahce memoire pour eviter des requetes inutiles.
24
 * DAO  liste noms scientifiques // utilisation d'un cahce memoire pour eviter des requetes inutiles.
26
 * @author David Delon
25
 * @author David Delon
27
 * 
26
 * 
28
 */
27
 */
29
public class ListeReferentielNomAsynchroneDAO implements FournisseurListe {
28
public class ListeReferentielNomAsynchroneDAO implements FournisseurListe {
30
 
29
 
31
 
30
 
32
	//TODO : limiter taille du cache ? (si pb performance)
31
	//TODO : limiter taille du cache ? (si pb performance)
33
	
32
	
34
	/**
33
	/**
35
	 * Le modèle associé au DAO
34
	 * Le modèle associé au DAO
36
	 */
35
	 */
37
	private ObservationModele observationModele = null ;
36
	private ObservationModele observationModele = null ;
38
	
37
	
39
	
38
	
40
	/**
39
	/**
41
	 * Cache
40
	 * Cache
42
	 * 
41
	 * 
43
	 */
42
	 */
44
	
43
	
45
	private HashMap <String,ListeReferentielNom> cache = new HashMap();
44
	private HashMap <String,ListeReferentielNom> cache = new HashMap();
46
	
-
 
47
	
-
 
48
 
-
 
49
	
45
 
50
	public ListeReferentielNomAsynchroneDAO(ObservationModele observationModele)
46
	public ListeReferentielNomAsynchroneDAO(ObservationModele observationModele)
51
	{
47
	{
52
	
48
	
53
		this.observationModele=observationModele;
49
		this.observationModele=observationModele;
54
	}
50
	}
55
	
51
	
56
	
52
	
57
	/**
53
	/**
58
	 * Envoie une requete au serveur jrest pour obtenir les communes  correspondant
54
	 * Envoie une requete au serveur jrest pour obtenir les communes  correspondant
59
	 * à des critères données en paramètres
55
	 * à des critères données en paramètres
60
	 * @param r le rafraichissable qui demande la mise à jour
56
	 * @param r le rafraichissable qui demande la mise à jour
61
	 * @param criteres un string contenant le terme a rechercher
57
	 * @param criteres un string contenant le terme a rechercher
62
	 */
58
	 */
63
	
59
	
-
 
60
	
64
	
61
	@Override
65
	public void obtenirListeDonnees(final Rafraichissable r, final String critere)
62
	public void obtenirListeDonnees(final Rafraichissable r, final String critere)
66
	{
63
	{
67
		
64
		
68
		
65
		
69
		ListeReferentielNom referentielNomDataFromCache=null;
66
		ListeReferentielNom referentielNomDataFromCache=null;
70
		
67
		
71
		
68
		
72
		// En cache ?
69
		// En cache ?
73
		if ((referentielNomDataFromCache=getFromCache(critere))!=null) {
70
		if ((referentielNomDataFromCache=getFromCache(critere))!=null) {
74
			r.rafraichir(referentielNomDataFromCache,true);  
71
			r.rafraichir(referentielNomDataFromCache,true);  
75
	    }
72
	    }
76
	    
73
	    
77
		else {
74
		else {
78
	    	  
75
	    	  
79
	    // On vérifie si un genre et une espèce sont demandées
76
	    // On vérifie si un genre et une espèce sont demandées
80
		// et ajoute le / manuellement car sinon il devient urlencode
77
		// et ajoute le / manuellement car sinon il devient urlencode
81
		String[] criteres =critere.split("/"); 
78
		String[] criteres =critere.split("/"); 
82
		String urlParams = "/NameSearch/";
79
		String urlParams = "/NameSearch/";
83
	    if(criteres.length > 1) {
80
	    if(criteres.length > 1) {
84
	    	String critere1 = criteres[0]; 
81
	    	String critere1 = criteres[0]; 
85
	    	String critere2 = criteres[1];
82
	    	String critere2 = criteres[1];
86
	    	
83
	    	
87
	    	urlParams += URL.encode(critere1)+"/"+URL.encode(critere2);
84
	    	urlParams += URL.encode(critere1)+"/"+URL.encode(critere2);
88
	    } else {
85
	    } else {
89
	    	urlParams += URL.encode(critere);
86
	    	urlParams += URL.encode(critere);
90
	    }
87
	    }
91
		
88
		
92
		RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, Configuration.getServiceBaseUrl()+urlParams);
89
		RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, Configuration.getServiceBaseUrl()+urlParams);
93
		
90
		
94
		try {
91
		try {
95
			
92
			
96
			rb.sendRequest(null, new RequestCallback() {
93
			rb.sendRequest(null, new RequestCallback() {
-
 
94
 
97
 
95
				@Override
98
				public void onError(Request request, Throwable exception) {
96
				public void onError(Request request, Throwable exception) {
99
					// TODO Auto-generated method stub
97
					// TODO Auto-generated method stub
100
					
98
					
101
				}
99
				}
-
 
100
 
102
 
101
				@Override
103
				public void onResponseReceived(Request request,
102
				public void onResponseReceived(Request request,
104
						Response response) {
103
						Response response) {
105
					
104
					
106
					final ListeReferentielNom referentielNomData ;
105
					final ListeReferentielNom referentielNomData ;
107
					
106
					
108
					final JSONValue responseValue = JSONParser.parse(response.getText());
107
					final JSONValue responseValue = JSONParser.parse(response.getText());
109
					
108
					
110
					JSONArray reponse=null;
109
					JSONArray reponse=null;
111
		
110
		
112
		
111
		
113
					// si c'est un tableau
112
					// si c'est un tableau
114
					if ((reponse=responseValue.isArray()) != null) {
113
					if ((reponse=responseValue.isArray()) != null) {
115
						
114
						
116
						JSONArray noms;
115
						JSONArray noms;
117
						final int taillemax = reponse.size();
116
						final int taillemax = reponse.size();
118
						
117
						
119
						referentielNomData = new ListeReferentielNom(taillemax);
118
						referentielNomData = new ListeReferentielNom(taillemax);
120
						
-
 
121
						for (int i = 0; i < taillemax; i++) {
119
						for (int i = 0; i < taillemax; i++) {
122
							if ((noms=reponse.get(i).isArray()) != null) {
120
							if ((noms=reponse.get(i).isArray()) != null) {
123
								
-
 
124
								
-
 
125
								String nom = ((JSONString) noms.get(0)).toString();
121
								String nom = ((JSONString) noms.get(0)).stringValue();
126
								String numeroNom = ((JSONString) noms.get(1)).toString();
122
								String numeroNom = ((JSONString) noms.get(1)).stringValue();
127
								String statut= ((JSONString) noms.get(2)).toString();
123
								String statut= ((JSONString) noms.get(2)).stringValue();
128
								
-
 
129
								
-
 
130
								ReferentielNom nomScientifique=new ReferentielNom(nom, numeroNom, statut);
124
								ReferentielNom nomScientifique = new ReferentielNom(nom, numeroNom, statut);
131
				
-
 
132
								// FIXME : et si le numero de nom n'est pas unique ? (cas de multirefrentiel....)
125
								// FIXME : et si le numero de nom n'est pas unique ? (cas de multirefrentiel....)					
133
								
-
 
134
								referentielNomData.put(nomScientifique.getNumeroNom(),nomScientifique);
126
								referentielNomData.put(nomScientifique.getNumeroNom(),nomScientifique);								
135
		
-
 
136
								
-
 
137
							}
127
							}
138
		
-
 
139
						}
128
						}
140
					} else {
129
					} else {
141
						
130
						
142
						referentielNomData = new ListeReferentielNom(0) ;
131
						referentielNomData = new ListeReferentielNom(0) ;
143
					}
132
					}
144
					
-
 
145
					// dans tous les cas on transmet la liste crée au rafraichissable en lui demandant de répandre les données car il est
-
 
146
					// le premier à les recevoir
-
 
147
				
-
 
148
					addToCache(critere, referentielNomData);
133
					addToCache(critere, referentielNomData);
149
					
-
 
150
					r.rafraichir(referentielNomData,true);
134
					r.rafraichir(referentielNomData,true);
151
					
-
 
152
				}
135
				}
153
				
-
 
154
				
-
 
155
			}) ;
136
			}) ;
156
			
137
			
157
		} catch(RequestException e) {
138
		} catch(RequestException e) {
158
			
139
			
159
		}
140
		}
160
		
141
		
161
		} // fin else si pas de cache
142
		} // fin else si pas de cache
162
			
143
			
163
	}
144
	}
164
	
145
	
165
	  private void addToCache(String query, ListeReferentielNom result)	  {
146
	  private void addToCache(String query, ListeReferentielNom result)	  {
166
		  cache.put(query.toLowerCase(),result);
147
		  cache.put(query.toLowerCase(),result);
167
	  }
148
	  }
168
 
149
 
169
	  private ListeReferentielNom getFromCache (String query) {
150
	  private ListeReferentielNom getFromCache (String query) {
170
		  return (ListeReferentielNom) cache.get(query.toLowerCase());
151
		  return cache.get(query.toLowerCase());
171
	  }
152
	  }
172
 
153
 
173
 
154
 
174
	
155
	
175
}
156
}