Difference between revisions of "EclipseLink/DesignDocs/406697"

From Eclipsepedia

Jump to: navigation, search
(External Bindings)
Line 125: Line 125:
  
 
<source lang="java">
 
<source lang="java">
   
+
  <?xml version="1.0" encoding="US-ASCII"?>
 +
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm">
 +
<java-types>
 +
<java-type name="org.eclipse.persistence.testing.jaxb.xmlvariableelement.RootNoAnnotations">
 +
            <java-attributes>
 +
                <xml-variable-element java-attribute="things" java-variable-attribute="thingName">
 +
                    <!--xml-java-type-adapter value="org.eclipse.persistence.testing.jaxb.externalizedmetadata.xmlanyelement.MyDomAdapter" /-->
 +
                </xml-variable-element>
 +
            </java-attributes>
 +
</java-type>
 +
</java-types>
 +
</xml-bindings>
 
</source>
 
</source>
  

Revision as of 12:14, 9 May 2013

Contents

Document History

  • April 26, 2013 - Initial Draft

Requirements

Example

@XmlRootElement
public class Root {
 
	public String name;
 
	@XmlVariableNode(attributeName="thingName")
	public List<Thing> things;
}
 
public class Thing {
        @XmlTransient
	public String thingName;
	public String thingValue;
}
Root r = new Root();
r.name = "theRootName";
r.things = new ArrayList<Thing>();
Thing thing1 = new Thing();
thing1.thingName = "thinga";
thing1.thingValue = "thingavalue";
 
Thing thing2 = new Thing();
thing2.thingName = "thingb";
thing2.thingValue = "thingbvalue";
 
Thing thing3 = new Thing();
thing3.thingName = "thingc";
thing3.thingValue = "thingcvalue";
r.things.add(thing1);
r.things.add(thing2);
r.things.add(thing3);
marshaller.marshal(r, System.out)
XML
<root>
   <name>theRootName</name>
   <thinga>
       <thingValue>thingavalue</thingValue>
   </thinga>
   <thingb>
       <thingValue>thingbvalue</thingValue>
   </thingb>
   <thingc>
       <thingValue>thingcvalue</thingValue>
   </thingc>
</root>
marshaller.marshal(r, System.out)
JSON
{"root":{
   "name":"theRootName"
   "thinga":{
       "thingValue":"thingavalue"},   
   "thingb":{
       "thingValue":"thingbvalue"},
   "thingc":{
       "thingValue":"thingcvalue"}
}}

API

The following annotation will be added
org.eclipse.persistence.oxm.annotations.XmlVariableNode

@Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface XmlVariableNode {
    String attributeName();
 
    Class type() default DEFAULT.class;    
 
    String getMethod() default "##default";
 
    String setMethod() default "##default";
 
    static final class DEFAULT {}
}

External Bindings

     <xs:element name="xml-variable-element" substitutionGroup="java-attribute">
        <xs:complexType>
            <xs:complexContent>
                <xs:extension base="java-attribute">
                    <xs:all>
                        <xs:element ref="xml-access-methods" minOccurs="0" />
                        <xs:element ref="xml-java-type-adapter" minOccurs="0"/>
                        <xs:element ref="xml-properties" minOccurs="0" />
                        <xs:element ref="xml-element-refs" minOccurs="0" />
                    </xs:all>
                    <xs:attribute name="xml-mixed" type="xs:boolean" default="false" />
                    <xs:attribute name="lax" type="xs:boolean" default="false" />
                    <xs:attribute name="dom-handler" type="xs:string" default="javax.xml.bind.annotation.W3CDomHandler" />
                    <xs:attribute name="read-only" type="xs:boolean" default="false" />
                    <xs:attribute name="write-only" type="xs:boolean" default="false" />
                    <xs:attribute name="xml-path" type="xs:string" />
                    <xs:attribute name="container-type" type="xs:string" default="##default" />
                    <xs:attribute name="type" type="xs:string" default="##default" />
		    <xs:attribute name="java-attribute" type="xs:string"  />
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    </xs:element>
 <?xml version="1.0" encoding="US-ASCII"?>
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm">
	<java-types>
		<java-type name="org.eclipse.persistence.testing.jaxb.xmlvariableelement.RootNoAnnotations">
            <java-attributes>
                <xml-variable-element java-attribute="things" java-variable-attribute="thingName">
                    <!--xml-java-type-adapter value="org.eclipse.persistence.testing.jaxb.externalizedmetadata.xmlanyelement.MyDomAdapter" /-->
                </xml-variable-element>
            </java-attributes>
		</java-type>
	</java-types>
</xml-bindings>

Design

A new mapping will be created XMLVariableXPathMapping and it will extend the AnyCollectionMapping

This mapping will assume that the key names are unique so will never write ['s in JSON

This annotation only makes sense when the referenced type is a complex thing. An exception will be thrown if this annotation is used on a simple object or List of simple things.

Limitations

Since this makes use of the any logic during unmarshal and MOXy only handles one Any mapping on a class if a class makes use of the XmlVariableNode annotation then that class can not have XmlAnyElement annotations or any other variables that would cause AnyObject or AnyCollection mappings to be created.

Note/Issues

  • inheritance
  • List<Object>
  • single case ie:not on a collection XMLVariableXPathObjectMapping XMLVariableXPathCollectionMapping
  • external bindings
  • don`t write out that property itself as nested if it is the variable field - currently need to mark that property as transient.
  • startcollection and endcollection [ ]'s in JSON
  • could specify get/set method instead of attribute
  • in conjunction with adapters?
  • elementwrapper