Hi there,

I've figured this out for myself, in case anyone else has the same problem,
I give my fix here.

For some inexplicable reason, requesting only some of the attributes for an
element to be bound causes inconsistent binding i.e.
<element id="one" name="element" size="2">
  ....
</element>

Requesting only id and name be bound causes one or more to NOT be bound to
the corresponding attribute in the Java class.  If you change this to bind
all (add fields to mapping file and attributes to Java Class), then the same
mapping will work fine, this is even though I'd set ignoring attributes to
true for hte unmarshaller i.e. 

     unmarshaller.setIgnoreExtraAttributes(true);

There may be a better way and if anyone knows of one then please do post a
reply.

MARK

CIAO



Mark Small wrote:
> 
> Hi there,
> 
> I am having a problem in regards to the binding of a number of values.  I
> have a rather complex bit of xml (to me it is anyway), upon Unmarshalling,
> I get no errors but some values are not being bound while others are.
> 
> Output of toString method (after Unmarshalling)
> =====================================
> Class Name: castor.mapping.namespace.csw.GetRecordsResponse
>       Attributes: 
>               result: Class Name: castor.mapping.namespace.csw.SearchResult
>               Attributes: 
>                       numberOfRecordsMatched: 0
>                       numberOfRecordsReturned: 0
>                       extrinsic: Class Name: 
> castor.mapping.namespace.csw.ExtrinsicObjectData
> Attributes: 
>                               id: 
> urn:uuid:64c67376-5814-49dd-b73c-1f046536795b
>                               objectType: 
> 
> From the output above it can be seen that I have a number of objects
> within objects.  The GetRecordsResponse class has one attribute
> (SearchResult), which itself contains 2 int attributes and an
> ExtrinsicObjectData attribute, which is itself a class which contains 2
> String attributes.  The xml I am trying to Unmarshall (See below for al
> code listings), contains a GetRecordsResponse element which contains the
> SearchResult element which contains numberOfRecordsMatched,
> numberOfRecordsReturned as attribute nodes and ExtrinsicObject as a child
> element.  The ExtrinsicObject element contains a number of attributes and
> child elements, most of which I don't care about at the moment.
> 
> At the moment I only care about the 2 int number of records attributes in
> the SearchResult element and the id and objectType attributes of the
> ExtrinsicObject element.
> 
> the problem is that the binding appears to be occurring without any errors
> yet still is unable to bind the correct values to the associated fields in
> my Java Classes.  The only value that is correctly bound is the id value,
> the zero values for the numberOfRecords... fields are set upon
> initialization of the SearchResult object in Java and not bound to any
> value in the xml, this is the same for the objectType field in the
> ExtrinsicObject object.
> 
> Any help is gratefully appreciated, cheers.
> 
> CODE LISTINGS
> ==============
> 
> JAVA CLASSES
> =============
> 
> public class GetRecordsResponse {
>   
>   private SearchResult result = new SearchResult();
> 
>   public SearchResult getResult() {
>     return this.result;
>   }
> 
>   public void setResult(SearchResult result) {
>     this.result = result;
>   }
>   
>   public String toString() {
>     StringBuilder msg = new StringBuilder();
>     msg.append("\nClass Name: " + getClass().getName() + "\n");
>     msg.append("\tAttributes: \n");
>     msg.append("\t\tresult: " + getResult().toString() + "\n");
>     
>     return msg.toString();
>   }
> } // End of class GetRecordsResponse.
> 
> 
> public class SearchResult {
> 
>   private int numberOfRecordsMatched = 0;
>   private int numberOfRecordsReturned = 0;
>   private ExtrinsicObjectData extrinsic = new ExtrinsicObjectData();
>   
>   public ExtrinsicObjectData getExtrinsic() {
>     return this.extrinsic;
>   }
>   
>   public void setExtrinsic(ExtrinsicObjectData extrinsic) {
>     this.extrinsic = extrinsic;
>   }
>   
>   public int getNumberOfRecordsMatched() {
>     return this.numberOfRecordsMatched;
>   }
>   
>   public void setNumberOfRecordsMatched(int numberOfRecordsMatched) {
>     this.numberOfRecordsMatched = numberOfRecordsMatched;
>   }
>     
>   public int getNumberOfRecordsReturned() {
>     return this.numberOfRecordsReturned;
>   }
> 
>   public void setNumberOfRecordsReturned(int numberOfRecordsReturned) {
>     this.numberOfRecordsReturned = numberOfRecordsReturned;
>   }
> 
>   public String toString() {
>     StringBuilder msg = new StringBuilder();
>     msg.append("Class Name: " + getClass().getName() + "\n");
>     msg.append("\t\tAttributes: \n");
>     msg.append("\t\t\tnumberOfRecordsMatched: " +
> getNumberOfRecordsMatched() + "\n");
>     msg.append("\t\t\tnumberOfRecordsReturned: " +
> getNumberOfRecordsReturned() + "\n");
>     msg.append("\t\t\textrinsic: " + getExtrinsic().toString() + "\n");
>     
>     return msg.toString();
>   }
> } // End of class SearchResult.
> 
> public class ExtrinsicObjectData {
> 
>   private String id = "";
>   private String objectType = "";
>   
>   public ExtrinsicObjectData() {}
>   
>   public ExtrinsicObjectData(String id, String objectType) {
>     setId(id);
>     setObjectType(objectType);
>   } 
>   
>   public String getId() {
>     return this.id;
>   }
>  
>   public void setId(String id) {
>     this.id = id;
>   }
>  
>   public String getObjectType() {
>     return this.objectType;
>   }
>  
>   public void setObjectType(String objectType) {
>     this.objectType = objectType;
>   }
>   
>   public String toString() {
>     StringBuilder msg = new StringBuilder();
>     msg.append("Class Name: " + getClass().getName() + "\n");
>     msg.append("Attributes: \n");
>     msg.append("\t\t\t\tid: " + getId() + "\n");
>     msg.append("\t\t\t\tobjectType: " + getObjectType() + "\n");
>     
>     return msg.toString();
>   }
> } // End of class ExtrinsicObject.
> 
> JUnit Test
> ========
> import java.io.FileReader;
> import java.io.IOException;
> 
> import org.apache.commons.logging.Log;
> import org.apache.commons.logging.LogFactory;
> import org.exolab.castor.mapping.Mapping;
> import org.exolab.castor.mapping.MappingException;
> import org.exolab.castor.xml.MarshalException;
> import org.exolab.castor.xml.Unmarshaller;
> import org.exolab.castor.xml.ValidationException;
> import org.junit.Test;
> 
> public class GetRecordsResponseTest {
>   
>   private static final Log log =
> LogFactory.getLog(GetRecordsResponseTest.class);
> 
>   @Test
>   public void testMapping() {
>     String filename =
> "src/test/resources/GetRecords-extrinsic-response.xml";
>     String mapfile =
> "src/test/resources/GetRecords-extrinsic-response-mapping.xml";
> 
>     try {
>       Mapping mapping = new Mapping();
>       mapping.loadMapping(mapfile);
>       
>       Unmarshaller unmarshaller = new Unmarshaller(mapping);
>       unmarshaller.setIgnoreExtraElements(true);
>       unmarshaller.setIgnoreExtraAttributes(true);
>       
>       GetRecordsResponse recordsResponse = 
>         (GetRecordsResponse)unmarshaller.unmarshal(new
> FileReader(filename));
>       
>       log.debug(recordsResponse.toString());
>     } catch(IOException ex) {
>       log.error("ERROR: Cannot read file: " + filename + ex); 
>     } catch(MappingException ex) {
>       log.error("ERROR: Cannot load mapping file: " + filename + ex); 
>     } catch(MarshalException ex) {
>       log.error("ERROR: Cannot Unmarshall file: " + filename + ex); 
>     } catch(ValidationException ex) {
>       log.error("ERROR: Cannot validate file: " + filename + ex); 
>     }
>   }
> } // End of class GetRecordsResponseTest.
> 
> MAPPING FILE
> ============
> 
> <?xml version="1.0" encoding="UTF-8"?>
> 
> <mapping xmlns="http://castor.exolab.org/";
>          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>          xmlns:csw="http://www.opengis.net/cat/csw";
>          xmlns:rim="urn:oasis:names:tc:ebxml-regrep:rim:xsd:2.5"
>          xsi:schemaLocation="http://castor.exolab.org/mapping.xsd";
>         
> csw:schemaLocation="http://schemas.cubewerx.com/schemas/csw/2.0.1/CSW-discovery.xsd";
>         
> rim:schemaLocation="http://schemas.cubewerx.com/schemas/ebrim/2.5/schema/rim.xsd";>
> 
>    <class name="castor.mapping.namespace.csw.GetRecordsResponse">
>       <map-to xml="GetRecordsResponse" />
>       <field name="result" 
>              type="castor.mapping.namespace.csw.SearchResult" 
>              direct="false">
>          <bind-xml name="csw:SearchResults" />
>       </field>
>    </class>
>    
>    <class name="castor.mapping.namespace.csw.SearchResult">
>      <map-to xml="SearchResults" /> 
>       <field name="numberOfRecordsMatched" 
>              type="integer" 
>              direct="false">
>          <bind-xml name="numberOfRecordsMatched" node="attribute" />
>       </field>
>       
>       <field name="numberOfRecordsReturned" 
>              type="integer" 
>              direct="false">
>          <bind-xml name="numberOfRecordsReturned" node="attribute" />
>       </field>
>       
>       <field name="extrinsic" 
>              type="castor.mapping.namespace.csw.ExtrinsicObjectData" 
>              direct="false">
>         <bind-xml name="rim:ExtrinsicObject" />
>       </field>
>    </class>
>    
>    <class name="castor.mapping.namespace.csw.ExtrinsicObjectData">
>      <field name="id" type="string" direct="false">
>        <bind-xml name="id" node="attribute" />
>      </field>
> 
>      <field name="objectType" type="string" direct="false">
>        <bind-xml name="objectType" node="attribute" />
>      </field>
>    </class>
> </mapping>
> 
> SOURCE XML FILE
> ================
> <csw:GetRecordsResponse xsi:schemaLocation="http://www.opengis.net/cat/csw 
>                                            
> http://schemas.cubewerx.com/schemas/csw/2.0.1/CSW-discovery.xsd 
>                                            
> urn:oasis:names:tc:ebxml-regrep:rim:xsd:2.5 
>                                            
> http://schemas.cubewerx.com/schemas/ebrim/2.5/schema/rim.xsd 
>                                             http://www.opengis.net/gml 
>                                            
> http://schemas.cubewerx.com/schemas/gml/3.1.1/base/geometryAggregates.xsd";>
>   <csw:SearchStatus status="complete" timestamp="2007-05-29T09:34:37" />
>   
>   <csw:SearchResults
> recordSchema="urn:oasis:names:tc:ebxml-regrep:rim:xsd:2.5" 
>                      numberOfRecordsMatched="1" 
>                      numberOfRecordsReturned="1">
>     <rim:ExtrinsicObject
> id="urn:uuid:64c67376-5814-49dd-b73c-1f046536795b" 
>                         
> home="http://motiive.edina.ac.uk:50080/cwwrs/cwwrs.cgi"; 
>                          objectType="Document" 
>                          status="Submitted" 
>                          majorVersion="1" 
>                          minorVersion="0" 
>                          mimeType="text/xml" 
>                         isOpaque="false">
>       <rim:Name> 
>         <rim:LocalizedString rim:lang="en-US" 
>                              charset="UTF-8" 
>                              value="Usage note for WMS cookbook" />
>       </rim:Name>
> 
>       <rim:Description>
>         <rim:LocalizedString rim:lang="en-US" 
>                              charset="UTF-8" 
>                              value="notes that relate to WMS" />
>       </rim:Description>
> 
>       <rim:Slot name="RepositoryItem" slotType="string">
>         <rim:ValueList>
>           <rim:Value>TRUE</rim:Value>
>         </rim:ValueList>
>       </rim:Slot>
> 
>       <rim:Slot name="externalIdentifier" slotType="string">
>         <rim:ValueList>
>           <rim:Value>
>             http://motiive.edina.ac.uk:50080/harvest/docs/UsageNote.xml
>           </rim:Value>
>         </rim:ValueList>
>       </rim:Slot>
> 
>       <rim:Slot name="externalURI" slotType="string">
>         <rim:ValueList>
>           <rim:Value>
>             http://motiive.edina.ac.uk:50080/harvest/docs/UsageNote.xml
>           </rim:Value>
>         </rim:ValueList>
>       </rim:Slot>
> 
>       <rim:Classification
> id="urn:uuid:444c959c-ea0c-4853-ba92-323b883da7ae" 
>                           home="http://demo.cubewerx.com/noo/cwwrs.cgi"; 
>                           status="Submitted" 
>                          
> classificationScheme="urn:esdi:marine:members-taxonomy" 
>                          
> classifiedObject="urn:uuid:64c67376-5814-49dd-b73c-1f046536795b" 
>                          
> classificationNode="urn:esdi:marine:members-taxonomy:EDINA" />
> 
>       <rim:Classification
> id="urn:uuid:f3ed73c9-c530-49d1-9a14-a7fbd97ca310" 
>                           home="http://demo.cubewerx.com/noo/cwwrs.cgi"; 
>                           status="Submitted" 
>                          
> classificationScheme="urn:esdi:marine:content:type" 
>                          
> classifiedObject="urn:uuid:64c67376-5814-49dd-b73c-1f046536795b" 
>                          
> classificationNode="urn:esdi:marine:content:type:document" />
>     </rim:ExtrinsicObject>
>   </csw:SearchResults>
> </csw:GetRecordsResponse>
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Values-not-being-bound-tf3951323.html#a11212238
Sent from the Castor - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe from this list please visit:

    http://xircles.codehaus.org/manage_email

Reply via email to