[rules-dev] XJC and JAXB DataLoader

Mark Proctor mproctor at codehaus.org
Wed Jul 9 12:09:09 EDT 2008


I got the Smooks Data Loader working last week, as mentioned in my blog, 
and now trying to do something similar for JAXB. However for this to 
work you need to generate the java source code at runtime and add it to 
PackageBuilder for compilation. I'm told that XJC can indeed generate 
source code, without needing to use the disk, but I'm having problems 
getting it to work. Any one done this before, and have some feedback on 
how to make this work?

-----------The test.xsd file-----------
schema xmlns = "http://www.w3.org/2001/XMLSchema"
        xmlns:exp="http://www.oracle.com/sample3/"
        targetNamespace="http://www.oracle.com/sample3/"
        elementFormDefault="qualified">
 
   <complexType name="Address">
      <sequence>
         <element name="name" type="string"/>
         <element name="doorNumber" type="short"/>
         <element name="street" type="string"/>
         <element name="city" type="string"/>
      </sequence>
   </complexType>
 
  <complexType name="USAddress">
    <complexContent>
     <extension base="exp:Address">
       <sequence>
          <element name="state" type="string"/>
          <element name="zip" type="integer"/>
          <element name="country" type="string"/>
       </sequence>
     </extension>
    </complexContent>
  </complexType>
 
  <element name="myAddress" type="exp:USAddress"/>
 
</schema>

--------The Test-------------
    public void test1() throws Exception {     
        Options xjcOpts = new Options();       
        xjcOpts.setSchemaLanguage( Language.XMLSCHEMA );
        InputStream stream = getClass().getResourceAsStream( "test.xsd" 
);       
        assertNotNull( stream );
        InputSource source = new InputSource( new InputStreamReader( 
stream )  );
        source.setSystemId( ".xsd" );
        xjcOpts.addGrammar( source );
       
        ErrorReceiver errorReceiver = new 
DroolsJaxb.JaxbErrorReceiver4Mvn();
       
        Model model = ModelLoader.load( xjcOpts, new JCodeModel(),  
errorReceiver);
       
        final Outline outline = model.generateCode(xjcOpts,
                                                   errorReceiver);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
       
        model.codeModel.build( xjcOpts.createCodeWriter( new 
SingleStreamCodeWriter( baos ) ) );
       
        String str = new String( baos.toByteArray() );
        System.out.println( str );                       
    }

-------------The Error----------------
java.io.IOException: Stream closed
    at 
com.sun.xml.xsom.impl.parser.NGCCRuntimeEx.parseEntity(NGCCRuntimeEx.java:305)
    at 
com.sun.xml.xsom.impl.parser.ParserContext.parse(ParserContext.java:88)
    at com.sun.xml.xsom.parser.XSOMParser.parse(XSOMParser.java:147)
    at 
com.sun.tools.xjc.ModelLoader.createXSOMSpeculative(ModelLoader.java:496)
    at com.sun.tools.xjc.ModelLoader.loadXMLSchema(ModelLoader.java:366)
    at com.sun.tools.xjc.ModelLoader.load(ModelLoader.java:167)
    at com.sun.tools.xjc.ModelLoader.load(ModelLoader.java:113)
    at 
org.drools.dataloaders.jaxb.DroolsJaxbTest.test1(DroolsJaxbTest.java:36)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at junit.framework.TestCase.runTest(TestCase.java:154)
    at junit.framework.TestCase.runBare(TestCase.java:127)
    at junit.framework.TestResult$1.protect(TestResult.java:106)
    at junit.framework.TestResult.runProtected(TestResult.java:124)
    at junit.framework.TestResult.run(TestResult.java:109)
    at junit.framework.TestCase.run(TestCase.java:118)
    at junit.framework.TestSuite.runTest(TestSuite.java:208)
    at junit.framework.TestSuite.run(TestSuite.java:203)
    at 
org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
    at 
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at 
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
    at 
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    at 
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    at 
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)




More information about the rules-dev mailing list