Subversion Repositories eFlore/Applications.coel

Rev

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

package org.tela_botanica.client.synchronisation;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;

import org.tela_botanica.client.Mediateur;
import org.tela_botanica.client.RegistreId;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.Information;
import org.tela_botanica.client.util.Debug;

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.user.client.Window;

public class Sequenceur implements Rafraichissable{

        private HashMap<Integer, Requete> requetes;
        private int numeroSequence;
        private int marqueurRetour = 1;
        private Mediateur mediateur = (Mediateur) Registry.get(RegistreId.MEDIATEUR);
        
        public Sequenceur()     {
                this.mediateur = mediateur;
                //requetes = new LinkedList<Requete>();
                requetes = new HashMap<Integer, Requete>();
                numeroSequence = 0;
        }
        
        // Retourne le numéro du séquenceur
        public int lancerRequeteSynchrone(Rafraichissable vueARafraichir)       {
                if (numeroSequence == 0)        {
                        mediateur.activerChargement("Chargement en cours... Veuillez patienter");
                }
                
                numeroSequence++;
                System.out.println("lancer Requete " + numeroSequence);
                Requete requete = new Requete(vueARafraichir, numeroSequence);
                //requetes.add(requete);
                requetes.put(numeroSequence, requete);
                return numeroSequence;
        }
        
        //Offrir la possibilité d'empiler à la suite des traitements un rafraichissement dont on a déjà le retour
        public int empilerRafraichissement(Rafraichissable vueARafraichir, Object nouvellesDonnees)     {
                if (numeroSequence == 0)        {
                        mediateur.activerChargement("Chargement en cours... Veuillez patienter");
                }
                numeroSequence++;
                System.out.println("empiler " + numeroSequence);
                Requete requete = new Requete(vueARafraichir, numeroSequence);
                Reponse reponse = new Reponse(nouvellesDonnees, numeroSequence);
                requetes.put(numeroSequence, requete);
                rafraichir(reponse);
                return numeroSequence;
        }
        
        public void rafraichir(Object nouvellesDonnees) {
                
                try     {
                        Reponse reponse = (Reponse) nouvellesDonnees;
                        System.out.println("rafraichir " + reponse.obtenirNumeroSequence() + " marqueur retour " + marqueurRetour);
                        
                        if (reponse.obtenirNumeroSequence() == marqueurRetour)  {
                                // Si le numéro de séquence du retour correspond au marqueur, on rafraichit
                                Requete requete = requetes.get(marqueurRetour);
                                requete.setRetour(reponse);
                                requete.rafraichir();
                                requetes.remove(marqueurRetour);
                                marqueurRetour++;
                                avancerSequence();
                        } else {
                                // Sinon, on enregistre le retour
                                requetes.get(reponse.obtenirNumeroSequence()).setRetour(reponse);
                                
                                // Vérifier que les requetes précédentes ont été exécutées si elles ont eues un retour
                                //avancerSequence();
                        }
                } catch (ClassCastException e)  {
                        Debug.log("Le séquencuer ne peut recevoir que des Reponse");
                }
        }
        
        public int obtenirNumeroSequence()      {
                return this.numeroSequence;
        }
        
        public void avancerSequence()   {
                if (requetes.size()>0)  {
                        Requete premiereRequete = requetes.get(marqueurRetour);
                        System.out.println("premiere Requete " + premiereRequete );
                        if (premiereRequete!=null && premiereRequete.aRetour()) {
                                premiereRequete.rafraichir();
                                requetes.remove(marqueurRetour);
                                marqueurRetour++;
                                avancerSequence();
                        } 
                } else {
                        mediateur.desactiverChargement();
                }
                
        }
        
        
}