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)