Subversion Repositories eFlore/Applications.coel

Rev

Rev 1513 | Blame | Last modification | View Log | RSS feed

package org.tela_botanica.client.modeles.projet;

import java.util.HashMap;

import org.tela_botanica.client.Mediateur;
import org.tela_botanica.client.RegistreId;
import org.tela_botanica.client.http.JsonRestRequestBuilder;
import org.tela_botanica.client.http.JsonRestRequestCallback;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.Information;
import org.tela_botanica.client.modeles.structure.StructureListe;
import org.tela_botanica.client.synchronisation.Reponse;
import org.tela_botanica.client.util.Debug;
import org.tela_botanica.client.util.UtilDAO;

import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.widget.Info;
import com.google.gwt.core.client.GWT;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONValue;

public class ProjetAsyncDao {
        private static final String SERVICE_NOM = "CoelProjet";
        
        String utilisateurId = null;
        private Rafraichissable vueARafraichir = null;
        
        public ProjetAsyncDao(Rafraichissable vueARafraichirCourrante) {
                if (Mediateur.DEBUG) System.out.println("|| ProjetAsyncDao > vueARafraichir = "+vueARafraichirCourrante.getClass().toString());
                vueARafraichir = vueARafraichirCourrante;
                utilisateurId = ((Mediateur) Registry.get(RegistreId.MEDIATEUR)).getUtilisateurId();
        }

        
        /**
         * @param paginationProgressive : définit le mode de consultation de la base de données
         *                      - True :        la consultation des données est progressive, ce qui signifie que la liste est chargée (paginée) au
         *                                              fur et à mesure de la consultation des données par l'utilisateur.
         *                      - False :       la consultation des données est classique : un seul appel à la base de données est effectué, le retour
         *                                              est renvoyé à l'appelant
         *                      // FIXME : si la taille de la liste est supérieure à la limite du JREST (150), ce deuxieme mode ne fonctionne pas
         */
        public void selectionner(final boolean paginationProgressive, final String projetId, final String nomProjet, final int start, final int nbElements, final String formatRetour, final Integer seqId) {
                
                String nom = (nomProjet == null) ? "%" : nomProjet+"%";
                String[] param = {projetId, nom};
                
                HashMap<String, String> restrictions = new HashMap<String, String>();

                /* ne jamais effectuer de limitation du nombre de projet car, lorsqu'on édite une institution, le "projet"
                   est obligatoire, cependant, si l'ID du projet de cette institution n'est pas présent dans la première page
                   de la liste dynamique téléchargée initialement (offset 0 -> 10), le champ reste invalide / rouge,
                   rendant impossible la modification rapide de la structure.

                   Pour cette raison, la liste des projets est toujours récupérée en intégralité. */
                if (false && nbElements != -1) {
                        restrictions.put("limit", String.valueOf(nbElements));
                }

                if ((formatRetour != null) && (formatRetour != "")) {
                        restrictions.put("formatRetour", formatRetour);
                }
                
                /** GESTION DE LA REQUETE dans le cas d'une liste paginée progressive **/
                if (paginationProgressive) {

                        /** DEFINITION DU TUPLE DE DEPART **/
                        restrictions.put("start", String.valueOf(start));
                        
                        /** CONSTRUCTION DE LA REQUETE **/
                final JsonRestRequestBuilder rb = UtilDAO.construireRequete(SERVICE_NOM, param, restrictions);

                /** ENVOI DE LA REQUETE **/
                rb.envoyerRequete(null, new JsonRestRequestCallback()
                {
                        /** RECEPTION DE LA REPONSE **/
                        public void surReponse(JSONValue responseValue)
                        {
                                /** Dans le cas d'une liste paginée, vueARafraichir est un objet Proxy.
                                 * On retourne l'objet JSON au proxy afin que ce soit lui qui le traite **/
                                        if (seqId != null)      {
                                                Reponse reponseRequete = new Reponse(responseValue, seqId);
                                                vueARafraichir.rafraichir(reponseRequete);
                                        }
                                        else    {
                                                vueARafraichir.rafraichir(responseValue);
                                        }
                        }
                });
                }
                /** GESTION DE LA REQUETE dans le cas d'une liste NON paginée progressive **/
                else {
                        
                        /** DEFINITION DU TUPLE DE DEPART **/
                        restrictions.put("start", String.valueOf(start*nbElements));                    
                        
                        final JsonRestRequestBuilder rb = UtilDAO.construireRequete(SERVICE_NOM, param, restrictions);
                        
                        rb.envoyerRequete(null, new JsonRestRequestCallback() {
                                
                                public void surReponse(JSONValue responseValue) {
                                
                                        if (responseValue != null) {
                                                
                                                JSONObject responseObject = responseValue.isObject();
                                                
                                                if (responseObject != null) {
                                                        
                                                        // Si la réponse est un tableau, alors c'est une liste de projets qui a été retournée
                                                        if (responseObject.get("projets").isArray() != null) {
                                                                
                                                                JSONArray reponse = responseObject.get("projets").isArray();
                                                                ProjetListe projets;
                                                                projets = new ProjetListe(reponse, responseObject.get("nbElements").isNumber(), vueARafraichir);
                                                                projets.setTaillePage(nbElements);
                                                                projets.setPageCourante(start);                                                 

                                                                if (seqId != null) {
                                                                        Reponse retourRequete = new Reponse(projets, seqId);
                                                                        vueARafraichir.rafraichir(retourRequete);
                                                                } else {
                                                                        vueARafraichir.rafraichir(projets);
                                                                }
                                                        
                                                        // Si la réponse est un objet, alors c'est un unique projet qui a été retourné
                                                        } else if (responseObject.get("projets").isObject() != null) {
                                                                
                                                                JSONObject reponse = responseObject.get("projets").isObject();
                                                                Projet projet = new Projet(reponse);
                                                                
                                                                Information info = new Information("selection_projet");
                                                                info.setDonnee(0, projet);

                                                                if (seqId != null) {
                                                                        Reponse reponseRequete = new Reponse(info, seqId);
                                                                        vueARafraichir.rafraichir(reponseRequete);
                                                                }
                                                                else {
                                                                        vueARafraichir.rafraichir(info);
                                                                }
                                                        }
                                                } else {
                                                        GWT.log(rb.getUrl()+"\n\tLa réponse n'est pas un objet ou un tableau JSON et vaut : "+responseValue.toString(), null);
                                                }
                                        } else {
                                                // Dans le cas, où nous demandons tous les projets et qu'il n'y en a pas, nous retournons un objet vide
                                                if (projetId == null) {
                                                        ProjetListe projets = new ProjetListe(0);
                                                        if (seqId != null)      {
                                                                Reponse reponseRequete = new Reponse(projets, seqId);
                                                                vueARafraichir.rafraichir(reponseRequete);
                                                        }
                                                        else    {
                                                                vueARafraichir.rafraichir(projets);
                                                        }                                               
                                                }
                                        }
                                }
                        });
                }               
        }
        
