I am trying to generate code (with customizations applied) for OTA schema available at [OTA2003B] ( http://www.opentravel.org/Specifications/SchemaIndex.aspx?FolderName=2003B ) using JiBX Code Gen tool.Following is the code I have written to achieve the same.
Maven pom.xml jibx-maven-plugin configuration
<!-- JiBX Maven Plugin -->
<plugin>
<groupId>org.jibx</groupId>
<artifactId>jibx-maven-plugin</artifactId>
<version>1.2.3</version>
<configuration>
<customizations>
<customizations>src/test/resources/custom1.xml</customizations>
</customizations>
<schemaLocation>src/main/conf</schemaLocation>
<includeSchemas>
<includeSchema>FS_OTA_VehAvailRateRQ.xsd</includeSchema>
<includeSchema>FS_OTA_VehAvailRateRS.xsd</includeSchema>
</includeSchemas>
<schemaBindingDirectory>src/main/java</schemaBindingDirectory>
<includeSchemaBindings>
<includeSchemaBindings>*binding.xml</includeSchemaBindings>
</includeSchemaBindings>
</configuration>
<executions>
<execution>
<id>generate-java-code-from-schema</id>
<goals>
<goal>schema-codegen</goal>
</goals>
</execution>
<execution>
<id>compile-the-binding-</id>
<goals>
<goal>bind</goal>
</goals>
</execution>
</executions>
</plugin>
Customization XML: custom1.xml
<schema-set xmlns:xs="http://www.w3.org/2001/XMLSchema"
prefer-inline="true"
type-substitutions="xs:integer xs:int xs:decimal xs:float"
binding-per-schema="true">
<schema name="FS_OTA_VehAvailRateRQ.xsd"
includes="OTA_VehAvailRateRQ"
binding-file-name="otaVehAvailRateRQ_binding.xml"
package="com.poc.jibx.vehAvailRateRQ"/>
<schema name="FS_OTA_VehAvailRateRS.xsd"
includes="OTA_VehAvailRateRS"
binding-file-name="otaVehAvailRateRS_binding.xml"
package="com.poc.jibx.vehAvailRateRS"/>
</schema-set>
When I try to generate code from the configured schemas the code gets generated without the binding files and I get the following error:
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building jibx-sample 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- jibx-maven-plugin:1.2.3:schema-codegen (default-cli) @ jibx-sample ---
[INFO] Generating Java sources in src/main/java from schemas available in src/main/conf...
Loaded and validated 2 specified schema(s)
Error: Duplicate name {http://www.opentravel.org/OTA/2003/05}:InventoryStatusType; on format element at (source unknown)
Error: Duplicate name {http://www.opentravel.org/OTA/2003/05}:RatePeriodSimpleType; on format element at (source unknown)
Error: Duplicate name {http://www.opentravel.org/OTA/2003/05}:OffLocationServiceID_Type; on format element at (source unknown)
Error: Duplicate name {http://www.opentravel.org/OTA/2003/05}:VehicleTransmissionType; on format element at (source unknown)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.527s
[INFO] Finished at: Mon Sep 26 13:38:06 IST 2011
[INFO] Final Memory: 12M/84M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.jibx:jibx-maven-plugin:1.2.3:schema-codegen (default-cli) on project jibx-sample: Terminating d
ue to errors in bindings -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
However when I append generate-all="false" to <shema-set> element in custom1.xml the code generation and binding generation gets done successfully.Please see the output below when I am using generate-all="false"
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building jibx-sample 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- jibx-maven-plugin:1.2.3:schema-codegen (default-cli) @ jibx-sample ---
[INFO] Generating Java sources in src/main/java from schemas available in src/main/conf...
Loaded and validated 2 specified schema(s)
Generated 11 top-level classes (plus 40 inner classes) in package com.poc.jibx.vehAvailRateRQ
Generated 24 top-level classes (plus 69 inner classes) in package com.poc.jibx.vehAvailRateRS
Total top-level classes in model: 35
Total classes (including inner classes) in model: 144
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.574s
[INFO] Finished at: Mon Sep 26 14:08:11 IST 2011
[INFO] Final Memory: 12M/84M
[INFO] ------------------------------------------------------------------------
I can see that the in both the schemas specified the elements referred to in the error shown above, for e.g. InventoryStatusType are available.And due to this the problem is occurring.But I have specified prefer-inline="true" and different packages for each schema code to be generated in my custom1.xml, which means that for both the schemas the fully qualified name of InventoryStatusType(assuming this would be created as an inner class) would be different and this should not create a duplication error like the one I am encountering.
1) What is that is causing the problem and how generate-all="false" is able to avoid this issue?
2) How to resolve the Duplicate Name error without using generate-all="false"?
Note: When using generate-all="false" binding files gets generated but on compilation of bindings I face the following error:
Error: Duplicate name {http://www.opentravel.org/OTA/2003/05}:AddressType; on mapping element at (line 251, col 104, in otaVehAvai
lRateRS_binding.xml)
Error: Duplicate name {http://www.opentravel.org/OTA/2003/05}:CompanyNameType; on mapping element at (line 275, col 112, in otaVeh
AvailRateRS_binding.xml)
Error: Duplicate name {http://www.opentravel.org/OTA/2003/05}:LocationType; on mapping element at (line 324, col 106, in otaVehAva
ilRateRS_binding.xml)
Error: Duplicate name {http://www.opentravel.org/OTA/2003/05}:PersonNameType; on mapping element at (line 362, col 110, in otaVehA
vailRateRS_binding.xml)
Error: Duplicate name {http://www.opentravel.org/OTA/2003/05}:TPA_Extensions_Type; on mapping element at (line 383, col 118, in ot
aVehAvailRateRS_binding.xml)
Error: Duplicate mapping name not allowed for unmarshalling; on mapping element at (line 386, col 88, in otaVehAvailRateRS_binding
.xml)
Error: Duplicate name {http://www.opentravel.org/OTA/2003/05}:TelephoneType; on mapping element at (line 394, col 108, in otaVehAv
ailRateRS_binding.xml)
Error: Duplicate name {http://www.opentravel.org/OTA/2003/05}:EffectiveExpireOptionalDateGroup-AttributeGroup; on mapping element
at (line 418, col 161, in otaVehAvailRateRS_binding.xml)
Error: Duplicate name {http://www.opentravel.org/OTA/2003/05}:PrivacyGroup-AttributeGroup; on mapping element at (line 430, col 12
1, in otaVehAvailRateRS_binding.xml)
Error: Duplicate name {http://www.opentravel.org/OTA/2003/05}:VehicleCustomerType; on mapping element at (line 470, col 120, in ot
aVehAvailRateRS_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.CompanyNameType is incompatible with binding for class com.poc.jibx.vehAvailRateRS.
CompanyNameType; on structure element at (line 13, col 166, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.CompanyNameType is incompatible with binding for class com.poc.jibx.vehAvailRateRS.
CompanyNameType; on structure element at (line 28, col 144, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.LocationType is incompatible with binding for class com.poc.jibx.vehAvailRateRS.Loc
ationType; on structure element at (line 43, col 159, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.LocationType is incompatible with binding for class com.poc.jibx.vehAvailRateRS.Loc
ationType; on structure element at (line 44, col 159, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.CompanyNameType is incompatible with binding for class com.poc.jibx.vehAvailRateRS.
CompanyNameType; on structure element at (line 51, col 118, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.TPAExtensionsType is incompatible with binding for class com.poc.jibx.vehAvailRateR
S.TPAExtensionsType; on structure element at (line 227, col 50, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.VehicleCustomerType is incompatible with binding for class com.poc.jibx.vehAvailRat
eRS.VehicleCustomerType; on structure element at (line 106, col 117, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.AddressType is incompatible with binding for class com.poc.jibx.vehAvailRateRS.Addr
essType; on structure element at (line 128, col 111, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.PersonNameType is incompatible with binding for class com.poc.jibx.vehAvailRateRS.P
ersonNameType; on structure element at (line 130, col 140, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.TelephoneType is incompatible with binding for class com.poc.jibx.vehAvailRateRS.Te
lephoneType; on structure element at (line 131, col 136, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.LocationType is incompatible with binding for class com.poc.jibx.vehAvailRateRS.Loc
ationType; on structure element at (line 136, col 151, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.CompanyNameType is incompatible with binding for class com.poc.jibx.vehAvailRateRS.
CompanyNameType; on structure element at (line 137, col 157, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.CompanyNameType is incompatible with binding for class com.poc.jibx.vehAvailRateRS.
CompanyNameType; on structure element at (line 138, col 157, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.CompanyNameType is incompatible with binding for class com.poc.jibx.vehAvailRateRS.
CompanyNameType; on structure element at (line 144, col 145, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.PrivacyGroup is incompatible with binding for class com.poc.jibx.vehAvailRateRS.Pri
vacyGroup; on structure element at (line 187, col 133, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.PrivacyGroup is incompatible with binding for class com.poc.jibx.vehAvailRateRS.Pri
vacyGroup; on structure element at (line 220, col 133, in otaVehAvailRateRQ_binding.xml)
Error: References to structure object must have compatible types: com.poc.jibx.vehAvailRateRQ.TPAExtensionsType cannot be used as
com.poc.jibx.vehAvailRateRS.TPAExtensionsType; on structure element at (line 227, col 50, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.PrivacyGroup is incompatible with binding for class com.poc.jibx.vehAvailRateRS.Pri
vacyGroup; on structure element at (line 230, col 133, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.PersonNameType is incompatible with binding for class com.poc.jibx.vehAvailRateRS.P
ersonNameType; on structure element at (line 253, col 134, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.TelephoneType is incompatible with binding for class com.poc.jibx.vehAvailRateRS.Te
lephoneType; on structure element at (line 256, col 125, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.PrivacyGroup is incompatible with binding for class com.poc.jibx.vehAvailRateRS.Pri
vacyGroup; on structure element at (line 264, col 137, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.AddressType is incompatible with binding for class com.poc.jibx.vehAvailRateRS.Addr
essType; on structure element at (line 271, col 119, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.PrivacyGroup is incompatible with binding for class com.poc.jibx.vehAvailRateRS.Pri
vacyGroup; on structure element at (line 288, col 137, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.EffectiveExpireOptionalDateGroup is incompatible with binding for class com.poc.jib
x.vehAvailRateRS.EffectiveExpireOptionalDateGroup; on structure element at (line 295, col 197, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.PrivacyGroup is incompatible with binding for class com.poc.jibx.vehAvailRateRS.Pri
vacyGroup; on structure element at (line 300, col 137, in otaVehAvailRateRQ_binding.xml)
Error: Object type com.poc.jibx.vehAvailRateRQ.EffectiveExpireOptionalDateGroup is incompatible with binding for class com.poc.jib
x.vehAvailRateRS.EffectiveExpireOptionalDateGroup; on structure element at (line 307, col 197, in otaVehAvailRateRQ_binding.xml)
Updates on this after receving Don's reply
After posting the issue I viewed the OTA schemas online ( http://www.opentravel.org/Specifications/SchemaIndex.aspx?FolderName=2003B ) I was trying to generate code from and I found that the one available at the above link and the one I had was different.So I thought the flattened version of schema I had might be causing the issue.So I downloaded the online version of schemas which is properly structured in the sense that it includes the common schemas i.e.
<xs:include schemaLocation="OTA_VehicleCommonTypes.xsd"/>
<xs:include schemaLocation="OTA_SimpleTypes.xsd"/>
<xs:include schemaLocation="OTA_CommonTypes.xsd"/>
<xs:include schemaLocation="OTA_CommonPrefs.xsd"/>
<xs:include schemaLocation="OTA_AirCommonTypes.xsd"/>
Note: I am not using the OTA_AirCommonTypes.xsd in my code as some errors were occuring related to schema elements in this schema definition.
So I thought now the modular generation technique mentioned about (http://jibx.sourceforge.net/fromschema/example-modular.html ) can help. I proceeded with the same and following is the code I have written:
jibx-maven-plugin configuration
<!-- For applying custom_a.xml customization -->
<!--
<configuration>
<customizations>
<customization>src/test/resources/custom_a.xml</customization>
</customizations>
<schemaLocation>src/main/conf/OTA_Schemas</schemaLocation>
<includeSchemas>
<includeSchema>Common/*.xsd</includeSchema>
</includeSchemas>
<schemaBindingDirectory>src/main/java</schemaBindingDirectory>
<includeSchemaBindings>
<includeSchemaBindings>*binding.xml</includeSchemaBindings>
</includeSchemaBindings>
<options>
<u>http://www.opentravel.org/OTA/2003/05</u>
</options>
</configuration>
-->
<!-- For applying custom_b.xml customization -->
<configuration>
<customizations>
<customization>src/test/resources/custom_b.xml</customization>
</customizations>
<schemaLocation>src/main/conf/OTA_Schemas</schemaLocation>
<includeSchemas>
<includeSchema>vehAvailRate/*.xsd</includeSchema>
</includeSchemas>
<schemaBindingDirectory>src/main/java</schemaBindingDirectory>
<includeSchemaBindings>
<includeSchemaBindings>*binding.xml</includeSchemaBindings>
</includeSchemaBindings>
<options>
<i>src/main/java/base-binding.xml</i>
</options>
</configuration>
My Customization XMLs
custom_a.xml
<schema-set prefer-inline="true" package="com.poc.jibx.ota.common"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
type-substitutions="xs:integer xs:int xs:decimal xs:float"
binding-file-name="base-binding.xml">
<schema name="OTA_CommonPrefs.xsd" />
<schema name="OTA_CommonTypes.xsd" />
<schema name="OTA_SimpleTypes.xsd" />
<schema name="OTA_VehicleCommonTypes.xsd">
<complexType name="VehicleProfileRentalPrefType">
<element path="**" name="VendorPref" ignore="true"/>
</complexType>
</schema>
</schema-set>
custom_b.xml
<schema-set prefer-inline="true"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
type-substitutions="xs:integer xs:int xs:decimal xs:float" >
<name-converter strip-prefixes="OTA_"
strip-suffixes="Type AttributeGroup Group Attributes"/>
<schema name="OTA_VehAvailRateRQ.xsd"
includes="OTA_VehAvailRateRQ" binding-file-name="otaVehAvailRateRQ_binding.xml"
package="com.poc.jibx.ota.vehAvailRateRQ" />
<schema name="OTA_VehAvailRateRS.xsd"
includes="OTA_VehAvailRateRS" binding-file-name="otaVehAvailRateRS_binding.xml"
package="com.poc.jibx.ota.vehAvailRateRS" />
</schema-set>
First I applied custom_a.xml which generated the code and ran the jibx:bind goal which compiled the bindings(base-binding.xml) successfully. Then I commented the configuration section for applying custom_a.xml and enabled the configuration section for applying custom_b.xml which generated the code successfully but running the binding compiler produced following errors:
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building jibx-sample 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- jibx-maven-plugin:1.2.3:bind (default-cli) @ jibx-sample ---
[INFO] Running JiBX binding compiler (single-module mode) on 4 binding file(s)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.693s
[INFO] Finished at: Mon Sep 26 20:57:56 IST 2011
[INFO] Final Memory: 12M/69M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.jibx:jibx-maven-plugin:1.2.3:bind (default-cli) on project jibx-sample: Internal error - cannot
modify class com.poc.jibx.ota.common.ActionType loaded from /media/data/Practice/SpringRoo/jibx-sample/target/classes -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
So now what is it that I am missing or going wrong at and how to fix this? Also is the code I have written in line with the best practice JiBX users should follow or there are improvements I can make?
Note:
Generated Code Packages and Hierarchy
src/main/java com.poc.jibx.ota.common (Java Package) com.poc.jibx.ota.vehAvailRateRQ (Java Package) com.poc.jibx.ota.vehAvailRateRS (Java Package) base-binding.xml binding.xml otaVehAvailRateRQ_binding.xml otaVehAvailRateRS_binding.xml
binding.xml contents:
<binding name="binding" package="com.poc.jibx.ota" trim-whitespace="true">
<include path="/myproject/jibx-sample/src/main/java/base-binding.xml" precompiled="true"/>
<include path="otaVehAvailRateRS_binding.xml"/>
<include path="otaVehAvailRateRQ_binding.xml"/>
</binding>
Thanks,
Jignesh