2
votes

Updating this post with my latest examples based on responses below.


I am attempting to use MOXY to create a DynamicJAXBContext using a simple schema which uses GML 2.1.2 schemas (which imports xlink). It appears that moxy is having issues importing GML schemas (or the xlink schema imported by GML). I have tried supplying a jaxb bindings file to DynamicJAXBContextFactory but this isn't working.

I am using eclipselink 2.4.2 (2/20 nightly) and jaxb-xjc 2.1.12. The exception being generated is as follows:

Exception [EclipseLink-0] (Eclipse Persistence Services - 2.4.2.v20130220-bf58d47): org.eclipse.persistence.exceptions.IntegrityException Descriptor

Exceptions:

Exception [EclipseLink-217] (Eclipse Persistence Services - 2.4.2.v20130220-bf58d47): org.eclipse.persistence.exceptions.DescriptorException Exception Description: Invalid XPath for XMLDirectMapping/XMLCompositeDirectCollectionMapping. XPath must either contain an @ symbol for attributes or end in /text() for text nodes. For example: "@name" or "name/text()" Mapping: org.eclipse.persistence.oxm.mappings.XMLDirectMapping[title-->ns2:title] Descriptor: XMLDescriptor(org.w3._1999.xlink.Extended --> [])

Exception [EclipseLink-217] (Eclipse Persistence Services - 2.4.2.v20130220-bf58d47): org.eclipse.persistence.exceptions.DescriptorException Exception Description: Invalid XPath for XMLDirectMapping/XMLCompositeDirectCollectionMapping. XPath must either contain an @ symbol for attributes or end in /text() for text nodes. For example: "@name" or "name/text()" Mapping: org.eclipse.persistence.oxm.mappings.XMLDirectMapping[xlinkTitle1-->ns2:title] Descriptor: XMLDescriptor(org.w3._1999.xlink.LocatorType --> [DatabaseTable(ns2:locator)])

Exception [EclipseLink-217] (Eclipse Persistence Services - 2.4.2.v20130220-bf58d47): org.eclipse.persistence.exceptions.DescriptorException Exception Description: Invalid XPath for XMLDirectMapping/XMLCompositeDirectCollectionMapping. XPath must either contain an @ symbol for attributes or end in /text() for text nodes. For example: "@name" or "name/text()" Mapping: org.eclipse.persistence.oxm.mappings.XMLDirectMapping[xlinkTitle2-->ns2:title] Descriptor: XMLDescriptor(org.w3._1999.xlink.ArcType --> [DatabaseTable(ns2:arc)])

Runtime Exceptions:

at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:638) at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:574) at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:533) at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.postConnectDatasource(DatabaseSessionImpl.java:777) at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.login(DatabaseSessionImpl.java:735) at org.eclipse.persistence.oxm.XMLContext$XMLContextState.(XMLContext.java:940) at org.eclipse.persistence.oxm.XMLContext$XMLContextState.(XMLContext.java:915) at org.eclipse.persistence.oxm.XMLContext.(XMLContext.java:194) at org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext$SchemaContextInput.createContextState(DynamicJAXBContext.java:332) at org.eclipse.persistence.jaxb.JAXBContext.(JAXBContext.java:169) at org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext.(DynamicJAXBContext.java:70) at org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContextFactory.createContextFromXSD(DynamicJAXBContextFactory.java:309) at ogc.catalog.moxy.TestMoxy.testMoxy(TestMoxy.java:45)

Here is my test moxy class:

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.JAXBException;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;

import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext;
import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContextFactory;
import org.junit.Test;

public class TestMoxy {

    private static final String SCHEMA = "example-feature.xsd";

