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
-~----------~----~----~----~------~----~------~--~---