Jump to: navigation, search

Difference between revisions of "EclipseLink/UserGuide/MOXy/Runtime/Bootstrapping/From Schema"

m (Replacing page with 'See http://www.eclipse.org/eclipselink/documentation/2.4/moxy/dynamic_jaxb003.htm')
 
(32 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{EclipseLink_UserGuide
+
See http://www.eclipse.org/eclipselink/documentation/2.4/moxy/dynamic_jaxb003.htm
|info=y
+
|eclipselink=y
+
|eclipselinktype=MOXy
+
|api=y
+
|apis= * [http://www.eclipse.org/eclipselink/api/2.1/index.html?org/eclipse/persistence/jaxb/JAXBContextFactory.html *.jaxb.JAXBContextFactory]
+
|toc=y
+
}}
+
 
+
=Bootstrapping from XML Schema (XSD)=
+
With EclipseLink MOXy, you can provide an existing XML schema from which to create a '''DynamicJAXBContext'''. EclipseLink will parse the schema and generate '''DynamicTypes''' for each complex type.
+
 
+
This is achieved by use of the '''DynamicJAXBContextFactory''' class. A '''DynamicJAXBContext''' ''cannot'' be instantiated directly; it must be created through the factory API.
+
 
+
EclipseLink MOXy uses Sun's XJC (XML-to-Java Compiler) APIs to parse the schema into an in-memory representation and  generate dynamic types and mappings.
+
<div style="margin-left:40px;width:65%">
+
 
+
{{tip||When bootstrapping from XSD, you will need to include '''jaxb-xjc.jar''' (from the JAXB reference implementation) on your '''CLASSPATH'''.}}
+
 
+
</div>
+
 
+
 
+
You can pass the XML Schema to '''DynamicJAXBContextFactory''' by using:
+
*'''java.io.InputStream'''
+
*'''org.w3c.dom.Node'''
+
*'''javax.xml.transform.Source'''
+
 
+
The following example demonstrates these methods:
+
<source lang="java">
+
 
+
/**
+
* Create a DynamicJAXBContext, using XML Schema as the metadata source.
+
*
+
* @param schemaStream
+
*      java.io.InputStream from which to read the XML Schema.
+
* @param resolver
+
*      An org.xml.sax.EntityResolver, used to resolve schema imports.  Can be null.
+
* @param classLoader
+
*      The application's current class loader, which will be used to first lookup
+
*      classes to see if they exist before new DynamicTypes are generated.  Can be
+
*      null, in which case Thread.currentThread().getContextClassLoader() will be used.
+
* @param properties
+
*      Map of properties to use when creating a new DynamicJAXBContext.  Can be null.
+
*
+
* @return
+
*      A new instance of DynamicJAXBContext.
+
*
+
* @throws JAXBException
+
*      if an error was encountered while creating the DynamicJAXBContext.
+
*/
+
public static DynamicJAXBContext createContextFromXSD(java.io.InputStream schemaStream, EntityResolver resolver,
+
  ClassLoader classLoader, Map<String, ?> properties) throws JAXBException
+
 
+
public static DynamicJAXBContext createContextFromXSD(org.w3c.dom.Node schemaDOM, EntityResolver resolver,
+
  ClassLoader classLoader, Map<String, ?> properties) throws JAXBException
+
 
+
public static DynamicJAXBContext createContextFromXSD(javax.xml.transform.Source schemaSource, EntityResolver resolver,
+
  ClassLoader classLoader, Map<String, ?> properties) throws JAXBException
+
 
+
</source>
+
 
+
 
+
{{tip||The '''classLoader''' parameter is your application's current class loader, and will be used to first lookup classes to see if they exist before new '''DynamicTypes''' are generated. The user may pass in null for this parameter, and '''Thread.currentThread().getContextClassLoader()''' will be used instead.}}
+
 
+
 
+
 
+
 
+
=== Example ===
+
 
+
This example shows how to create and marshall a new object using Dynamic MOXy.
+
 
+
 
+
Sample XML Schema:
+
<source lang="xml">
+
 
+
<?xml version="1.0" encoding="UTF-8"?>
+
<xs:schema targetNamespace="mynamespace" xmlns:myns="mynamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema"
+
    attributeFormDefault="qualified" elementFormDefault="qualified">
+
 
+
    <xs:element name="customer" type="myns:customer"/>
+
 
+
    <xs:complexType name="customer">
+
        <xs:sequence>
+
            <xs:element name="first-name" type="xs:string"/>
+
            <xs:element name="last-name" type="xs:string"/>
+
            <xs:element name="address" type="myns:address"/>
+
        </xs:sequence>
+
    </xs:complexType>
+
 
+
    <xs:complexType name="address">
+
        <xs:sequence>
+
            <xs:element name="street" type="xs:string"/>
+
            <xs:element name="city" type="xs:string"/>
+
            <xs:element name="province" type="xs:string"/>
+
            <xs:element name="postal-code" type="xs:string"/>
+
        </xs:sequence>
+
    </xs:complexType>
+
 
+
</xs:schema>
+
 
+
</source>
+
 
+
The following code:
+
* Passes the XML Schema to '''DynamicJAXBContextFactory''' to create a '''DynamicJAXBContext'''
+
* Creates new '''DynamicEntities''' and setting their properties
+
* Creates a '''JAXBMarshaller''' and marshalling the Java objects to XML
+
 
+
<source lang="java">
+
InputStream inputStream = myClassLoader.getSystemResourceAsStream("mynamespace/resources/xsd/customer.xsd");
+
DynamicJAXBContext dContext = DynamicJAXBContextFactory.createContextFromXSD(inputStream, null, myClassLoader, null);
+
 
+
DynamicEntity newCustomer = dContext.newDynamicEntity("mynamespace.Customer");
+
newCustomer.set("firstName", "George");
+
newCustomer.set("lastName", "Jones");
+
 
+
DynamicEntity newAddress = dContext.newDynamicEntity("mynamespace.Address");
+
newAddress.set("street", "227 Main St.");
+
newAddress.set("city", "Toronto");
+
newAddress.set("province", "Ontario");
+
newAddress.set("postalCode", "M5V1E6");
+
 
+
newCustomer.set("address", newAddress);
+
 
+
dContext.createMarshaller().marshal(newCustomer, System.out);
+
 
+
</source>
+
 
+
 
+
==Importing other Schemas / EntityResolvers==
+
*http://wiki.eclipse.org/EclipseLink/Development/2.1/DynamicMOXy/296967/Documentation#Importing_other_Schemas_.2F_EntityResolvers
+
 
+
 
+
==Customizing Generated Mappings with EclipseLink Metadata ==
+
*http://wiki.eclipse.org/EclipseLink/Development/2.1/DynamicMOXy/296967/Documentation#Customizing_Generated_Mappings_with_EclipseLink_Metadata
+
 
+
 
+
{{EclipseLink_MOXy
+
|next= [[EclipseLink/UserGuide/MOXy/Runtime/Bootstrapping/Single_Project_Dynamic|From a Single Project]]
+
|previous= [[EclipseLink/UserGuide/MOXy/Runtime/Specifying_the_EclipseLink_Runtime/Using_DynamicEntities|Specying Dynamic JAXB Runtime]]
+
|up=      [[EclipseLink/UserGuide/MOXy/Runtime/Bootstrapping_Dynamic|Dynamic JAXB Bootstrapping]]
+
|version=2.2.0 - DRAFT}}
+

Latest revision as of 10:36, 8 November 2012

See http://www.eclipse.org/eclipselink/documentation/2.4/moxy/dynamic_jaxb003.htm