Looks like a bug, Mocky - I'll try to duplicate this and make sure it's fixed. Is this with CVS code or RC1? I did find and correct a couple more bugs in the course of doing the tutorial, though this doesn't look like one.

What *should* happen according to the documentation is that you get an error to the effect that you're trying to use an Object as a Pair. The map-as requires that the working type of the object can be assigned to the type associated with the mapping. If you add either item-type="Pair" on the <collection> elements, or type="Pair" on the <structure map-as="..."/> element, this should work. I'll add a note on the working type vs. mapping type to the new tutorial, too.

 - Dennis

Mocky Habeeb wrote:

I'm using a class named 'Pair' which has 2 Strings, a name and a value.
I want to map it to more than one set of XML structures something like
this:

<Response>
   <UserProfile>
       <GenericAssociation>
           <value>IRCMXH</value>
           <key>User_ID</key>
       </GenericAssociation>
       <GenericAssociation>
           <value>Habeeb/Mocky</value>
           <key>User_Name</key>
       </GenericAssociation>
   </UserProfile>
   <ReturnObject>
       <DataElements>
           <ObjectDataAttribute>
               <name>Record_ID</name>
               <value>00584259548</value>
           </ObjectDataAttribute>
           <ObjectDataAttribute>
               <name>Action_Taken</name>
               <value>Cancelled</value>
           </ObjectDataAttribute>
       </DataElements>
   </ReturnObject>
</Response>

Where each 'GenericAssociation' would be a Pair, and also each
'ObjectDataAttribute' eventhough one has name/value and the other has
value/key.
To do this I created 2 abstract mappings for class Pair, one named
'value-key-pair' and the other named 'name-value-pair', like this:

<binding direction="both" > <mapping name="Response" class="AuthResponse">
       <structure field="response" map-as="standard-response"/>
   </mapping>
<mapping abstract="true" class="ServerResponse"
type-name="standard-response">
       <collection name="UserProfile" field="profileValues"
usage="optional">
           <structure name="GenericAssociation"
map-as="value-key-pair"/>
       </collection>
       <structure name="ReturnObject">
           <collection name="DataElements" field="dataValues"
usage="optional">
               <structure name="ObjectDataAttribute"
map-as="name-value-pair"/>
           </collection>
       </structure>
   </mapping>
<mapping abstract="true" class="Pair" type-name="value-key-pair"
value-style="element">
       <value name="value" field="value"/>
       <value name="key" field="name"/>
   </mapping>
<mapping abstract="true" class="Pair" type-name="name-value-pair"
value-style="element">
       <value name="name" field="name"/>
       <value name="value" field="value"/>
   </mapping>
</binding>

However the binding compiler gives me the following error when direction
is both (it works fine for direction="input"):

*** Error during code generation - please report this error on the JiBX
users list so that the condition can be caught during validation ***

java.lang.RuntimeException: Internal error: Attempting to compare types
Pair and value-key-pair
       at
org.jibx.binding.classes.MethodBuilder.verifyCompatible(MethodBuilder.ja
va:400)
       at
org.jibx.binding.classes.MethodBuilder.verifyCallStack(MethodBuilder.jav
a:495)
       at
org.jibx.binding.classes.MethodBuilder.appendCallVirtual(MethodBuilder.j
ava:852)
       at
org.jibx.binding.def.ObjectBinding.genMarshalCall(ObjectBinding.java:551
)
       at
org.jibx.binding.def.ObjectBinding.genMarshalContentCall(ObjectBinding.j
ava:866)
       at
org.jibx.binding.def.ObjectBinding.genContentMarshal(ObjectBinding.java:
910)
       at
org.jibx.binding.def.ComponentProperty.genContentMarshal(ComponentProper
ty.java:279)
       at
org.jibx.binding.def.ElementWrapper.genContentMarshal(ElementWrapper.jav
a:380)
       at
org.jibx.binding.def.PassThroughComponent.genContentMarshal(PassThroughC
omponent.java:116)

Any suggestions? My java code is below.

Mocky


public class AuthResponse {
   private ServerResponse response;

   public String toString() {
       return response.toString();
   }

   public static void main(String[] argz) {

      IBindingFactory bfact = null;
      IUnmarshallingContext uctx = null;
      Object result = null;
try { bfact = BindingDirectory.getFactory(ServerResponse.class);
          uctx = bfact.createUnmarshallingContext();
          result = uctx.unmarshalDocument(new
FileInputStream("soap.xml"), null);
          System.out.println(result);
      } catch (Exception e) { e.printStackTrace();}
  }

}
public class Pair {
   private String name;
   private String value;
public String toString() {
       return "Pair(" + name + ", " + value + ")";
   }
}
public class ServerResponse {
   private ArrayList profileValues;
   private ArrayList dataValues;
public String toString() {
       return "ServerResponse:{profile: " + profileValues + ", data:" +
dataValues + "}";
   }
}




-------------------------------------------------------
SF.Net email is Sponsored by the Better Software Conference & EXPO
September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices
Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf
_______________________________________________
jibx-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jibx-users



-------------------------------------------------------
SF.Net email is Sponsored by the Better Software Conference & EXPO
September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices
Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf
_______________________________________________
jibx-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jibx-users

Reply via email to