Jaxb for OGC Schemas

3.6k Views Asked by At

This is my scheme (scheme1.xsd)

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:app="http://www.deegree.org/app" xmlns:deegreewfs="http://www.deegree.org/wfs" xmlns:dgjdbc="http://www.deegree.org/jdbc" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:wfs="http://www.opengis.net/wfs" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.deegree.org/app">
    <xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/feature.xsd" />
    <xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/geometryAggregates.xsd" />
    <xs:import namespace="http://www.opengis.net/wfs" schemaLocation="http://schemas.opengis.net/wfs/1.1.0/wfs.xsd" />
    <!-- CONFIGURACI N DE LA BASE DE DATOS -->
    <!-- ==============================Genera una clave como identificador======================================== -->
    <xs:element name="Entidad" substitutionGroup="gml:_Feature" type="app:EntidadType">
        <!-- DEFINICI N DE GML:ID -->
    </xs:element>
    <!-- ==============================RESOLUCION DE CAMPOS======================================== -->
    <xs:complexType name="EntidadType">
        <xs:complexContent>
            <xs:extension base="gml:AbstractFeatureType">
                <xs:sequence>
                    <!-- Campo simple - INTEGER -->
                    <xs:element name="fid" type="xs:integer">
                    </xs:element>
                    <!-- Campo simple - INTEGER -->
                    <xs:element name="nombreEntidad_nombre" type="xs:string">
                    </xs:element>
                    <xs:element name="entidadLocal_municipioReal" type="xs:string">
                    </xs:element>
                    <xs:element name="entidadLocal_municipio" type="xs:string">
                    </xs:element>
                    <xs:element name="entidadLocal_provinciaReal" type="xs:string">
                    </xs:element>
                    <xs:element name="entidadLocal_provincia" type="xs:string">
                    </xs:element>
                    <xs:element name="posicionEspacial_BBOX" type="gml:GeometryPropertyType">
                    </xs:element>
                    <xs:element name="posicionEspacial_Centroide" type="xs:string">
                    </xs:element>
                    <!-- GEOM -->
                    <xs:element name="geom" type="gml:GeometryPropertyType">
                    </xs:element>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:schema>

When I use:

xjc scheme1.xsd

I get this:

parsing a schema...
[ERROR] Property "Title" is already defined. Use &lt;jaxb:property> to resolve this conflict.
line 232 of "http://www.w3.org/1999/xlink.xsd"

[ERROR] The following location is relevant to the above error
line 219 of "http://www.w3.org/1999/xlink.xsd"

[ERROR] Property "Title" is already defined. Use &lt;jaxb:property> to resolve this conflict.
line 261 of "http://www.w3.org/1999/xlink.xsd"

[ERROR] The following location is relevant to the above error
line 246 of "http://www.w3.org/1999/xlink.xsd"

Failed to parse a schema.

I used this file (binding.xjb):

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

    <jxb:bindings schemaLocation="http://www.w3.org/1999/xlink.xsd" node="/xs:schema">

        <jxb:bindings node="//xs:attributeGroup[@name='locatorAttrs']">
            <jxb:bindings node=".//xs:attribute[@ref='xlink:title']">
                <jxb:property name="title1"/>
            </jxb:bindings>
        </jxb:bindings>

        <jxb:bindings node="//xs:attributeGroup[@name='arcAttrs']">           
            <jxb:bindings node=".//xs:attribute[@ref='xlink:title']">
                <jxb:property name="title2"/>
            </jxb:bindings>            
        </jxb:bindings>        

    </jxb:bindings>

</jxb:bindings>

xjc scheme1.xsd -b binding.xjb

I get this errors:

parsing a schema...
compiling a schema...
[ERROR] Two declarations cause a collision in the ObjectFactory class.
  line 1466 of http://schemas.opengis.net/gml/3.1.1/base/geometryPrimitives.xsd

[ERROR] (Related to above error) This is the other declaration.   
line 1520 of "http://schemas.opengis.net/gml/3.1.1/base/geometryPrimitives.xsd"

[ERROR] Two declarations cause a collision in the ObjectFactory class.
 line 206 of "http://schemas.opengis.net/gml/3.1.1/base/defaultStyle.xsd"

[ERROR] (Related to above error) This is the other declaration.   
 line 225 of "http://schemas.opengis.net/gml/3.1.1/base/defaultStyle.xsd"

[ERROR] Two declarations cause a collision in the ObjectFactory class.
 line 287 of "http://schemas.opengis.net/gml/3.1.1/base/geometryBasic0d1d.xsd"

What am I doing wrong?

1

There are 1 best solutions below

0
On

The problem is that the ObjectFactory that xjc builds will contain one factory method for the elements inside the package and in your case:

On geometryPrimitives.xsd, line 1466:

<element name="_Solid" type="gml:AbstractSolidType" abstract="true" ...

And on line 1520:

<element name="Solid" type="gml:SolidType" substitutionGroup="gml:_Solid"/>

Both of them will create a factory method called something like "createSolid()" inside ObjectFactory. To fix this you can include in you binding.xjb something like the following:

<jxb:bindings schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/geometryPrimitives.xsd" node="/xs:schema">
    <jxb:bindings node="//xs:element[@name='_Solid']">
        <jxb:factoryMethod name="gmlAbstractSolidElementFactory" />
    </jxb:bindings>
</jxb:bindings>

If the collisions are from different schema files you can specify in which package you want each schema. This way you save time by not having to substitute the name of every collided factory method name:

<bindings schemaLocation="../path/to/my.xsd">
   <schemaBindings>
      <package name="org.acme.foo"/>
   </schemaBindings>
</bindings>