Subversion Repositories eFlore/Applications.cel

Rev

Rev 1317 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package org.tela_botanica.client.modeles.dao;

import java.util.Iterator;

import org.tela_botanica.client.image.ImageModele;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.objets.Configuration;
import org.tela_botanica.client.modeles.objets.ImageCarnet;
import org.tela_botanica.client.modeles.objets.ListeImageCarnet;
import org.tela_botanica.client.modeles.objets.Utilisateur;

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.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONValue;

/**
 * Data Object Access communiquant avec le serveur jrest fournissant la liste
 * des images répondant à des critères donné
 * 
 * @author aurelien
 * 
 */
public class ListeImageAsynchroneDAO {

        /**
         * Le modèle associé au DAO
         */
        ImageModele iModele = null;

        public ListeImageAsynchroneDAO(ImageModele im) {
                iModele = im;
        }

        /**
         * Setteur pour le modèle
         * 
         * @param im
         * le modèle à associer
         */
        public void setIModele(ImageModele im) {
                iModele = im;
        }

        /**
         * Envoie une requete au serveur jrest pour obtenir une liste d'images
         * correspondant à des critères demandés
         * 
         * @param r
         * le rafraichissable qui a demandé les données
         * @param criteres
         * un tableau contenant les critères de selections
         */
        public void ObtenirListeImages(final Rafraichissable r, String[][] criteres) {

                String requete = "";

                // on construit les paramètres du get
                if (criteres != null) {
                        for (int i = 0; i < criteres.length; i++) {

                                if (!criteres[i][1].equals("")) {
                                        if (i != 0) {
                                                requete += "&";
                                        }
                                        requete += criteres[i][0] + "=" + criteres[i][1];

                                }
                        }
                }

                // on envoie le get asynchrone
                RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, Configuration.getServiceBaseUrl()
                                + "/InventoryImageList/"
                                + Utilisateur.getInstance().getIdentifiantUtilisateurConsulte()
                                + "/?"
                                + requete);
                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 ListeImageCarnet photoData;

                                        final JSONValue responseValue = JSONParser.parse(response
                                                        .getText());
                                        // si c'est un tableau
                                        if (responseValue.isArray() != null) {

                                                final JSONArray reponse = responseValue.isArray();

                                                final int taillemax = reponse.size();
                                                photoData = new ListeImageCarnet(taillemax);

                                                // on le parcourt
                                                for (int j = 0; j < taillemax; j++) {

                                                        JSONObject image = (JSONObject) reponse.get(j);

                                                        ImageCarnet im = new ImageCarnet(image);

                                                        // et on en extrait les données pour construire la
                                                        // liste d'image
                                                        photoData.put(im.getOrdre(), im);

                                                }
                                        } else {
                                                // si c'est un objet alors il n'y a qu'une réponse
                                                if (responseValue.isObject() != null) {
                                                        photoData = new ListeImageCarnet(1);
                                                        ImageCarnet im = new ImageCarnet(responseValue
                                                                        .isObject());
                                                        // on crée une liste de 1 élement auquel on ajoute
                                                        // ce qui a été reçu
                                                        photoData.put(im.getOrdre(), im);
                                                } else {
                                                        // sinon on crée une liste vide
                                                        photoData = new ListeImageCarnet(0);
                                                }
                                        }

                                        // dans tous les cas on transmet la liste crée au
                                        // rafraichissable en lui demandant de répandre les données
                                        // car il est
                                        // le premier à les recevoir
                                        r.rafraichir(photoData, true);
                                }
                        });

                } catch (RequestException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }

        /**
         * Met à jour les valeurs d'une liste d'image donnée dans la base de données
         * 
         * @param li
         *            la liste d'image à synchroniser avec la base
         */
        public void SynchroniserBaseDeDonnees(ListeImageCarnet li) {
                // on parcourt toute la liste d'image
                for (Iterator<String> listIt = li.keySet().iterator(); listIt.hasNext();) {
                        String postData = "";

                        ImageCarnet enCours = li.get(listIt.next());

                        String[][] champsModifiables = enCours.obtenirChampsModifiablesImage();
                        for (int i = 0; i < champsModifiables.length; i++) {
                                postData += "&"+champsModifiables[i][0]+"="+champsModifiables[i][1];
                        }

                        // on fait un post asynchrone et on les envoie à jrest
                        RequestBuilder rb = new RequestBuilder(RequestBuilder.POST,
                                        Configuration.getServiceBaseUrl()
                                        + "/inventoryImage/" + Utilisateur.getInstance().getIdentifiantUtilisateurConsulte() + "/");

                        try {
                                rb.sendRequest(postData, new RequestCallback() {

                                        @Override
                                        public void onError(Request request, Throwable exception) {

                                        }

                                        @Override
                                        public void onResponseReceived(Request request,
                                                        Response response) {

                                                if (response.getText().equals("OK")) {
                                                        return;
                                                } else {
                                                        com.google.gwt.user.client.Window
                                                                        .alert("Problème lors de la mise à jour des données");
                                                }

                                        }

                                });
                        } catch (RequestException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                }
        }

        /**
         * Supprime des image sur le serveur par rapport à leur identifant
         * 
         * @param ids
         *            un tableau d'identifiants d'images à supprimer
         */
        public void supprimerBaseDeDonnees(String[] ids) {
                String postData = "";
                // on fait un delete dans le post (jrest ne gère pas delete comme une
                // action à part entière)
                postData += "&action=DELETE";

                String uid = "";

                // on concatène les ids
                for (int i = 0; i < ids.length; i++) {

                        uid += ids[i] + ",";
                }

                // et on envoie ça au serveur
                RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, Configuration.getServiceBaseUrl()
                                + "/inventoryImageList/" + Utilisateur.getInstance().getIdentifiantUtilisateurConsulte() + "/" + uid);
                try {
                        rb.sendRequest(postData, new RequestCallback() {

                                @Override
                                public void onError(Request request, Throwable exception) {
                                        // TODO Auto-generated method stub

                                }

                                @Override
                                public void onResponseReceived(Request request,
                                                Response response) {

                                        // quand la requête est éxecutée on le signale au modèle
                                        // poru qu'il mette à jour les données
                                        // et en notifie le médiateur
                                        iModele.requeteTerminee();

                                }
                        });

                } catch (RequestException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }

}