5,7 → 5,6 |
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; |
|
25,115 → 24,27 |
* @author David Delon |
* |
*/ |
public class ListeReferentielNomAsynchroneDAO implements FournisseurListe { |
public class ListeReferentielNomAsynchroneDAO { |
|
|
//TODO : limiter taille du cache ? (si pb performance) |
/** |
* Le modèle associé au DAO |
*/ |
private ObservationModele observationModele = null ; |
private String referentiel = null; |
|
/** |
* Cache |
* |
*/ |
|
private HashMap <String,ListeReferentielNom> cache = new HashMap(); |
|
public ListeReferentielNomAsynchroneDAO(ObservationModele observationModele) |
{ |
this.observationModele=observationModele; |
public static String getBaseUrlReferentielNom() { |
return Configuration.getServiceBaseUrl()+"/NameSearch/{referentiel}/"; |
} |
|
@Override |
public void obtenirListeDonnees(final Rafraichissable r,final String referentiel, final String critere) |
{ |
ListeReferentielNom referentielNomDataFromCache=null; |
public static String formaterUrlAutoCompletionReferentielNom(String urlRequete, String referentiel, String critere) { |
// On vérifie si un genre et une espèce sont demandées |
// et ajoute le / manuellement car sinon il devient urlencodé |
String[] criteres =critere.split("/"); |
urlRequete = urlRequete.replace("{referentiel}", referentiel); |
|
if(this.referentiel != referentiel) { |
cache.clear(); |
} |
|
// En cache ? |
if ((referentielNomDataFromCache=getFromCache(critere))!=null) { |
r.rafraichir(referentielNomDataFromCache,true); |
String params = ""; |
if(criteres.length > 1) { |
String critere1 = criteres[0]; |
String critere2 = criteres[1]; |
params += URL.encode(critere1)+"/"+URL.encode(critere2); |
} else { |
params += URL.encode(critere); |
} |
|
else { |
// On vérifie si un genre et une espèce sont demandées |
// et ajoute le / manuellement car sinon il devient urlencodé |
String[] 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); |
} |
|
this.referentiel = referentiel; |
RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, Configuration.getServiceBaseUrl()+urlParams); |
|
try { |
rb.sendRequest(null, new RequestCallback() { |
|
@Override |
public void onError(Request request, Throwable exception) { |
// TODO Auto-generated method stub |
} |
|
@Override |
public void onResponseReceived(Request request, |
Response response) { |
|
final ListeReferentielNom referentielNomData ; |
final JSONValue responseValue = JSONParser.parse(response.getText()); |
JSONArray reponse=null; |
|
// si c'est un tableau |
if ((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 |
return urlRequete+params; |
} |
|
@Override |
public 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()); |
} |
} |