[Java][GWT] RequestBuilder

Fermé
matthoffman Messages postés 405 Date d'inscription lundi 24 mars 2008 Statut Membre Dernière intervention 22 janvier 2013 - Modifié par matthoffman le 12/09/2011 à 11:33
matthoffman Messages postés 405 Date d'inscription lundi 24 mars 2008 Statut Membre Dernière intervention 22 janvier 2013 - 12 sept. 2011 à 16:39
Bonjour,

Je cherche a lire un fichier texte; utilisant Google Web Toolkit je suis donc oblige d'utiliser le request builder.
Je cherche dans un premier temps a lire le fichier, remplir un TreeMap, puis renvoyer ce TreeMap.

Mon problem est le suivant: Le treeMap est D'ABORD retourne, puis ENSUITE le fichier est lu ...
Je me dis que cela vient du fait que le temps que la requete s'execute le resultat est d'abord retourne.

J'ai donc essayer un Thread.sleep() mais visiblement GWT ne le supporte pas.

Je suis donc bien embete :(.
Voici les codes:


public TreeMap<String, String> getItems() {  
        return items;  
    }  
      
public void parseHgrp2() {  
        try {  
            new RequestBuilder(RequestBuilder.GET, "tst.lov").sendRequest("", new RequestCallback() {  
                @Override  
                public void onResponseReceived(Request req, Response resp) {  
                    String text = resp.getText();  
                      
                    String[] lines = text.split(new StringBuffer("").append('\r').append('\n').toString());
                      
                    for (int i = 0; i < lines.length; i++) {  
                        if (lines[i].length() > 0) {  
                            String[] infos = lines[i].split(new StringBuffer("").append('\t').toString());  
                            if (infos.length >= 2)  
                                items.put(infos[0], infos[1]);  
                            else  
                                items.put(infos[0], "");  
                        }  
                    }  
                }  

                @Override  
                public void onError(Request res, Throwable throwable) {  
                }  
            });  
        } catch (RequestException e) {  
            e.printStackTrace();  
        }  
    }


Et le code dans mon programme principal:

LovParser lp = new LovParser();  
lp.parseHgrp2();  
TreeMap<String, String> items = lp.getItems();  


Merci d'avance a ceux qui m'aideront parce que je sais plus trop quoi faire ... :(

A voir également:

3 réponses

KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
Modifié par KX le 12/09/2011 à 13:22
J'avoue ne pas connaître le GWT, et donc je ne peux pas tester. Cependant tu peux essayer de renvoyer l'arbre en sortie de la méthode qui le construit...

De plus, plutôt que d'utiliser split qui te créé dans le tableau lines une copie de text, j'ai utilisé Scanner qui est bien plus efficace pour lire ligne par ligne. D'ailleurs ta construction de split avec ton StringBuffer est assez moche, tu peux directement mettre ton pattern dans un String. De plus tu peux limiter le nombre de String en retour, par exemple pour ton deuxième split tout ce qui est après infos[1] tu ne t'en sers pas, donc autant mettre tout ce qui reste dans infos[2] c'est plus rapide.

À étudier, sans garantie que ça regle ton problème ;-)
import java.util.Scanner;
import java.util.TreeMap;

public class LovParser 
{	
	public final TreeMap<String, String> items;
	
	public LovParser()
	{
		items = new TreeMap<String, String>();
	}
	
	public TreeMap<String,String> parseHgrp2()
	{
		RequestCallback rcb = new RequestCallback()
		{  
	        @Override  
	        public void onResponseReceived(Request req, Response resp)
	        {
	            Scanner sc = new Scanner(resp.getText());
	            while (sc.hasNextLine())
	            {
	            	String[] infos = sc.nextLine().split("[\\t]",3);
	            	
	            	switch (infos.length)
	            	{
	            	case 0 : break;
	            	case 1 : items.put(infos[0], ""); break;
	            	default: items.put(infos[0], infos[1]);
	            	}
	            }
	            sc.close();
	        }
	
	        @Override  
	        public void onError(Request res, Throwable throwable) 
	        {
	        }  
	    }; 
	    
	    try 
	    { 
	        new RequestBuilder(RequestBuilder.GET, "tst.lov").sendRequest("", rcb);
	    } 
	    catch (RequestException e) 
	    {  
	        e.printStackTrace();
	    }  
	    
	    return items;
	}

	public static void main(String...args)
	{
		 TreeMap<String,String> items = new LovParser().parseHgrp2(); 
	}
}
La confiance n'exclut pas le contrôle
0
matthoffman Messages postés 405 Date d'inscription lundi 24 mars 2008 Statut Membre Dernière intervention 22 janvier 2013 47
Modifié par matthoffman le 12/09/2011 à 16:48
Tout d'abord bonjour et merci de passer du temps sur mon probleme.

Plusieurs choses:

1) J'ai oublie de le preciser etant donne que ca ne concerne pas directement mon probleme mais GWT ne supporte malheureusement pas grand chose de Java (bien qu'au fur et a mesure des versions certaines fonctions vitales apparaissent).
Et donc tu le devineras, je sais que j'ai code comme un porc mais je n'ai pas le choix ^^. Scanner n'etant pas supporte par GWT je ne peux donc pas l'utiliser ...

Si tu voyais comment j'ai depoper mon TreeMap, c'est un assassinat a la ref Java (pollfirstentry n'etant pas supporte par GWT, j'ai du d'abord recuperer la 1ere key, puis sa valeur associee puis ensuite depoper le set <K, V>. Enfin bref un grand n'importe quoi).

2) Edit: J'avais mal lu l'histoire de la petite opti pour split. Merci pour l'astuce je corrige ca, *normalement* le fichier est cense etre bien forme ^^ !

3) Renvoyer l'arbre en sortie du parser etait une solution que j'avais aussi envisagee, mais etant donne que le renvoit se fait en dehors de la requete le probleme est le meme, la fonction va directement renvoyer un arbre vide parce qu'il n'aura pas attendu la reponse.
Et sans Thread.Sleep() et ba c'est la mouise ...

Du coup cette implementation ne fonctionne pas *avec GWT* :(
0
matthoffman Messages postés 405 Date d'inscription lundi 24 mars 2008 Statut Membre Dernière intervention 22 janvier 2013 47
Modifié par matthoffman le 12/09/2011 à 16:40
Je fais un double post (je sais c'est pas bien), mais c'est pour la lisibilite.

C'est juste pour vous dire, etant donne que je ne voyais pas vraiment comment "attendre" le reponse a la requete, j'ai mis le chargement du TreeMap dans la "fonction d'initialisation" (grossomodo), et la recuperation du TreeMap dans une fonction evenementielle (qui ne peut donc se declencher qu'apres initialisation).

Cela regle donc le probleme que j'ai. Mais bon j'ai bien peur que cette solution ne soit tres "reliable" (j'en perds mon francais ...)

Donc je reste ouvert a toute autre proposition :) et remercie KX !
0