Search code examples
gwtjavascript-objectssmartgwt

SmartGWT not able to parse data in the DataSource.transformResponse() method


I need some help please...

I am working with a GWT enabled web application. I am using the gwt-2.3.0 SDK.

I have a method that extends the DataSource class and uses the transformResponse method:

public class DeathRecordXmlDS extends DataSource { 

 protected void transformResponse(DSResponse response, DSRequest request, Object data){
     super.transformResponse(response, request, data);
 } 

}

As I understand, the transformResponse() method should get control and at this point, I will have access to the data that is being provided to the Client side of my application. I am trying to work with the Object data parameter (the third parameter) that is passed in.

I am expecting an XML formatted string to be passed in. The XML will contain data (a count field) that I need to access and use.

I don't seem to be getting an XML string. Here's what I know...

I do see the XML data being passed to my webapp (the client). I can see this because I inspect the webpage that I am working with and I see the Response data. Here's an example of something that I expect to receive:

XML data from Query:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Collection numRecords="0">
    <DeathRecords/>
</Collection>

The above XML is valid (I checked it in a Validator). This is a case where there was no data (No Death Records) being returned to my application. The numRecords XML attribute is set to "0". Of course, If I do have records returned the numRecords will contain the number of records and I'll get that same number of DeathRecord nodes.

I am not getting the above data (or, I don't know how to work with it) in the transformResponse() method.

Here's what I've done to try to figure this out...

The Object data parameter... it is a JavaScriptObject. I know this because I did a .getClass().getName() on it:

DeathRecordXmlDS::transformResponse()      data.getClass().getName(): com.google.gwt.core.client.JavaScriptObject$

Then, to try to work with it, I converted it to a String:

        com.google.gwt.core.client.JavaScriptObject dataJS = (com.google.gwt.core.client.JavaScriptObject)data;
    System.out.println("DeathRecordXmlDS::transformResponse()     data as a JavaScriptObject: "+dataJS.toString());

The contents of 'data' formatted as a String look like:

DeathRecordXmlDS::transformResponse()     data as a JavaScriptObject: [XMLDoc <Collection>]

So, it looks like I have something that has to do with my 'Collection' node, but not a String of XML data that I can parse and get to my numRecords attribute.

What do I need to do to gain access to the XML in the transformResponse() method?

Thanks!


Solution

  • After working on this for an additional period of time I was able to read the XML data that I am working with. I used the following piece of code:

        try{
            JsArray<JavaScriptObject> nodes = ((JavaScriptObject) XMLTools.selectNodes(data, "/Collection/@numRecords")).cast();
    
            for (int i = 0; i < nodes.length(); i++) {
              com.google.gwt.dom.client.Element element = (com.google.gwt.dom.client.Element) nodes.get(i);
    
              numRecords = element.getNodeValue();
            }
    
        } catch(Exception e){
            //  If Parsing fails, capture the exception 
            System.out.println("DeathRecordXmlDS::transformResponse()     Not able to parse the XML");  
        }
    

    I think the first step to solving this was understanding that the parameter 'data' of type Object was really a JavaScriptObject. I learned this after looking at the .getClass() and .getName(). This helped me understand what I was working with:

    System.out.println("DeathRecordXmlDS::transformResponse()     data.getClass().getName(): "+data.getClass().getName());
    

    Once I knew it was a JavaScriptObject, I was able to do a little more focused of a Google search for what I was trying to accomplish. I was a little surprised that the XMLTools.selectNodes() function worked the way it did, but the end result is that I was able to read the numRecords attribute.

    Thanks for the suggestion!