Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Difference between revisions of "EclipseLink/DesignDocs/293925/Phase6"
(→Example: XmlElements with XmlJoinNodes) |
(→Example: XmlElements with XmlJoinNodes) |
||
(4 intermediate revisions by the same user not shown) | |||
Line 98: | Line 98: | ||
package org.example; | package org.example; | ||
+ | @XmlRootElement | ||
public class Root { | public class Root { | ||
@XmlElement | @XmlElement | ||
Line 117: | Line 118: | ||
package org.example; | package org.example; | ||
+ | @XmlRootElement | ||
public class Client { | public class Client { | ||
@XmlAttribute | @XmlAttribute | ||
Line 126: | Line 128: | ||
@XmlElement(name="phone", type=PhoneNumber.class) | @XmlElement(name="phone", type=PhoneNumber.class) | ||
}) | }) | ||
− | @ | + | @XmlElementsJoinNodes({ |
@XmlJoinNodes({ | @XmlJoinNodes({ | ||
@XmlJoinNode(xmlPath="mail/@id", referencedXmlPath="@aid"), | @XmlJoinNode(xmlPath="mail/@id", referencedXmlPath="@aid"), | ||
Line 139: | Line 141: | ||
} | } | ||
</source> | </source> | ||
− | * @ | + | * @XmlElementsJoinNodes is being proposed as a container for corresponding @XmlJoinNodes entries, and does not yet exist. |
==== org.example.PhoneNumber.java ==== | ==== org.example.PhoneNumber.java ==== | ||
Line 145: | Line 147: | ||
package org.example; | package org.example; | ||
+ | @XmlRootElement(name="phone-number") | ||
public class PhoneNumber { | public class PhoneNumber { | ||
@XmlAttribute(required=true) | @XmlAttribute(required=true) | ||
− | @XmlPath("@ | + | @XmlPath("@pid") |
@XmlID | @XmlID | ||
public String id; | public String id; | ||
− | @XmlElement( | + | @XmlElement |
+ | @XmlPath("text()") | ||
public String number; | public String number; | ||
Line 165: | Line 169: | ||
package org.example; | package org.example; | ||
+ | @XmlRootElement | ||
public class Address { | public class Address { | ||
@XmlAttribute(required=true) | @XmlAttribute(required=true) | ||
− | @XmlPath("@ | + | @XmlPath("@aid") |
@XmlID | @XmlID | ||
public String id; | public String id; | ||
− | @XmlElement( | + | @XmlElement |
+ | @XmlPath("text()") | ||
public String address; | public String address; | ||
Line 222: | Line 228: | ||
<xml-attribute java-attribute="id" xml-path="@pid" xml-id="true" required="true" /> | <xml-attribute java-attribute="id" xml-path="@pid" xml-id="true" required="true" /> | ||
<xml-attribute java-attribute="type" xml-path="@type" xml-key="true" required="true" /> | <xml-attribute java-attribute="type" xml-path="@type" xml-key="true" required="true" /> | ||
− | <xml-element java-attribute="number" | + | <xml-element java-attribute="number" xml-path="text()" /> |
</java-attributes> | </java-attributes> | ||
</java-type> | </java-type> | ||
Line 230: | Line 236: | ||
<xml-attribute java-attribute="id" xml-path="@aid" xml-id="true" required="true" /> | <xml-attribute java-attribute="id" xml-path="@aid" xml-id="true" required="true" /> | ||
<xml-attribute java-attribute="type" xml-path="@type" xml-key="true" required="true" /> | <xml-attribute java-attribute="type" xml-path="@type" xml-key="true" required="true" /> | ||
− | <xml-element java-attribute="address" | + | <xml-element java-attribute="address" xml-path="text()" /> |
</java-attributes> | </java-attributes> | ||
</java-type> | </java-type> | ||
</java-types> | </java-types> | ||
</xml-bindings> | </xml-bindings> | ||
+ | </source> | ||
+ | |||
+ | ==== org/example/root.xml ==== | ||
+ | Following is a sample instance document: | ||
+ | <source lang="xml"> | ||
+ | <?xml version="1.0" encoding="UTF-8"?> | ||
+ | <root> | ||
+ | <client id="c100"> | ||
+ | <mail id="a101"> | ||
+ | <type>home</type> | ||
+ | </mail> | ||
+ | </client> | ||
+ | <client id="c200"> | ||
+ | <phone id="p100"> | ||
+ | <type>cell</type> | ||
+ | </phone> | ||
+ | </client> | ||
+ | |||
+ | <address aid="a100" type="shipping">123 Some Street</address> | ||
+ | <address aid="a101" type="home">66 Dead End Rd.</address> | ||
+ | <address aid="a101" type="work">45 O'Connor St.</address> | ||
+ | <address aid="a101" type="billing">101 Metcalfe St.</address> | ||
+ | <address aid="a102" type="home">61 McClintock Way</address> | ||
+ | |||
+ | <phone-number pid="p100" type="work">613.288.6789</phone-number> | ||
+ | <phone-number pid="p100" type="cell">613.858.6789</phone-number> | ||
+ | <phone-number pid="p101" type="home">613.288.0000</phone-number> | ||
+ | <phone-number pid="p101" type="work">613.420.1212</phone-number> | ||
+ | </root> | ||
</source> | </source> | ||
Latest revision as of 12:18, 3 December 2010
Phase 6 - Substitution Groups
Provide support for substitution groups.
Annotations
The following annotations will be targeted in this phase:
Annotation | XML Metadata Tag | Package | Type | Field | Method |
---|---|---|---|---|---|
XmlElements | xml-elements | X | X | ||
XmlElementRef | xml-element-ref | X | X | ||
XmlElementRefs | xml-element-refs | X |
X |
Example: XmlElements annotation
Java Metadata
The following example will demonstrate how the XmlElements annotation can be applied:
org.example.Foo.java
package org.example; @javax.xml.bind.annotation.XmlRootElement public class Foo { @javax.xml.bind.annotation.XmlElementWrapper(name="items") @javax.xml.bind.annotation.XmlElements({ @javax.xml.bind.annotation.XmlElement(name="A", type=Integer.class), @javax.xml.bind.annotation.XmlElement(name="B", type=Float.class) }) public java.util.List items; }
XML Metadata
xml-elements
If this is present in the XML then it completely replaces the corresponding annotation.
org/example/eclipselink-oxm.xml
This XML file represents metadata overrides for the org.example.Foo
class.
<?xml version="1.0" encoding="US-ASCII"?> <xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"> <java-types> <java-type name="org.example.Foo"> <xml-root-element name="foo"/> <java-attributes> <xml-elements java-attribute="items"> <xml-element java-attribute="A" type="java.lang.Integer" /> <xml-element java-attribute="B" type="java.lang.Float" /> </xml-elements> </java-attributes> </java-type> </java-types> </xml-bindings>
Example: XmlElements with XmlJoinNodes
Java Metadata
The following example will demonstrate how the XmlElements annotation can be used with the XmlJoinNodes annotation:
org.example.Root.java
package org.example; @XmlRootElement public class Root { @XmlElement @XmlPath("client") public List<Client> clients; @XmlElement @XmlPath("address") public List<Address> addresses; @XmlElement @XmlPath("phone-number") public List<PhoneNumber> phoneNumbers; }
org.example.Client.java
package org.example; @XmlRootElement public class Client { @XmlAttribute @XmlID public String id; @XmlElements({ @XmlElement(name="mail", type=Address.class), @XmlElement(name="phone", type=PhoneNumber.class) }) @XmlElementsJoinNodes({ @XmlJoinNodes({ @XmlJoinNode(xmlPath="mail/@id", referencedXmlPath="@aid"), @XmlJoinNode(xmlPath="mail/type/text()", referencedXmlPath="@type"), }), @XmlJoinNodes({ @XmlJoinNode(xmlPath="phone/@id", referencedXmlPath="@pid"), @XmlJoinNode(xmlPath="phone/type/text()", referencedXmlPath="@type"), }) }) public Object preferredContactMethod; }
- @XmlElementsJoinNodes is being proposed as a container for corresponding @XmlJoinNodes entries, and does not yet exist.
org.example.PhoneNumber.java
package org.example; @XmlRootElement(name="phone-number") public class PhoneNumber { @XmlAttribute(required=true) @XmlPath("@pid") @XmlID public String id; @XmlElement @XmlPath("text()") public String number; @XmlAttribute(required=true) @XmlPath("@type") @XmlKey public String type; }
org.example.Address.java
package org.example; @XmlRootElement public class Address { @XmlAttribute(required=true) @XmlPath("@aid") @XmlID public String id; @XmlElement @XmlPath("text()") public String address; @XmlAttribute(required=true) @XmlPath("@type") @XmlKey public String type; }
XML Metadata
org/example/eclipselink-oxm.xml
This XML file represents metadata overrides for the org.example.Root
, org.example.Client
, org.example.Address
and org.example.PhoneNumber
classes.
<?xml version="1.0" encoding="US-ASCII"?> <xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" package-name="org.example"> <java-types> <java-type name="Root"> <xml-root-element/> <java-attributes> <xml-element java-attribute="clients" xml-path="client" /> <xml-element java-attribute="addresses" xml-path="address" /> <xml-element java-attribute="phoneNumbers" xml-path="phone-number" /> </java-attributes> </java-type> <java-type name="Client"> <xml-root-element name="client" /> <java-attributes> <xml-attribute java-attribute="id" /> <xml-elements java-attribute="preferredContactMethod"> <xml-element java-attribute="mail" type="org.example.Address" /> <xml-element java-attribute="phone" type="org.example.PhoneNumber" /> <xml-join-nodes> <xml-join-node xml-path="mail/@id" referenced-xml-path="@aid" /> <xml-join-node xml-path="mail/type/text()" referenced-xml-path="@type" /> </xml-join-nodes> <xml-join-nodes> <xml-join-node xml-path="phone/@id" referenced-xml-path="@pid" /> <xml-join-node xml-path="phone/type/text()" referenced-xml-path="@type" /> </xml-join-nodes> </xml-elements> </java-attributes> </java-type> <java-type name="PhoneNumber"> <xml-root-element name="phone-number" /> <java-attributes> <xml-attribute java-attribute="id" xml-path="@pid" xml-id="true" required="true" /> <xml-attribute java-attribute="type" xml-path="@type" xml-key="true" required="true" /> <xml-element java-attribute="number" xml-path="text()" /> </java-attributes> </java-type> <java-type name="Address"> <xml-root-element name="address" /> <java-attributes> <xml-attribute java-attribute="id" xml-path="@aid" xml-id="true" required="true" /> <xml-attribute java-attribute="type" xml-path="@type" xml-key="true" required="true" /> <xml-element java-attribute="address" xml-path="text()" /> </java-attributes> </java-type> </java-types> </xml-bindings>
org/example/root.xml
Following is a sample instance document:
<?xml version="1.0" encoding="UTF-8"?> <root> <client id="c100"> <mail id="a101"> <type>home</type> </mail> </client> <client id="c200"> <phone id="p100"> <type>cell</type> </phone> </client> <address aid="a100" type="shipping">123 Some Street</address> <address aid="a101" type="home">66 Dead End Rd.</address> <address aid="a101" type="work">45 O'Connor St.</address> <address aid="a101" type="billing">101 Metcalfe St.</address> <address aid="a102" type="home">61 McClintock Way</address> <phone-number pid="p100" type="work">613.288.6789</phone-number> <phone-number pid="p100" type="cell">613.858.6789</phone-number> <phone-number pid="p101" type="home">613.288.0000</phone-number> <phone-number pid="p101" type="work">613.420.1212</phone-number> </root>
Example: XmlElementRef annotation
Java Metadata
The following example will demonstrate how the XmlElementRef annotation can be applied:
org.example.Foos.java
package org.example; @javax.xml.bind.annotation.XmlRootElement public class Foos { @javax.xml.bind.annotation.XmlElementWrapper(name="items") @javax.xml.bind.annotation.XmlElementRef(type=Bar.class) public java.util.List<Bar> items; }
org.example.Bar.java
package org.example; @javax.xml.bind.annotation.XmlRootElement(name="foobar") public class Bar { public int id; }
XML Metadata
xml-element-ref
If this is present in the XML then it completely replaces the corresponding annotation.
org/example/eclipselink-oxm.xml
This XML file represents metadata overrides for the org.example.Foos
and org.example.Bar
classes.
<?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.externalizedmetadata.xmlelementref.Foos"> <xml-root-element name="foos" /> <java-attributes> <xml-element-ref java-attribute="items" type="org.eclipse.persistence.testing.jaxb.externalizedmetadata.xmlelementref.Bar" > <xml-element-wrapper name="items" /> </xml-element-ref> </java-attributes> </java-type> <java-type name="org.eclipse.persistence.testing.jaxb.externalizedmetadata.xmlelementref.Bar"> <xml-root-element name="foobar" /> </java-type> </java-types> </xml-bindings>
Example: XmlElementRefs annotation
Java Metadata
The following example will demonstrate how the XmlElementRefs annotation can be applied:
org.example.Foos.java
package org.example; import java.util.List; import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlElementRefs; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name="my-foos") public class Foos { @XmlElementWrapper(name="items") @XmlElementRefs({ @XmlElementRef(name="integer-root", namespace="myns"), @XmlElementRef(name="root") }) public List<JAXBElement> items; }
org.example.ObjectFactory.java
package org.example; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; @javax.xml.bind.annotation.XmlRegistry public class ObjectFactory { @javax.xml.bind.annotation.XmlElementDecl(name="root") public JAXBElement<String> createRoot() { return new JAXBElement<String>(new QName("root"), String.class, ""); } @javax.xml.bind.annotation.XmlElementDecl(namespace="myns", name="integer-root") public JAXBElement<Integer> createIntegerRoot() { return new JAXBElement<Integer>(new QName("myns", "integer-root"), Integer.class, new Integer(0)); } }
XML Metadata
xml-element-refs
If this is present in the XML then it completely replaces the corresponding annotation.
org/example/eclipselink-oxm.xml
This XML file represents metadata overrides for the org.example.Foos
class.
<?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.externalizedmetadata.xmlelementrefs.Foos"> <xml-root-element name="my-foos" /> <java-attributes> <xml-element-refs java-attribute="items" > <xml-element-wrapper name="items" /> <xml-element-ref name="integer-root" namespace="myns" /> <xml-element-ref name="root" /> </xml-element-refs> </java-attributes> </java-type> </java-types> </xml-bindings>