Just to give more details this is the XSD:
<xsd:element name="order" type="order:OrderType" />
<xsd:complexType name="OrderType">
<xsd:sequence>
<xsd:element name="orderItem" type="order:orderItemType"
minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="orderItemType">
<xsd:sequence>
<xsd:element name="product" type="xsd:long" />
<xsd:element name="quantity" type="xsd:integer" />
<xsd:element name="price" type="xsd:decimal" />
</xsd:sequence>
</xsd:complexType>
And it's only generating classes for OrderType and OrderItemType, I
don't get classes for Order or OrderItem. Any unmarshalled XML maps to
the OrderType class, which looks wierd, instead of binding to Order,
which I mentioned isn't generated anyway.
The code that does the runtime generation can be found here:
http://fisheye.jboss.org/browse/JBossRules/trunk/drools-dataloaders/drools-dataloaders-jaxb/src/main/java/org/drools/dataloaders/jaxb/DroolsJaxbHelper.java?r=HEAD
Mark
Mark Proctor wrote:
> Well I thought it was working, and it is sort of, but it's not
> generating all classes and there is no interface/impl sepration - it
> only seems to be generating the complex types. My code for doing this
> can be found here:
> http://fisheye.jboss.org/browse/JBossRules/trunk/drools-dataloaders/drools-dataloaders-jaxb/src/main/java/org/drools/dataloaders/jaxb/DroolsJaxbHelper.java?r=21079
>
>
> Any feedback on this would be welcome, are there some extra options I
> need to set for runtime generation?
>
> Thanks
>
> Mark
>
> Mark Proctor wrote:
>> I've managed to get this working, debugging through the jaxb code.
>> The problem is that it needs to re-use the Reader, but it calls
>> close(), which on StringReader sets the str member to null or closes
>> the InputStream on InputStream reader. To get around this I extended
>> StringReader and override the close() method to call reset() instead.
>>
>> Mark
>>
>>
>> Mark Proctor wrote:
>>> I'm trying to get XJC to generate the src code for an XSD model at
>>> runtime using the XJC api, using just input streams as we don't want
>>> disk access. This is to facilite the data loading of XSD based
>>> models into Drools at runtime. We will compile the src at runtime
>>> using an embedded compiler and add it to the Drools classloader.
>>> I've already done something similar for a Smooks data loadaer
>>> http://blog.athico.com/2008/07/drools-smooks-data-loader.html. I've
>>> looked over the maven plugin for XJC, changing it from a File based
>>> utility to InputStreams, although now stuck. I've included the test
>>> code below, along with the error and the xsd. If anyone can help, or
>>> point me to some code that already does this, would be very much
>>> appreciated.
>>>
>>> Thanks
>>>
>>> Mark
>>>
>>> --------The Test-------------
>>> 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 JaxbErrorReceiver4Drools();
>>> 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 ); }
>>>
>>> public class JaxbErrorReceiver4Drools extends ErrorReceiver {
>>> public String stage = "processing";
>>>
>>> public void warning(SAXParseException e) {
>>> e.printStackTrace();
>>> }
>>>
>>> public void error(SAXParseException e) {
>>> e.printStackTrace();
>>> }
>>>
>>> public void fatalError(SAXParseException e) {
>>> e.printStackTrace();
>>> }
>>>
>>> public void info(SAXParseException e) {
>>> e.printStackTrace();
>>> }
>>> }
>>>
>>> -------------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)
>>>
>>>
>>> -----------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>
>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe_at_jaxb.dev.java.net
>>> For additional commands, e-mail: users-help_at_jaxb.dev.java.net
>>>
>>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe_at_jaxb.dev.java.net
>> For additional commands, e-mail: users-help_at_jaxb.dev.java.net
>>
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe_at_jaxb.dev.java.net
> For additional commands, e-mail: users-help_at_jaxb.dev.java.net
>
>