Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JAXB fails to generate Java classes for XBRL

I'm trying to generate Java classes for types defined in XBRL.

My build process is based on Maven 2, and here are my trials. I only paste the build section, which relies on some properties:

package is the name of my target package

catalog is the path and file name of the catalog. because I have no internet connection, I have amny entries, but I think those are always necessary

-- TR9401 for XBRL resources --
SYSTEM http://www.xbrl.org/2003/XLink http/www.xbrl.org/2003/xl-2003-12-31.xsd
SYSTEM http://www.w3.org/1999/xlink http/www.xbrl.org/2003/xlink-2003-12-31.xsd

xsd.path is the directory where the XSD resides

xsd.file is the file name of the following minimalist XSD

     <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
       <xs:import namespace="http://www.xbrl.org/2003/instance"
        schemaLocation="http://www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd"/>
     </xs:schema>

All plugins I have tried fail to import xl:nonEmptyURI.

But xl is mapped to http://www.xbrl.org/2003/XLink (which is in my catalog) which imports <import namespace="http://www.w3.org/1999/xlink" schemaLocation="xlink-2003-12-31.xsd"/> which defines nonEmptyURI

What's wrong? How can I fix it?

Apache CXF

        <plugin>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-xjc-plugin</artifactId>
            <executions>
                <execution>
                    <id>generate-sources</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>xsdtojava</goal>
                    </goals>
                    <configuration>
                        <xsdOptions>
                            <xsdOption>
                                <catalog>${catalog}</catalog>
                                <xsd>${xsd.path}/${xsd.file}</xsd>
                                <packagename>${package}</packagename>
                            </xsdOption>
                        </xsdOptions>
                    </configuration>
                </execution>
            </executions>
        </plugin>

Fails with

parsing a schema...

[ERROR] src-resolve: Cannot resolve the name 'xl:nonEmptyURI' to a(n) 'type definition' component.
  line 389 of cache/http/www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd

jvnet maven-jaxb2-plugin

        <plugin>
            <!-- http://jaxb.java.net/ -->
            <groupId>org.jvnet.jaxb2.maven2</groupId>
            <artifactId>maven-jaxb2-plugin</artifactId>
            <version>0.8.2</version>
            <executions>
                <execution>
                    <id>generate</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <catalog>${catalog}</catalog>
                <schemaDirectory>${xsd.path}</schemaDirectory>
                <generatePackage>${package}</generatePackage>
                <strict>false</strict>
                <extension>true</extension>
                <plugins>
                    <plugin>
                        <groupId>org.jvnet.jaxb2_commons</groupId>
                        <artifactId>jaxb2-basics</artifactId>
                        <version>0.6.4</version>
                    </plugin>
                    <plugin>
                        <groupId>org.jvnet.jaxb2_commons</groupId>
                        <artifactId>jaxb2-basics-annotate</artifactId>
                        <version>0.6.4</version>
                    </plugin>
                </plugins>
                <args>
                    <arg>-Xannotate</arg>
                    <arg>-XtoString</arg>
                </args>
            </configuration>
        </plugin>

The error is the same, a little more verbose

[INFO] Parsing input schema(s)...
[ERROR] Error while parsing schema(s).Location [ cache/http/www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd{389,74}].
org.xml.sax.SAXParseException: undefined simple type 'xl:nonEmptyURI'
    at com.sun.xml.xsom.impl.parser.ParserContext$1.reportError(ParserContext.java:180)
    at com.sun.xml.xsom.impl.parser.NGCCRuntimeEx.reportError(NGCCRuntimeEx.java:175)
    at com.sun.xml.xsom.impl.parser.DelayedRef.resolve(DelayedRef.java:110)
[...]
[ERROR] Error while parsing schema(s).Location [ cache/http/www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd{412,77}].
org.xml.sax.SAXParseException: undefined simple type 'xl:nonEmptyURI'
    at com.sun.xml.xsom.impl.parser.ParserContext$1.reportError(ParserContext.java:180)
    at com.sun.xml.xsom.impl.parser.NGCCRuntimeEx.reportError(NGCCRuntimeEx.java:175)
    at com.sun.xml.xsom.impl.parser.DelayedRef.resolve(DelayedRef.java:110)
[ERROR] Failed to execute goal org.jvnet.jaxb2.maven2:maven-jaxb2-plugin:0.8.2:generate (generate) on project solvency2: Unable to parse input schema(s). Error messages should have been provided. -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.jvnet.jaxb2.maven2:maven-jaxb2-plugin:0.8.2:generate (generate) on project solvency2: Unable to parse input schema(s). Error messages should have been provided.

Mojo jaxb2-maven-plugin

         <plugin>
            <!--http://mojo.codehaus.org/ -->
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.5</version>
            <executions>
                <execution>
                    <id>xjc</id>
                     <phase>generate-sources</phase>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <schemaDirectory>${xsd.path}</schemaDirectory>
                <packageName>${package}</packageName>
                <catalog>${catalog}</catalog>
            </configuration>
        </plugin>

Same error, said differently by Xerces

[ERROR] file:[...]cache/http/www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd[472,74]
org.xml.sax.SAXParseException: src-resolve: Cannot resolve the name 'xl:nonEmptyURI' to a(n) 'simpleType definition' component.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
like image 247
rds Avatar asked Oct 16 '12 11:10

rds


1 Answers

You definitely need all schemas to be downloaded and added to catalog in your case. I had a similar problem with generating Java classes, but I didn't use any catalogs at all just put all the schemas the XBRL uses into the same folder. The same way they're organized on XBRL site:

src\main\resources\xbrl\
                       xbrl-instance-2003-12-31.xsd
                       xbrl-linkbase-2003-12-31.xsd
                       xl-2003-12-31.xsd
                       xlink-2003-12-31.xsd
                       xbrl_bindings.xjb

Also I added a JAXB binding as you can see to resolve a conflict that raises during the source generation and put into the same folder.

xbrl_bindings.xjb:

<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
          xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
          xmlns:xs="http://www.w3.org/2001/XMLSchema"
          xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
          version="2.1">
         <bindings schemaLocation="xl-2003-12-31.xsd" version="1.0">
           <bindings node="//xs:schema//xs:element[@name='title']">
             <property name="xlTitle"/>
         </bindings>
</bindings>

Maven plugin configuration:

         <plugin>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-xjc-plugin</artifactId>
            <version>2.6.1</version>
            <executions>
                <execution>
                    <id>generate-sources</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>xsdtojava</goal>
                    </goals>
                    <configuration>
                        <sourceRoot>${basedir}/target/generated/src/main/java</sourceRoot>
                        <xsdOptions>
                            <xsdOption>
                                <bindingFile>${path.to.xsd}/xbrl_bindings.xjb</bindingFile>
                                <xsd>${path.to.xsd}/xbrl-instance-2003-12-31.xsd</xsd>
                            </xsdOption>
                        </xsdOptions>
                    </configuration>
                </execution>
            </executions>
        </plugin>

Enjoy XBRL :)

like image 140
Vladimir Klevko Avatar answered Sep 29 '22 06:09

Vladimir Klevko