Subversion Repositories eFlore/Applications.coel

Rev

Rev 1373 | Rev 1468 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1320 gduche 1
package org.tela_botanica.client.synchronisation;
2
 
3
import java.util.HashMap;
4
import java.util.LinkedList;
5
import java.util.List;
6
 
7
import org.tela_botanica.client.Mediateur;
8
import org.tela_botanica.client.RegistreId;
9
import org.tela_botanica.client.interfaces.Rafraichissable;
10
import org.tela_botanica.client.modeles.Information;
11
import org.tela_botanica.client.util.Debug;
12
 
13
import com.extjs.gxt.ui.client.Registry;
14
import com.extjs.gxt.ui.client.widget.Info;
15
import com.google.gwt.core.client.GWT;
16
import com.google.gwt.user.client.Window;
17
 
18
public class Sequenceur implements Rafraichissable{
19
 
20
	private HashMap<Integer, Requete> requetes;
21
	private int numeroSequence;
22
	private int marqueurRetour = 1;
23
	private Mediateur mediateur = (Mediateur) Registry.get(RegistreId.MEDIATEUR);
24
 
25
	public Sequenceur()	{
26
		requetes = new HashMap<Integer, Requete>();
27
		numeroSequence = 0;
28
	}
29
 
30
	// Retourne le numéro du séquenceur
31
	public int lancerRequeteSynchrone(Rafraichissable vueARafraichir)	{
32
		if (numeroSequence == 0)	{
33
			mediateur.activerChargement("Chargement en cours... Veuillez patienter");
34
		}
35
 
36
		numeroSequence++;
1367 cyprien 37
		if (Mediateur.DEBUG) System.out.println("==> Sequenceur : Envoi requete n°" + numeroSequence);
1320 gduche 38
		Requete requete = new Requete(vueARafraichir, numeroSequence);
39
		requetes.put(numeroSequence, requete);
1367 cyprien 40
 
1320 gduche 41
		return numeroSequence;
42
	}
43
 
1373 cyprien 44
	//Offrir la possibilité d'enfiler (=mettre à la fin d'une file d'attente) un rafraichissement dont on a déjà le retour
45
	public int enfilerRafraichissement(Rafraichissable vueARafraichir, Object nouvellesDonnees)	{
1320 gduche 46
		if (numeroSequence == 0)	{
47
			mediateur.activerChargement("Chargement en cours... Veuillez patienter");
48
		}
49
		numeroSequence++;
1367 cyprien 50
		if (Mediateur.DEBUG) System.out.println("|| Sequenceur : Empiler n°" + numeroSequence);
1320 gduche 51
		Requete requete = new Requete(vueARafraichir, numeroSequence);
52
		Reponse reponse = new Reponse(nouvellesDonnees, numeroSequence);
53
		requetes.put(numeroSequence, requete);
54
		rafraichir(reponse);
1367 cyprien 55
		mediateur.desactiverChargement();
1320 gduche 56
		return numeroSequence;
57
	}
58
 
59
	public void rafraichir(Object nouvellesDonnees) {
1367 cyprien 60
 
1320 gduche 61
		try	{
62
			Reponse reponse = (Reponse) nouvellesDonnees;
1367 cyprien 63
			if (Mediateur.DEBUG) System.out.println("<== Sequenceur : Réception d'une réponse, n°" + reponse.obtenirNumeroSequence() + ", marqueur retour " + marqueurRetour);
1320 gduche 64
 
65
			if (reponse.obtenirNumeroSequence() == marqueurRetour)	{
66
				// Si le numéro de séquence du retour correspond au marqueur, on rafraichit
67
				Requete requete = requetes.get(marqueurRetour);
1367 cyprien 68
				if (Mediateur.DEBUG) System.out.println("<|-- Sequenceur : Retourne paquet n°"+reponse.obtenirNumeroSequence()+" à "+requete.getVueARafraichir().getClass().toString());
69
				requete.rafraichir(reponse.obtenirRetour());
70
				mediateur.desactiverChargement();
1320 gduche 71
				requetes.remove(marqueurRetour);
72
				marqueurRetour++;
73
				avancerSequence();
74
			} else {
75
				// Sinon, on enregistre le retour
76
				requetes.get(reponse.obtenirNumeroSequence()).setRetour(reponse);
77
			}
78
		} catch (ClassCastException e)	{
1367 cyprien 79
			if (Mediateur.DEBUG) {
80
				System.out.println("<== Sequenceur : Réception d'une réponse incorrecte");
81
				System.out.println("    Le séquenceur ne peut recevoir que des Reponse");
82
				System.out.println("    > nouvellesDonnees = "+nouvellesDonnees.getClass().toString());
83
			}
84
			mediateur.desactiverChargement();
1320 gduche 85
		}
86
	}
87
 
88
	public int obtenirNumeroSequence()	{
89
		return this.numeroSequence;
90
	}
91
 
92
	public void avancerSequence()	{
93
		if (requetes.size()>0)	{
1367 cyprien 94
			// on récupère la première requete dans la file
1320 gduche 95
			Requete premiereRequete = requetes.get(marqueurRetour);
1367 cyprien 96
			if (premiereRequete!=null && premiereRequete.hasResponse())	{
97
				if (Mediateur.DEBUG) System.out.println("<|-- Sequenceur : Retourne paquet n°"+premiereRequete.obtenirReponse().obtenirNumeroSequence()+" à "+premiereRequete.getVueARafraichir().getClass().toString());
1320 gduche 98
				premiereRequete.rafraichir();
1367 cyprien 99
				mediateur.desactiverChargement();
1320 gduche 100
				requetes.remove(marqueurRetour);
101
				marqueurRetour++;
102
				avancerSequence();
103
			}
1367 cyprien 104
		}
1320 gduche 105
	}
106
 
107
 
108
}