    @Test
    public void testMoxy() throws JAXBException {

        System.setProperty("javax.xml.bind.context.factory",
                "org.eclipse.persistence.jaxb.DynamicJAXBContextFactory");

        System.setProperty("com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.noCorrectnessCheck",
                "true");

        InputStream schema = this.getClass().getClassLoader().getResourceAsStream(SCHEMA);

        Source schemaSource = new StreamSource(schema);
        schemaSource.setSystemId(SCHEMA);

        InputStream xjbStream = this.getClass().getClassLoader()
                .getResourceAsStream("xlink-bindings.xjb");
        Source xjbSource = new StreamSource(xjbStream);
        xjbSource.setSystemId(SCHEMA);

        Map<String, Object> props = new HashMap<String, Object>();
        props.put(DynamicJAXBContextFactory.EXTERNAL_BINDINGS_KEY, xjbSource);

        try {
            DynamicJAXBContext jaxbContext = DynamicJAXBContextFactory.createContextFromXSD(
                    schemaSource, null, null, props);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Here is example-feature.xsd:

<?xml version='1.0' encoding='UTF-8'?>
<xsd:schema elementFormDefault='qualified' targetNamespace='http://example.org' 
    xmlns:example='http://example.org' 
    xmlns:xsd='http://www.w3.org/2001/XMLSchema' 
    xmlns:gml='http://www.opengis.net/gml'>
    <xsd:import namespace='http://www.opengis.net/gml' schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd"/>
    <xsd:complexType name='example_featureType'>
        <xsd:complexContent>
            <xsd:extension base='gml:AbstractFeatureType'>
                <xsd:sequence>
                    <xsd:element maxOccurs='1' minOccurs='1' name='id' nillable='false' type='xsd:long'/>
                    <xsd:element maxOccurs='1' minOccurs='1' name='version' nillable='false' type='xsd:long'/>
                    <xsd:element maxOccurs='1' minOccurs='0' name='access_date' nillable='true' type='xsd:dateTime'/>
                    <xsd:element maxOccurs='1' minOccurs='0' name='ground_geom' nillable='true' type='gml:PolygonPropertyType'/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:element name='exampleFeature' substitutionGroup='gml:_Feature' type='example:example_featureType'/>
</xsd:schema>

And xlink-bindings.xjb:

<jaxb:bindings version="1.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" jaxb:extensionBindingPrefixes="xjc">
    <jaxb:bindings schemaLocation="http://www.w3.org/1999/xlink.xsd">
        <jaxb:bindings node="//xs:attributeGroup[@name='locatorAttrs']//xs:attribute[@ref='xlink:title']">
            <jaxb:property name="xlink:title1" />
        </jaxb:bindings>
        <jaxb:bindings node="//xs:attributeGroup[@name='arcAttrs']//xs:attribute[@ref='xlink:title']">
            <jaxb:property name="xlink:title2" />
        </jaxb:bindings>
    </jaxb:bindings>

    <jaxb:bindings schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd"
        node="/xs:schema">
        <jaxb:globalBindings fixedAttributeAsConstantProperty="false"
            typesafeEnumBase="xs:string" typesafeEnumMemberName="generateName" generateIsSetMethod="true"
            generateMixedExtensions="true">
            <xjc:noValidator />
            <xjc:noValidatingUnmarshaller />
        </jaxb:globalBindings>

        <jaxb:schemaBindings>
            <jaxb:package name="ogc.schema.opengis.gml.v_2_1_2" />
            <jaxb:nameXmlTransform>
                <jaxb:elementName suffix="Element" />
            </jaxb:nameXmlTransform>
        </jaxb:schemaBindings>
        <jaxb:bindings node="xs:element[@name='_geometryProperty']">
            <jaxb:class name="AbstractGeometryProperty" />
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

Note xjc is working for me: xjc -extension example-feature.xsd -b xlink-bindings.xjb

xjc version "JAXB 2.1.10 in JDK 6" *java version "1.6.0_38"*

2

2 Answers

3
votes

I was able to get the xjc v2.1.10 compiler to work using this bindings file:

<jaxb:bindings version="1.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
jaxb:extensionBindingPrefixes="xjc">

<jaxb:bindings schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd"
    node="/xs:schema">
    <jaxb:schemaBindings>
        <jaxb:package name="ogc.schema.opengis.gml.v_2_1_2" />
        <jaxb:nameXmlTransform>
            <jaxb:elementName suffix="Element" />
        </jaxb:nameXmlTransform>
    </jaxb:schemaBindings>
    <jaxb:bindings node="xs:element[@name='_geometryProperty']">
        <jaxb:class name="AbstractGeometryProperty" />
    </jaxb:bindings>
</jaxb:bindings>

<jaxb:bindings schemaLocation="http://www.w3.org/1999/xlink.xsd">
    <jaxb:bindings
        node="//xs:attributeGroup[@name='locatorAttrs']//xs:attribute[@ref='xlink:title']">
        <jaxb:property name="xlink:title1" />
    </jaxb:bindings>
    <jaxb:bindings
        node="//xs:attributeGroup[@name='arcAttrs']//xs:attribute[@ref='xlink:title']">
        <jaxb:property name="xlink:title2" />
    </jaxb:bindings>
</jaxb:bindings>

But when I try to run the java test you have I get:

java.lang.NullPointerException
at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.processXmlSeeAlso(AnnotationsProcessor.java:1201)
at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.preBuildTypeInfo(AnnotationsProcessor.java:555)
at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.processClassesAndProperties(AnnotationsProcessor.java:267)
at org.eclipse.persistence.jaxb.compiler.Generator.<init>(Generator.java:104)
at org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext$SchemaContextInput.createContextState(DynamicJAXBContext.java:316)
at org.eclipse.persistence.jaxb.JAXBContext.<init>(JAXBContext.java:157)
at org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext.<init>(DynamicJAXBContext.java:70)
at org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContextFactory.createContextFromXSD(DynamicJAXBContextFactory.java:302)
at ogc.common.schema.test.TestMoxy.testEntityResolver(TestMoxy.java:92)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Not sure if this helps.

-Keith

1
votes

I've been looking at your issue and haven't been able to get it working either. I tried using the XJC schema compiler and it is also having problems with schema conflicts, and EclipseLink depends on XJC for Dynamic JAXB context creation.

First off, when I ran your test case in Eclipse I got a slightly different error:

com.sun.istack.SAXParseException2: Property "Title" is already defined. Use &lt;jaxb:property> to resolve this conflict.

But I see that in your bindings file you're already using jaxb:property for title (lowercase), and I couldn't find any Title (uppercase) in any of the related XSDs.

Second, when I ran XJC I got:

C:\...\src\omar>xjc example-feature.xsd -b xlink-bindings.xjb
parsing a schema...
compiling a schema...
[ERROR] Two declarations cause a collision in the ObjectFactory class.
  line 28 of http://schemas.opengis.net/gml/2.1.2/feature.xsd

[ERROR] (Related to above error) This is the other declaration.
  line 29 of http://schemas.opengis.net/gml/2.1.2/feature.xsd

Failed to produce code.

But this is also strange because line 29 of feature.xsd is:

<element name="geometryProperty" type="gml:GeometryAssociationType"/>

But I can't find any conflict with geometryProperty.

Hopefully this is enough information for you get a bindings file in order that will get XJC working. At that point you should be able to bootstrap a DynamicJAXBContext. The xjc executable is located in your JAVA_HOME\bin directory.

  • Rick