Class DynamicJAXBContextFactory


  • public class DynamicJAXBContextFactory
    extends java.lang.Object

    DynamicJAXBContextFactory allows the user to create a DynamicJAXBContext without having realized Java classes available on the classpath. During context creation, the user's metadata will be analyzed, and in-memory classes will be generated.

    Objects that are returned by EclipseLink unmarshal methods will be subclasses of DynamicEntity. DynamicEntities offer a simple get(propertyName) / set(propertyName, propertyValue) API to manipulate their data.

    Example:

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    InputStream iStream = classLoader.getResourceAsStream("resource/MySchema.xsd");

    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put(DynamicJAXBContextFactory.XML_SCHEMA_KEY, iStream);

    DynamicJAXBContext jaxbContext = (DynamicJAXBContext) JAXBContext.newInstance("org.example", classLoader, properties);

    DynamicEntity employee = jaxbContext.newDynamicEntity("org.example.Employee");
    employee.set("firstName", "Bob");
    employee.set("lastName", "Barker");
    jaxbContext.createMarshaller().(employee, System.out);

    See Also:
    JAXBContext, DynamicJAXBContext, DynamicEntity, DynamicType
    Author:
    rbarkhouse
    Since:
    EclipseLink 2.1
    • Method Summary

      All Methods Static Methods Concrete Methods 
      Modifier and Type Method Description
      static DynamicJAXBContext createContext​(java.lang.Class<?>[] classes, java.util.Map<java.lang.String,​java.lang.Object> properties)
      Unsupported Operation.
      static DynamicJAXBContext createContext​(java.lang.String contextPath, java.lang.ClassLoader classLoader, java.util.Map<java.lang.String,​java.lang.Object> properties)
      Create a DynamicJAXBContext, using either an XML Schema, EclipseLink OXM file, or EclipseLink sessions.xml as the metadata source.
      static DynamicJAXBContext createContextFromOXM​(java.lang.ClassLoader classLoader, java.util.Map<java.lang.String,​?> properties)
      Create a DynamicJAXBContext, using an EclipseLink OXM file as the metadata source.
      static DynamicJAXBContext createContextFromXSD​(java.io.InputStream schemaStream, org.xml.sax.EntityResolver resolver, java.lang.ClassLoader classLoader, java.util.Map<java.lang.String,​?> properties)
      Create a DynamicJAXBContext, using XML Schema as the metadata source.
      static DynamicJAXBContext createContextFromXSD​(javax.xml.transform.Source schemaSource, org.xml.sax.EntityResolver resolver, java.lang.ClassLoader classLoader, java.util.Map<java.lang.String,​java.lang.Object> properties)
      Create a DynamicJAXBContext, using XML Schema as the metadata source.
      static DynamicJAXBContext createContextFromXSD​(org.w3c.dom.Node schemaDOM, org.xml.sax.EntityResolver resolver, java.lang.ClassLoader classLoader, java.util.Map<java.lang.String,​java.lang.Object> properties)
      Create a DynamicJAXBContext, using XML Schema as the metadata source.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • ENTITY_RESOLVER_KEY

        public static final java.lang.String ENTITY_RESOLVER_KEY
        See Also:
        Constant Field Values
      • EXTERNAL_BINDINGS_KEY

        public static final java.lang.String EXTERNAL_BINDINGS_KEY
        See Also:
        Constant Field Values
      • SCHEMAMETADATA_CLASS_NAME

        public static final java.lang.String SCHEMAMETADATA_CLASS_NAME
        See Also:
        Constant Field Values
    • Constructor Detail

      • DynamicJAXBContextFactory

        public DynamicJAXBContextFactory()
    • Method Detail

      • createContext

        public static DynamicJAXBContext createContext​(java.lang.String contextPath,
                                                       java.lang.ClassLoader classLoader,
                                                       java.util.Map<java.lang.String,​java.lang.Object> properties)
                                                throws JAXBException
        Create a DynamicJAXBContext, using either an XML Schema, EclipseLink OXM file, or EclipseLink sessions.xml as the metadata source. This creation method will be called if the user calls the newInstance() method on javax.xml.bind.JAXBContext, and has specified javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.DynamicJAXBContextFactory in their jaxb.properties file.

        -- Context Creation From XML Schema --

        The properties map must contain the following key/value pairs:

        DynamicJAXBContextFactory.XML_SCHEMA_KEY
        Either a org.w3c.dom.Node, javax.xml.transform.Source, or java.io.InputStream pointing to the XML Schema
        DynamicJAXBContextFactory.ENTITY_RESOLVER_KEY
        An org.xml.sax.EntityResolver, used to resolve schema imports. Can be null.
        Example:
         ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
         InputStream iStream = classLoader.getResourceAsStream("resource/MySchema.xsd");
        
         Map<String, Object> properties = new HashMap<String, Object>();
         properties.put(DynamicJAXBContextFactory.XML_SCHEMA_KEY, iStream);
        
         DynamicJAXBContext jaxbContext = (DynamicJAXBContext) JAXBContext.newInstance("org.example", classLoader, properties);
         DynamicEntity emp = jaxbContext.newDynamicEntity("org.example.Employee");
         ...
         
        Context Creation From EclipseLink OXM:

        The properties map must contain the key JAXBContextProperties.OXM_METADATA_SOURCE, which can have several possible values:

        • One of the following, pointing to your OXM file: java.io.File, java.io.InputStream, java.io.Reader, java.net.URL,
          javax.xml.stream.XMLEventReader, javax.xml.stream.XMLStreamReader, javax.xml.transform.Source,
          org.w3c.dom.Node, or org.xml.sax.InputSource.
        • A List of objects from the set above.
        • A Map<String, Object>, where String is a package name, and Object is the pointer to the OXM file, from the set
          of possibilities above. If using this option, a package-name element is not required in the xml-bindings element of your OXM file.
        Example:
         ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
         InputStream iStream = classLoader.getResourceAsStream("resource/eclipselink-oxm.xml");
        
         Map<String, Object> properties = new HashMap<String, Object>();
         properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, iStream);
        
         DynamicJAXBContext jaxbContext = (DynamicJAXBContext) JAXBContext.newInstance("org.example", classLoader, properties);
         DynamicEntity emp = jaxbContext.newDynamicEntity("org.example.Employee");
         ...
         
        Context Creation From EclipseLink sessions.xml:

        The sessionNames parameter is a colon-delimited list of session names within the sessions.xml file. Descriptors in this session's Project must not have javaClass set, but must have javaClassName set.

        Example:

         ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        
         DynamicJAXBContext jaxbContext = (DynamicJAXBContext) JAXBContext.newInstance("org.example", classLoader, null);
         DynamicEntity emp = jaxbContext.newDynamicEntity("org.example.Employee");
         ...
         
        Parameters:
        contextPath - A colon-delimited String specifying the packages containing jaxb.properties. If bootstrapping from EclipseLink sessions.xml, this will also be the name(s) of your sessions.
        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.
        properties - Map of properties to use when creating a new DynamicJAXBContext. Can be null if bootstrapping from sessions.xml.
        Returns:
        A new instance of DynamicJAXBContext.
        Throws:
        JAXBException - if an error was encountered while creating the DynamicJAXBContext.
      • createContext

        public static DynamicJAXBContext createContext​(java.lang.Class<?>[] classes,
                                                       java.util.Map<java.lang.String,​java.lang.Object> properties)
                                                throws JAXBException
        Unsupported Operation. DynamicJAXBConexts can not be created from concrete classes. Use the standard JAXBContext to create a context from existing Classes.
        Throws:
        JAXBException
        See Also:
        JAXBContext
      • createContextFromXSD

        public static DynamicJAXBContext createContextFromXSD​(org.w3c.dom.Node schemaDOM,
                                                              org.xml.sax.EntityResolver resolver,
                                                              java.lang.ClassLoader classLoader,
                                                              java.util.Map<java.lang.String,​java.lang.Object> properties)
                                                       throws JAXBException
        Create a DynamicJAXBContext, using XML Schema as the metadata source.
        Parameters:
        schemaDOM - org.w3c.dom.Node representing the XML Schema.
        resolver - An org.xml.sax.EntityResolver, used to resolve schema imports. Can be null.
        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.
        properties - Map of properties to use when creating a new DynamicJAXBContext. Can be null.
        Returns:
        A new instance of DynamicJAXBContext.
        Throws:
        JAXBException - if an error was encountered while creating the DynamicJAXBContext.
      • createContextFromXSD

        public static DynamicJAXBContext createContextFromXSD​(java.io.InputStream schemaStream,
                                                              org.xml.sax.EntityResolver resolver,
                                                              java.lang.ClassLoader classLoader,
                                                              java.util.Map<java.lang.String,​?> properties)
                                                       throws JAXBException
        Create a DynamicJAXBContext, using XML Schema as the metadata source.
        Parameters:
        schemaStream - java.io.InputStream from which to read the XML Schema.
        resolver - An org.xml.sax.EntityResolver, used to resolve schema imports. Can be null.
        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.
        properties - Map of properties to use when creating a new DynamicJAXBContext. Can be null.
        Returns:
        A new instance of DynamicJAXBContext.
        Throws:
        JAXBException - if an error was encountered while creating the DynamicJAXBContext.
      • createContextFromXSD

        public static DynamicJAXBContext createContextFromXSD​(javax.xml.transform.Source schemaSource,
                                                              org.xml.sax.EntityResolver resolver,
                                                              java.lang.ClassLoader classLoader,
                                                              java.util.Map<java.lang.String,​java.lang.Object> properties)
                                                       throws JAXBException
        Create a DynamicJAXBContext, using XML Schema as the metadata source.
        Parameters:
        schemaSource - javax.xml.transform.Source from which to read the XML Schema.
        resolver - An org.xml.sax.EntityResolver, used to resolve schema imports. Can be null.
        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.
        properties - Map of properties to use when creating a new DynamicJAXBContext. Can be null.
        Returns:
        A new instance of DynamicJAXBContext.
        Throws:
        JAXBException - if an error was encountered while creating the DynamicJAXBContext.
      • createContextFromOXM

        public static DynamicJAXBContext createContextFromOXM​(java.lang.ClassLoader classLoader,
                                                              java.util.Map<java.lang.String,​?> properties)
                                                       throws JAXBException
        Create a DynamicJAXBContext, using an EclipseLink OXM file as the metadata source.
        Parameters:
        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.
        properties - Map of properties to use when creating a new DynamicJAXBContext. This map must contain a key of JAXBContextProperties.OXM_METADATA_SOURCE, which can have several possible values:
        • One of the following, pointing to your OXM file: java.io.File, java.io.InputStream, java.io.Reader, java.net.URL,
          javax.xml.stream.XMLEventReader, javax.xml.stream.XMLStreamReader, javax.xml.transform.Source,
          org.w3c.dom.Node, or org.xml.sax.InputSource.
        • A List of objects from the set above.
        • A Map<String, Object>, where String is a package name, and Object is the pointer to the OXM file, from the set
          of possibilities above. If using this option, a package-name element is not required in the xml-bindings element of your OXM file.
        Returns:
        A new instance of DynamicJAXBContext.
        Throws:
        JAXBException - if an error was encountered while creating the DynamicJAXBContext.