        public void ajouter(Projet projet) {
                String postDonneesEncodees = projet.obtenirChainePOST()+"&cmhl_ce_modifier_par="+utilisateurId;
                
                final JsonRestRequestBuilder rb = UtilDAO.construireRequetePost(SERVICE_NOM);
                rb.envoyerRequete(postDonneesEncodees, new JsonRestRequestCallback() {
                        @Override
                        public void surReponse(JSONValue reponseValeur) {
                                traiterReponse(reponseValeur, "ajout_projet");
                        }
                }) ;
        }
        
        public void modifier(Projet projet) {
                String[] parametres = {projet.getId()};
                final JsonRestRequestBuilder rb = UtilDAO.construireRequetePost(SERVICE_NOM, parametres);
                
                String postDonneesEncodees = projet.obtenirChainePOST()+"&cmhl_ce_modifier_par="+utilisateurId;
                
                rb.envoyerRequete(postDonneesEncodees, new JsonRestRequestCallback() {
                        @Override
                        public void surReponse(JSONValue reponseValeur) {
                                traiterReponse(reponseValeur, "modif_projet");
                        }
                });
        }

        public void supprimer(String projetsId) {
                String[] parametres = {utilisateurId, projetsId};
                final JsonRestRequestBuilder rb = UtilDAO.construireRequetePost(SERVICE_NOM, parametres);
                rb.envoyerRequeteSuppression(new JsonRestRequestCallback() {
                        @Override
                        public void surReponse(JSONValue reponseValeur) {
                                traiterReponse(reponseValeur, "suppression_projet");
                        }
                });
        }
        
        private void traiterReponse(JSONValue reponseValeur, String type) {
                Information info = new Information(type);
                String idsNonSuppr = "";
                
                // Si la requête est un succès, réception d'une chaîne
                if (type.equals("suppression_projet") && reponseValeur.isArray() != null)       {
                        JSONArray tableauInfo = reponseValeur.isArray();
                        idsNonSuppr = tableauInfo.get(0).isString().stringValue();
                } else if (reponseValeur.isString() != null) {
                        String idOuMessage = reponseValeur.isString().stringValue();
                        if (idOuMessage.matches("^[0-9]+$")) {
                                info.setDonnee(idOuMessage);
                        } else {
                                info.setDonnee("");
                                info.setMessage(idOuMessage);
                        }
                } else {
                        info.setDeboguage("La réponse n'est pas une chaine JSON.");
                }
                info.setDonnee(1, idsNonSuppr);
                vueARafraichir.rafraichir(info);
        }
}