Subversion Repositories eFlore/Applications.cel

Rev

Rev 1918 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
989 aurelien 1
package org.tela_botanica.client.modeles.dao;
15 david 2
 
151 david 3
import java.util.HashMap;
4
 
15 david 5
import org.tela_botanica.client.interfaces.FournisseurListe;
6
import org.tela_botanica.client.interfaces.Rafraichissable;
989 aurelien 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;
15 david 10
import org.tela_botanica.client.observation.ObservationModele;
11
 
32 jpm 12
import com.google.gwt.http.client.Request;
1918 aurelien 13
import org.tela_botanica.client.util.RequestBuilderWithCredentials;
32 jpm 14
import com.google.gwt.http.client.RequestCallback;
15
import com.google.gwt.http.client.RequestException;
16
import com.google.gwt.http.client.Response;
204 david 17
import com.google.gwt.http.client.URL;
15 david 18
import com.google.gwt.json.client.JSONArray;
19
import com.google.gwt.json.client.JSONParser;
20
import com.google.gwt.json.client.JSONString;
21
import com.google.gwt.json.client.JSONValue;
22
 
23
/**
153 david 24
 * DAO  liste noms scientifiques // utilisation d'un cahce memoire pour eviter des requetes inutiles.
15 david 25
 * @author David Delon
26
 *
27
 */
28
public class ListeReferentielNomAsynchroneDAO implements FournisseurListe {
29
 
30
 
153 david 31
	//TODO : limiter taille du cache ? (si pb performance)
15 david 32
	/**
33
	 * Le modèle associé au DAO
34
	 */
35
	private ObservationModele observationModele = null ;
1672 aurelien 36
	private String referentiel = null;
15 david 37
 
151 david 38
	/**
39
	 * Cache
40
	 *
41
	 */
42
 
43
	private HashMap <String,ListeReferentielNom> cache = new HashMap();
153 david 44
 
15 david 45
	public ListeReferentielNomAsynchroneDAO(ObservationModele observationModele)
46
	{
47
		this.observationModele=observationModele;
48
	}
49
 
1293 aurelien 50
	@Override
1542 aurelien 51
	public void obtenirListeDonnees(final Rafraichissable r,final String referentiel, final String critere)
15 david 52
	{
153 david 53
		ListeReferentielNom referentielNomDataFromCache=null;
151 david 54
 
1672 aurelien 55
		if(this.referentiel != referentiel) {
56
			cache.clear();
57
		}
58
 
151 david 59
		// En cache ?
153 david 60
		if ((referentielNomDataFromCache=getFromCache(critere))!=null) {
61
			r.rafraichir(referentielNomDataFromCache,true);
151 david 62
	    }
63
 
2567 aurelien 64
		else {
65
		    // On vérifie si un genre et une espèce sont demandées
66
			// et ajoute le / manuellement car sinon il devient urlencodé
67
			String[] criteres =critere.split("/");
68
			String urlParams = "/NameSearch/"+referentiel+"/";
69
		    if(criteres.length > 1) {
70
		    	String critere1 = criteres[0];
71
		    	String critere2 = criteres[1];
72
		    	urlParams += URL.encode(critere1)+"/"+URL.encode(critere2);
73
		    } else {
74
		    	urlParams += URL.encode(critere);
75
		    }
76
 
77
		    this.referentiel = referentiel;
78
			RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, Configuration.getServiceBaseUrl()+urlParams);
32 jpm 79
 
2567 aurelien 80
			try {
81
				rb.sendRequest(null, new RequestCallback() {
82
 
83
					@Override
84
					public void onError(Request request, Throwable exception) {
85
						// TODO Auto-generated method stub
86
					}
87
 
88
					@Override
89
					public void onResponseReceived(Request request,
90
							Response response) {
32 jpm 91
 
2567 aurelien 92
						final ListeReferentielNom referentielNomData ;
93
						final JSONValue responseValue = JSONParser.parse(response.getText());
94
						JSONArray reponse=null;
95
 
96
						// si c'est un tableau
97
						if ((reponse=responseValue.isArray()) != null) {
98
 
99
							JSONArray noms;
100
							final int taillemax = reponse.size();
101
 
102
							referentielNomData = new ListeReferentielNom(taillemax);
103
							for (int i = 0; i < taillemax; i++) {
104
								if ((noms=reponse.get(i).isArray()) != null) {
105
									String nom = ((JSONString) noms.get(0)).stringValue();
106
									String numeroNom = ((JSONString) noms.get(1)).stringValue();
107
									String statut= ((JSONString) noms.get(2)).stringValue();
108
									ReferentielNom nomScientifique = new ReferentielNom(nom, numeroNom, statut);
109
									// FIXME : et si le numero de nom n'est pas unique ? (cas de multirefrentiel....)
110
									referentielNomData.put(nomScientifique.getNumeroNom(),nomScientifique);
111
								}
32 jpm 112
							}
2567 aurelien 113
						} else {
114
							referentielNomData = new ListeReferentielNom(0) ;
15 david 115
						}
2567 aurelien 116
						addToCache(critere, referentielNomData);
117
						r.rafraichir(referentielNomData,true);
15 david 118
					}
2567 aurelien 119
				}) ;
120
 
121
			} catch(RequestException e) {
122
 
123
			}
124
		} // fin else si pas de cache
15 david 125
	}
151 david 126
 
1542 aurelien 127
	@Override
128
	public void obtenirListeDonnees(Rafraichissable r, String critere) {
129
		obtenirListeDonnees(r, "bdtfx", critere);
130
	}
131
 
132
	private void addToCache(String query, ListeReferentielNom result)	  {
133
		cache.put(query.toLowerCase(),result);
134
	}
151 david 135
 
1542 aurelien 136
	private ListeReferentielNom getFromCache (String query) {
137
		return cache.get(query.toLowerCase());
138
	}
2567 aurelien 139
}