Subversion Repositories eFlore/Applications.cel

Rev

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

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