Rev 1542 | Blame | Compare with Previous | Last modification | View Log | RSS feed
package org.tela_botanica.client.modeles.dao;import java.util.HashMap;import org.tela_botanica.client.interfaces.FournisseurListe;import org.tela_botanica.client.interfaces.Rafraichissable;import org.tela_botanica.client.modeles.objets.Configuration;import org.tela_botanica.client.modeles.objets.ListeReferentielNom;import org.tela_botanica.client.modeles.objets.ReferentielNom;import org.tela_botanica.client.observation.ObservationModele;import com.google.gwt.http.client.Request;import com.google.gwt.http.client.RequestBuilder;import com.google.gwt.http.client.RequestCallback;import com.google.gwt.http.client.RequestException;import com.google.gwt.http.client.Response;import com.google.gwt.http.client.URL;import com.google.gwt.json.client.JSONArray;import com.google.gwt.json.client.JSONParser;import com.google.gwt.json.client.JSONString;import com.google.gwt.json.client.JSONValue;/*** DAO liste noms scientifiques // utilisation d'un cahce memoire pour eviter des requetes inutiles.* @author David Delon**/public class ListeReferentielNomAsynchroneDAO implements FournisseurListe {//TODO : limiter taille du cache ? (si pb performance)/*** Le modèle associé au DAO*/private ObservationModele observationModele = null ;/*** Cache**/private HashMap <String,ListeReferentielNom> cache = new HashMap();public ListeReferentielNomAsynchroneDAO(ObservationModele observationModele){this.observationModele=observationModele;}/*** Envoie une requete au serveur jrest pour obtenir les communes correspondant* à des critères données en paramètres* @param r le rafraichissable qui demande la mise à jour* @param criteres un string contenant le terme a rechercher*/@Overridepublic void obtenirListeDonnees(final Rafraichissable r,final String referentiel, final String critere){ListeReferentielNom referentielNomDataFromCache=null;// En cache ?if ((referentielNomDataFromCache=getFromCache(critere))!=null) {r.rafraichir(referentielNomDataFromCache,true);}else {// On vérifie si un genre et une espèce sont demandées// et ajoute le / manuellement car sinon il devient urlencodeString[] criteres =critere.split("/");String urlParams = "/NameSearch/"+referentiel+"/";if(criteres.length > 1) {String critere1 = criteres[0];String critere2 = criteres[1];urlParams += URL.encode(critere1)+"/"+URL.encode(critere2);} else {urlParams += URL.encode(critere);}RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, Configuration.getServiceBaseUrl()+urlParams);try {rb.sendRequest(null, new RequestCallback() {@Overridepublic void onError(Request request, Throwable exception) {// TODO Auto-generated method stub}@Overridepublic void onResponseReceived(Request request,Response response) {final ListeReferentielNom referentielNomData ;final JSONValue responseValue = JSONParser.parse(response.getText());JSONArray reponse=null;// si c'est un tableauif ((reponse=responseValue.isArray()) != null) {JSONArray noms;final int taillemax = reponse.size();referentielNomData = new ListeReferentielNom(taillemax);for (int i = 0; i < taillemax; i++) {if ((noms=reponse.get(i).isArray()) != null) {String nom = ((JSONString) noms.get(0)).stringValue();String numeroNom = ((JSONString) noms.get(1)).stringValue();String statut= ((JSONString) noms.get(2)).stringValue();ReferentielNom nomScientifique = new ReferentielNom(nom, numeroNom, statut);// FIXME : et si le numero de nom n'est pas unique ? (cas de multirefrentiel....)referentielNomData.put(nomScientifique.getNumeroNom(),nomScientifique);}}} else {referentielNomData = new ListeReferentielNom(0) ;}addToCache(critere, referentielNomData);r.rafraichir(referentielNomData,true);}}) ;} catch(RequestException e) {}} // fin else si pas de cache}@Overridepublic void obtenirListeDonnees(Rafraichissable r, String critere) {obtenirListeDonnees(r, "bdtfx", critere);}private void addToCache(String query, ListeReferentielNom result) {cache.put(query.toLowerCase(),result);}private ListeReferentielNom getFromCache (String query) {return cache.get(query.toLowerCase());}}