Subversion Repositories eFlore/Applications.coel

Rev

Rev 1415 | 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()     {
                requetes = new HashMap<Integer, Requete>();
                numeroSequence = 0;
        }
        
        // Retourne le numéro du séquenceur
        public int lancerRequeteSynchrone(Rafraichissable vueARafraichir)       {
                
                if (Mediateur.DEBUG_CHARGEMENT) System.out.println("[CHARGEMENT] lancerRequeteSynchrone("+vueARafraichir.getClass().getName()+")");
                //if (numeroSequence == 0)      {
                        mediateur.activerChargement(this, "Chargement en cours... Veuillez patienter");
                //}
                
                numeroSequence++;
                if (Mediateur.DEBUG) System.out.println("==> Sequenceur : Envoi requete n°" + numeroSequence);
                Requete requete = new Requete(vueARafraichir, numeroSequence);
                requetes.put(numeroSequence, requete);
                
                return numeroSequence;
        }
        
        //Offrir la possibilité d'enfiler (=mettre à la fin d'une file d'attente) un rafraichissement dont on a déjà le retour
        public int enfilerRafraichissement(Rafraichissable vueARafraichir, Object nouvellesDonnees)     {
                //if (numeroSequence == 0)      {
                        mediateur.activerChargement(this, "Chargement en cours... Veuillez patienter");
                //}
                numeroSequence++;
                if (Mediateur.DEBUG) System.out.println("|| Sequenceur : Empiler n°" + numeroSequence);
                Requete requete = new Requete(vueARafraichir, numeroSequence);
                Reponse reponse = new Reponse(nouvellesDonnees, numeroSequence);
                requetes.put(numeroSequence, requete);
                rafraichir(reponse);
                mediateur.desactiverChargement(this);
                return numeroSequence;
        }
        
        public void rafraichir(Object nouvellesDonnees) {

                try     {
                        Reponse reponse = (Reponse) nouvellesDonnees;
                        if (Mediateur.DEBUG) System.out.println("<== Sequenceur : Réception d'une réponse, n°" + 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);
                                if (Mediateur.DEBUG) System.out.println("<|-- Sequenceur : Retourne paquet n°"+reponse.obtenirNumeroSequence()+" à "+requete.getVueARafraichir().getClass().toString());
                                mediateur.desactiverChargement(this);
                                requete.rafraichir(reponse.obtenirRetour());
                                requetes.remove(marqueurRetour);
                                marqueurRetour++;
                                avancerSequence();
                        } else {
                                // Sinon, on enregistre le retour
                                requetes.get(reponse.obtenirNumeroSequence()).setRetour(reponse);
                        }
                } catch (ClassCastException e)  {
                        if (Mediateur.DEBUG) {
                                System.out.println("<== Sequenceur : Réception d'une réponse incorrecte");
                                System.out.println("    Le séquenceur ne peut recevoir que des Reponse");
                                System.out.println("    > nouvellesDonnees = "+nouvellesDonnees.getClass().toString());
                        }
                        mediateur.desactiverChargement(this);
                }
        }
        
        public int obtenirNumeroSequence()      {
                return this.numeroSequence;
        }
        
        public void avancerSequence()   {
                if (requetes.size()>0)  {
                        // on récupère la première requete dans la file
                        Requete premiereRequete = requetes.get(marqueurRetour);
                        if (premiereRequete!=null && premiereRequete.hasResponse())     {
                                if (Mediateur.DEBUG) System.out.println("<|-- Sequenceur : Retourne paquet n°"+premiereRequete.obtenirReponse().obtenirNumeroSequence()+" à "+premiereRequete.getVueARafraichir().getClass().toString());
                                premiereRequete.rafraichir();                           
                                mediateur.desactiverChargement(this);
                                requetes.remove(marqueurRetour);
                                marqueurRetour++;
                                avancerSequence();
                        } 
                }               
        }
        
        
}