Hi! I've just re-read your reply, but I cant understand how the
interface would affect the program, and how would I use that new
getDocument() method of the XmlUtilParser class. Could you provide
another example (a working one, if possible)?

This whole AsyncCallback/asynchronous stuff of GWT is driving me nuts.
I've created the same parser using a service, and Java's own DOM
parser, and it works already, however I really want to develop this
app of mine full GWT-style. Hope you could help me again, thanks.

On Nov 10, 5:58 pm, Jason Morris <[EMAIL PROTECTED]> wrote:
> Heya,
>
> Your basic problem here is that you can't have your XmlParserUtil return a
> Document object. The doc field will only be filled in when the async
> RequestBuilder request returns and the parser is finished with the XML string.
> By that time, your method has already returned.
>
> The only way to solve this is to create something like a:
>
> public interface Callback<V> {
>         void callback(V value);
>
> }
>
> and have the XmlParserUtil look something more like this:
>
> public class XmlParserUtil {
>         String url;
>         Document doc;
>         public RequestBuilder requestBuilder;
>         String xmlStr;
>
>         public XmlParserUtil(String xmlFileName) {
>                 this.url = xmlFileName;
>         }
>
>         public void getDocument(Callback<Document> callback) {
>                 if(doc != null) {
>                         callback.callback(doc);
>                         return;
>                 }
>
>                 try {
>                         requestBuilder = new 
> RequestBuilder(RequestBuilder.GET,url);
>                         requestBuilder.sendRequest(null,new RequestCallback()
>                         {public void onResponseReceived(Request arg0, 
> Response arg1) {
>                                 xmlStr = arg1.getText();
>                                 callback.callback(doc = 
> XMLParser.parse(xmlStr));
>                         }
>                         public void onError(Request request, Throwable 
> exception) {
>
>                         }});
>                 }
>                 catch (RequestException ex) {
>                         GWT.log(ex.getMessage(), ex);
>             }
>         }
>
> }
>
> For more information about async problems, it's related to RPC, but applicable
> to the RequestBuilder as well:
>
> http://lemnik.wordpress.com/2008/07/04/gwt-rpc-is-called-aynchronous-...
>
> mives29 wrote:
> > okay, let me be clear on this, again, my code. (now posting full
> > reworked source code)
>
> > // A composite w/c contains a tree.
> > public class TreeX extends Composite {
> >    Document doc;
> >    Tree t = new Tree();
> >    int imgUris;
> >    XmlParserUtil xmlParser;
> >    public TreePol() {
> >            TreeItem tItem = getTreeItem();
> >            t.addItem(tItem);
> >            initWidget(t);
> >    }
> >    private TreeItem getTreeItem() {
> >            doc = getDoc();
> >            imgUris = doc.getElementsByTagName("Image").getLength();
> >            TreeItem root = null;
> >            root = new TreeItem("Image Names");
> >            for (int i=0;i<imgUris;i++) {
> >                    String tmpImgUri =
> > doc.getElementsByTagName("Image").item(i).getChildNodes().item(1).toString();
> >                    root.addItem(tmpImgUri);
> >            }
> >            return root;
> >    }
> >    public Document getDoc() {
> >            xmlParser = new XmlParserUtil("image_uris.xml");
> >              while (doc==null) {
> >                      doc = xmlParser.getDocument();
> >              }
> >            return doc;
> >    }
> > }
>
> > //A class that i want to use as a utility class for parsing xml
> > documents. intended to be reusable
> > public class XmlParserUtil {
> >    String url;
> >    Document doc;
> >    public RequestBuilder requestBuilder;
> >    String xmlStr;
>
> >    public XmlParserUtil(String xmlFileName) {
> >            this.url = xmlFileName;
> >    }
>
> >    public Document getDocument() {
> >            try {
> >                    requestBuilder = new 
> > RequestBuilder(RequestBuilder.GET,url);
> >                    requestBuilder.sendRequest(null,new RequestCallback()
> >                    {public void onResponseReceived(Request arg0, Response 
> > arg1) {
> >                            xmlStr = arg1.getText();
> >                            doc = XMLParser.parse(xmlStr);
> >                    }
> >                    public void onError(Request request, Throwable 
> > exception) {
>
> >                    }});
> >            }
> >            catch (RequestException ex) {
> >                    GWT.log(ex.getMessage(), ex);
> >        }
> >            return doc;
> >    }
> > }
>
> > //my entrypoint's onModuleLoad(), which adds the various custom
> > widgets i made to a tab panel
>
> > public void onModuleLoad() {
> >      RichTextAreaX1 rtaPol = new RichTextAreaX1();
> >      PictureViewer imgBrowser = new PictureViewer();
> >      TreeX tree = new TreeX();
>
> >      TabPanel tp = new TabPanel();
> >      tp.add(tree, "1");
> >      tp.add(rtaPol, "2");
> >      tp.add(imgBrowser, "3");
>
> >      tp.selectTab(0);
> >      tp.setWidth("100%");
>
> >      RootPanel.get("leftpanel").add(tp);
> >   }
>
> > as you can see, I intend the XmlParserUtil class to be reusable. If I
> > place there various logic, then it would be out of scope for that
> > classs, because I intend to use XmlParserUtil just to parse an XML
> > file, and bring me back a parsed Document object. now how would I do
> > that if XmlParserUtil, which contains the requestbuilder and callback,
> > would be used by another class (which is a composite).
>
> > im new to this async thing, more so the  requestbuilder stuff. thank
> > you for replying, i hope you could answer my question.
>
> > On Nov 10, 3:44 pm, "alex.d" <[EMAIL PROTECTED]> wrote:
> >> You have to accept the asynchronous nature of RPC-Requests in GWT and
> >> stop trying to build smth. synchronous around them. This code:
> >> -----------------------------------
> >> doc = getDoc(); //(where doc is a Document object)
> >> String subject =
> >> doc.getElementsByTagName("Image").item(0).getChildNodes().item(1).toString();
> >> String subject2 =
> >> doc.getElementsByTagName("Image").item(1).getFirstChild().getNodeValue();
> >> -----------------------------------
> >> should not be executed in the onload-routine but in the
> >> onResponseReceived()-method (or in any other procedure that you call
> >> out of it).
>
> >> On 10 Nov., 07:12, mives29 <[EMAIL PROTECTED]> wrote:
>
> >>> hi all. ive re-done my code just a while ago(been a busy week) and my
> >>> code kinda bothers me.  here's the code re-done:
> >>> Entrypoint onModuleLoad() method:
> >>> doc = getDoc(); //(where doc is a Document object)
> >>> String subject =
> >>> doc.getElementsByTagName("Image").item(0).getChildNodes().item(1).toString();
> >>> String subject2 =
> >>> doc.getElementsByTagName("Image").item(1).getFirstChild().getNodeValue();
> >>> Entrypoiny getDoc() method:
> >>> public Document getDoc() {
> >>>           XmlParserUtil xmlParser = new XmlParserUtil("image_uris.xml");
> >>>           int i = 0;
> >>>           while (doc==null) {
> >>>                   doc = xmlParser.getDocument();
> >>>           }
> >>>         return doc;
> >>>   }
> >>> here's the service implementation:
> >>> public class XmlParserUtil {
> >>>         String url;
> >>>         Document doc;
> >>>         RequestBuilder requestBuilder;
> >>>         public String xmlStr;
> >>>         public XmlParserUtil(String xmlFileName) {
> >>>                 this.url = xmlFileName;
> >>>         }
> >>>         public Document getDocument() {
> >>>                 RequestCallback xmlRcb = new RequestCallback()
> >>>                 {public void onResponseReceived(Request arg0, Response 
> >>> arg1) {
> >>>                         xmlStr = arg1.getText();
> >>>                         doc = XMLParser.parse(xmlStr);
> >>>                 }
> >>>                 public void onError(Request request, Throwable exception) 
> >>> {
> >>>                         // TODO Auto-generated method stub
> >>>                 }};
> >>>                 try {
> >>>                         requestBuilder = new 
> >>> RequestBuilder(RequestBuilder.GET,url);
> >>>                         requestBuilder.sendRequest(null,xmlRcb);
> >>>                 }
> >>>                 catch (RequestException ex) {
> >>>                         GWT.log(ex.getMessage(), ex);
> >>>             }
> >>>                 return doc;
> >>>         }
> >>> }
> >>> my problem is on the Entrypoint logic. you see the getDoc() method
> >>> there?
> >>> it has this:
> >>>           while (doc==null) {
> >>>                   doc = xmlParser.getDocument();
> >>>           }
> >>> which just loops around until the service implementation has already
> >>> populated the parsed document.
> >>> what bothers me with this code is that it seems to break AJAX. the
> >>> execution "stays" here until the document object is not null anymore,
> >>> which kills the purpose of using AJAX (coz it seems not asynchronous
> >>> anymore).
> >>> is there any lister that i can implement on my entrypoint class that
> >>> "listens" if the service has already received a reply? (or a listener
> >>> of that sort)
> >>> thanks in advance.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/Google-Web-Toolkit?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to