Subversion Repositories eFlore/Applications.cel

Rev

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

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