-
15. Re: Implementing JAXB style parsing for aop-mc-int
kabirkhan Feb 26, 2008 1:50 PM (in response to kabirkhan)The output is too long to paste here, but I think this part of the dumped schema is relevant:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:jboss:aop-beans:1.0" xmlns="urn:jboss:aop-beans:1.0" > <element name="{urn:jboss:aop-beans:1.0}bean" type="{urn:jboss:aop-beans:1.0}abstract-bean-meta-data"> </element> <element name="{urn:jboss:bean-deployer:2.0}bean" type="{urn:jboss:aop-beans:1.0}abstract-bean-meta-data"> </element> .... <complexType name="{urn:jboss:aop-beans:1.0}abstract-bean-meta-data" base="xsd:anyType"> <sequence> <sequence minOccurs="0"> <element name="{urn:jboss:aop-beans:1.0}alias" minOccurs="0" type="{http://www.w3.org/2001/XMLSchema}string"> </element> </sequence> <sequence minOccurs="0"> <element name="{urn:jboss:aop-beans:1.0}annotation" minOccurs="0" type="{urn:jboss:aop-beans:1.0}abstract-annotation-meta-data"> </element> </sequence> <element name="{urn:jboss:aop-beans:1.0}classloader" minOccurs="0" type="{urn:jboss:aop-beans:1.0}abstract-class-loader-meta-data"> </element> <element name="{urn:jboss:aop-beans:1.0}constructor" minOccurs="0" type="{urn:jboss:aop-beans:1.0}abstract-constructor-meta-data"> </element> <sequence minOccurs="0"> <element name="{urn:jboss:aop-beans:1.0}property" minOccurs="0" type="{urn:jboss:aop-beans:1.0}abstract-property-meta-data"> </element> </sequence> <element name="{urn:jboss:aop-beans:1.0}create" minOccurs="0" type="{urn:jboss:aop-beans:1.0}abstract-lifecycle-meta-data"> </element> <element name="{urn:jboss:aop-beans:1.0}start" minOccurs="0" type="{urn:jboss:aop-beans:1.0}abstract-lifecycle-meta-data"> </element> <element name="{urn:jboss:aop-beans:1.0}stop" minOccurs="0" type="{urn:jboss:aop-beans:1.0}abstract-lifecycle-meta-data"> </element> <element name="{urn:jboss:aop-beans:1.0}destroy" minOccurs="0" type="{urn:jboss:aop-beans:1.0}abstract-lifecycle-meta-data"> </element> <sequence minOccurs="0"> <element name="{urn:jboss:aop-beans:1.0}depends" minOccurs="0" type="{urn:jboss:aop-beans:1.0}abstract-dependency-meta-data"> </element> </sequence> <sequence minOccurs="0"> <element name="{urn:jboss:aop-beans:1.0}demand" minOccurs="0" type="{urn:jboss:aop-beans:1.0}abstract-demand-meta-data"> </element> </sequence> <sequence minOccurs="0"> <element name="{urn:jboss:aop-beans:1.0}supply" minOccurs="0" type="{urn:jboss:aop-beans:1.0}abstract-supply-meta-data"> </element> </sequence> <sequence minOccurs="0"> <element name="{urn:jboss:aop-beans:1.0}install" minOccurs="0" type="{urn:jboss:aop-beans:1.0}abstract-install-meta-data"> </element> </sequence> <sequence minOccurs="0"> <element name="{urn:jboss:aop-beans:1.0}uninstall" minOccurs="0" type="{urn:jboss:aop-beans:1.0}abstract-install-meta-data"> </element> </sequence> <sequence minOccurs="0"> <element name="{urn:jboss:aop-beans:1.0}incallback" minOccurs="0" type="{urn:jboss:aop-beans:1.0}install-callback-meta-data"> </element> </sequence> <sequence minOccurs="0"> <element name="{urn:jboss:aop-beans:1.0}uncallback" minOccurs="0" type="{urn:jboss:aop-beans:1.0}uninstall-callback-meta-data"> </element> </sequence> </sequence> <attribute name="autowire-type" type="CDATA" optional="true"/> <attribute name="abstract" type="{http://www.w3.org/2001/XMLSchema}boolean" optional="true"/> <attribute name="class" type="{http://www.w3.org/2001/XMLSchema}string" optional="true"/> <attribute name="mode" type="CDATA" optional="true"/> <attribute name="autowire-candidate" type="{http://www.w3.org/2001/XMLSchema}boolean" optional="true"/> <attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" optional="true"/> <attribute name="parent" type="{http://www.w3.org/2001/XMLSchema}string" optional="true"/> </complexType> ...
My AOPDeployment class@JBossXmlSchema(namespace="urn:jboss:aop-beans:1.0", elementFormDefault=XmlNsForm.QUALIFIED) @XmlRootElement(name="aop") @XmlType(propOrder={"annotations", "classLoader", "beanFactories", "create", "start", "stop", "destroy", "aliases"}) public class AOPDeployment extends AbstractKernelDeployment { private static final long serialVersionUID = 1L; @XmlElements ({ @XmlElement(name="bean", type=AbstractBeanMetaData.class), @XmlElement(name="bean", namespace="urn:jboss:bean-deployer:2.0", type=AbstractBeanMetaData.class), @XmlElement(name="beanfactory", type=GenericBeanFactoryMetaData2.class), @XmlElement(name="beanfactory", namespace="urn:jboss:bean-deployer:2.0", type=GenericBeanFactoryMetaData2.class), @XmlElement(name="lazy", type=AbstractLazyMetaData.class), @XmlElement(name="lazy", namespace="urn:jboss:bean-deployer:2.0", type=AbstractLazyMetaData.class), @XmlElement(name="aspect", type=AspectBeanMetaDataFactory.class), @XmlElement(name="interceptor", type=InterceptorBeanMetaDataFactory.class), @XmlElement(name="bind", type=BindBeanMetaDataFactory.class), @XmlElement(name="stack", type=StackBeanMetaDataFactory.class), @XmlElement(name="typedef", type=TypeDefBeanMetaDataFactory.class), @XmlElement(name="cflow-stack", type=CFlowStackBeanMetaDataFactory.class) }) @XmlAnyElement public void setBeanFactories(List<BeanMetaDataFactory> beanFactories) { super.setBeanFactories(beanFactories); } }
If that is not enough, the code is commited and aop-mc-int/src/tests/org.jboss.test.microcontainer.beans.test.AspectSimpleJaxbAopTestCase demonstrates the problem
-
16. Re: Implementing JAXB style parsing for aop-mc-int
adrian.brock Feb 27, 2008 5:30 AM (in response to kabirkhan)"kabir.khan@jboss.com" wrote:
My AOPDeployment class@XmlElement(name="bean", namespace="urn:jboss:bean-deployer:2.0",
You took me too literally. :-)
The example above was only intended to show
how the annotations work (you were using them wrong), it wasn't intended to be copied.
That's why I said
Illustrative example (trying to show how it works):
I've removed the elements that are in the MC namespace
which should be handled by the wildcard (@XmlAnyElement) not explicitly listed.
What you've defined is a {urn:jboss:aop-beans:1.0}bean and a
{urn:jboss:bean-deployer:2.0}bean in your namespace that are children
of deployment. But that doesn't override the child elements which will still be
in your namespace.
i.e. both with have {urn:jboss:aop-beans:1.0}constructor
You should let the MC schema define the {urn:jboss:bean-deployer:2.0}bean
and use it as a "wildcard". -
17. Re: Implementing JAXB style parsing for aop-mc-int
adrian.brock Feb 27, 2008 5:32 AM (in response to kabirkhan)Question: Do you really want an aop:bean? Is that just for ease of use?
It doesn't actually make much difference, except you'll have to reproduce all the MC schema
in your schema using your namespace (and maintain it every time it changes ;-) -
18. Re: Implementing JAXB style parsing for aop-mc-int
adrian.brock Feb 27, 2008 5:35 AM (in response to kabirkhan)Also, you changed the .classpath of aop-mc-int to use AOP CR4, but the
build/pom.xml still says AOP CR3, so I reverted this change. -
19. Re: Implementing JAXB style parsing for aop-mc-int
kabirkhan Feb 27, 2008 6:23 AM (in response to kabirkhan)"adrian@jboss.org" wrote:
Question: Do you really want an aop:bean? Is that just for ease of use?
No, I didn't understand properly and blindly followed your example :-) Now it makes a lot more sense wrt @XmlAnyElement.
I now have@XmlElements ({ @XmlElement(name="aspect", type=AspectBeanMetaDataFactory.class), @XmlElement(name="interceptor", type=InterceptorBeanMetaDataFactory.class), @XmlElement(name="bind", type=BindBeanMetaDataFactory.class), @XmlElement(name="stack", type=StackBeanMetaDataFactory.class), @XmlElement(name="typedef", type=TypeDefBeanMetaDataFactory.class), @XmlElement(name="cflow-stack", type=CFlowStackBeanMetaDataFactory.class) }) @XmlAnyElement public void setBeanFactories(List<BeanMetaDataFactory> beanFactories) { super.setBeanFactories(beanFactories); }
and that works great. Thanks for your help -
20. Re: Implementing JAXB style parsing for aop-mc-int
kabirkhan Feb 27, 2008 11:50 AM (in response to kabirkhan)Next stumbling block is trying to deploy things like
<?xml version="1.0" encoding="UTF-8"?> <deployment xmlns="urn:jboss:bean-deployer:2.0"> <bean name="AspectManager" class="org.jboss.aop.AspectManager"> <constructor factoryClass="org.jboss.aop.AspectManager" factoryMethod="instance"/> </bean> <aop:aspect xmlns:aop="urn:jboss:aop-beans:1.0" class="org.jboss.test.microcontainer.beans.TestAspectWithDependency"> <property xmlns="urn:jboss:bean-deployer:2.0" name="dependency"><inject bean="Dependency"/></property> </aop:aspect> .... </deployment>
I get an error trying to handle the "property" element:org.jboss.xb.binding.JBossXBException: Failed to parse source: file:/C:/cygwin/home/Kabir/sourcecontrol/microcontainer/aop-mc-int/target/tests-classes/org/jboss/test/microcontainer/beans/test/AspectWithDependencyJaxbDeploymentTestCaseNotAutomatic1.xml@10,69 at org.jboss.xb.binding.parser.sax.SaxJBossXBParser.parse(SaxJBossXBParser.java:177) at org.jboss.xb.binding.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:139) at org.jboss.test.xb.builder.JBossXBTestDelegate.unmarshal(JBossXBTestDelegate.java:122) at org.jboss.test.aop.junit.JBossXBDeployer.unmarshal(JBossXBDeployer.java:81) at org.jboss.test.aop.junit.JBossXBDeployer.deploy(JBossXBDeployer.java:124) at org.jboss.test.kernel.junit.MicrocontainerTestDelegate.deploy(MicrocontainerTestDelegate.java:289) at org.jboss.test.kernel.junit.MicrocontainerTest.deploy(MicrocontainerTest.java:233) at org.jboss.test.microcontainer.beans.test.AspectWithDependencyTest.testInterceptorWithDependencyCorrectOrder(AspectWithDependencyTest.java:55) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) 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 junit.extensions.TestDecorator.basicRun(TestDecorator.java:22) at junit.extensions.TestSetup$1.protect(TestSetup.java:19) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.extensions.TestSetup.run(TestSetup.java:23) 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) Caused by: org.jboss.xb.binding.JBossXBRuntimeException: {urn:jboss:bean-deployer:2.0}property not found as a child of {urn:jboss:aop-beans:1.0}aspect at org.jboss.xb.binding.sunday.unmarshalling.SundayContentHandler.startElement(SundayContentHandler.java:396) at org.jboss.xb.binding.parser.sax.SaxJBossXBParser$DelegatingContentHandler.startElement(SaxJBossXBParser.java:407) at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source) at org.apache.xerces.xinclude.XIncludeHandler.startElement(Unknown Source) at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) at org.jboss.xb.binding.parser.sax.SaxJBossXBParser.parse(SaxJBossXBParser.java:173) ... 29 more
In my original schema, I had the type for aspect extending the beans abstractBeanfactoryType:<xsd:complexType name="aopBeanfactoryType"> <xsd:annotation> <xsd:documentation> Similar to the beans beanfactoryType, but with an optional class </xsd:documentation> </xsd:annotation> <xsd:complexContent> <xsd:extension base="mc:abstractBeanfactoryType"> <xsd:attribute name="class" type="xsd:token" use="required"/> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:complexType name="aspectOrInterceptorType"> <xsd:annotation> <xsd:documentation> <![CDATA[ aspects or interceptors ]]> </xsd:documentation> </xsd:annotation> <xsd:complexContent> <xsd:extension base="aopBeanfactoryType"> <xsd:attribute name="scope" type="xsd:string" use="optional"/> <xsd:attribute name="factory" type="xsd:string" use="optional"/> <xsd:attribute name="manager-bean" type="xsd:string" use="optional"/> <xsd:attribute name="manager-property" type="xsd:string" use="optional"/> </xsd:extension> </xsd:complexContent> </xsd:complexType>
Is there a way to mimic that using the JAXB style parsing?
org.jboss.aop.microcontainer.beans.beanmetadatafactory.AspectBeanMetaDataFactory does not handle the property field in any special way:@JBossXmlSchema(namespace="urn:jboss:aop-beans:1.0", elementFormDefault=XmlNsForm.QUALIFIED) @XmlRootElement(name="aspect") @XmlType(propOrder={"aliases", "annotations", "classLoader", "constructor", "properties", "create", "start", "depends", "demands", "supplies", "installs", "uninstalls"}) public class AspectBeanMetaDataFactory extends AspectManagerAwareBeanMetaDataFactory implements BeanMetaDataFactory { ... }
AspectBeanMetaDataFactory extends AspectManagerAwareBeanMetaDataFactory extends GenericBeanFactoryMetaData extends AbstractBeanMetaData@JBossXmlSchema(namespace="urn:jboss:bean-deployer:2.0", elementFormDefault=XmlNsForm.QUALIFIED) @XmlRootElement(name="bean") @XmlType(propOrder={"aliases", "annotations", "classLoader", "constructor", "properties", "create", "start", "stop", "destroy", "depends", "demands", "supplies", "installs", "uninstalls", "installCallbacks", "uninstallCallbacks"}) public class AbstractBeanMetaData extends AbstractFeatureMetaData implements BeanMetaData, BeanMetaDataFactory, MutableLifecycleHolder, Serializable { private static final long serialVersionUID = 3L; @XmlElement(name="property", namespace="urn:jboss:bean-deployer:2.0", type=AbstractPropertyMetaData.class) public void setProperties(Set<PropertyMetaData> properties) { this.properties = properties; flushJBossObjectCache(); }
If I include a setProperties() method in AspectBeanMetaDataFactory to include the namespace it gets a bit further@JBossXmlSchema(namespace="urn:jboss:aop-beans:1.0", elementFormDefault=XmlNsForm.QUALIFIED) @XmlRootElement(name="aspect") @XmlType(propOrder={"aliases", "annotations", "classLoader", "constructor", "properties", "create", "start", "depends", "demands", "supplies", "installs", "uninstalls"}) public class AspectBeanMetaDataFactory extends AspectManagerAwareBeanMetaDataFactory implements BeanMetaDataFactory { ... @XmlElement(name="property", namespace="urn:jboss:bean-deployer:2.0", type=AbstractPropertyMetaData.class) public void setProperties(Set<PropertyMetaData> properties) { this.properties = properties; flushJBossObjectCache(); }
it then chokes on the nested "inject" field.org.jboss.xb.binding.JBossXBException: Failed to parse source: file:/C:/cygwin/home/Kabir/sourcecontrol/microcontainer/aop-mc-int/target/tests-classes/org/jboss/test/microcontainer/beans/test/AspectWithDependencyJaxbDeploymentTestCaseNotAutomatic1.xml@10,96 at org.jboss.xb.binding.parser.sax.SaxJBossXBParser.parse(SaxJBossXBParser.java:177) at org.jboss.xb.binding.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:139) at org.jboss.test.xb.builder.JBossXBTestDelegate.unmarshal(JBossXBTestDelegate.java:122) at org.jboss.test.aop.junit.JBossXBDeployer.unmarshal(JBossXBDeployer.java:81) at org.jboss.test.aop.junit.JBossXBDeployer.deploy(JBossXBDeployer.java:124) at org.jboss.test.kernel.junit.MicrocontainerTestDelegate.deploy(MicrocontainerTestDelegate.java:289) at org.jboss.test.kernel.junit.MicrocontainerTest.deploy(MicrocontainerTest.java:233) at org.jboss.test.microcontainer.beans.test.AspectWithDependencyTest.testInterceptorWithDependencyCorrectOrder(AspectWithDependencyTest.java:55) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) 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 junit.extensions.TestDecorator.basicRun(TestDecorator.java:22) at junit.extensions.TestSetup$1.protect(TestSetup.java:19) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.extensions.TestSetup.run(TestSetup.java:23) 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) Caused by: org.jboss.xb.binding.JBossXBRuntimeException: {urn:jboss:bean-deployer:2.0}inject not found as a child of {urn:jboss:bean-deployer:2.0}property at org.jboss.xb.binding.sunday.unmarshalling.SundayContentHandler.startElement(SundayContentHandler.java:396) at org.jboss.xb.binding.parser.sax.SaxJBossXBParser$DelegatingContentHandler.startElement(SaxJBossXBParser.java:407) at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source) at org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source) at org.apache.xerces.xinclude.XIncludeHandler.emptyElement(Unknown Source) at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) at org.jboss.xb.binding.parser.sax.SaxJBossXBParser.parse(SaxJBossXBParser.java:173) ... 29 more
I could possibly fix that by adding namespaces to things, but it does not feel like the right approach to me? This sounds similar to what I think you meant here, but I am not sure?"adrian@jboss.org" wrote:
It doesn't actually make much difference, except you'll have to reproduce all the MC schema
in your schema using your namespace (and maintain it every time it changes ;-)
I also tried modifying the xml<?xml version="1.0" encoding="UTF-8"?> <deployment xmlns="urn:jboss:bean-deployer:2.0"> <bean name="AspectManager" class="org.jboss.aop.AspectManager"> <constructor factoryClass="org.jboss.aop.AspectManager" factoryMethod="instance"/> </bean> <aop:aspect xmlns:aop="urn:jboss:aop-beans:1.0" class="org.jboss.test.microcontainer.beans.TestAspectWithDependency"> <property xmlns="urn:jboss:bean-deployer:2.0" name="dependency"><inject xmlns="urn:jboss:bean-deployer:2.0" bean="Dependency"/></property> </aop:aspect> ... </deployment>
but that yields the same problemorg.jboss.xb.binding.JBossXBException: Failed to parse source: file:/C:/cygwin/home/Kabir/sourcecontrol/microcontainer/aop-mc-int/target/tests-classes/org/jboss/test/microcontainer/beans/test/AspectWithDependencyJaxbDeploymentTestCaseNotAutomatic1.xml@10,132 ... Caused by: org.jboss.xb.binding.JBossXBRuntimeException: {urn:jboss:bean-deployer:2.0}inject not found as a child of {urn:jboss:bean-deployer:2.0}property at org.jboss.xb.binding.sunday.unmarshalling.SundayContentHandler.startElement(SundayContentHandler.java:396) at org.jboss.xb.binding.parser.sax.SaxJBossXBParser$DelegatingContentHandler.startElement(SaxJBossXBParser.java:407) at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source) at org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source) at org.apache.xerces.xinclude.XIncludeHandler.emptyElement(Unknown Source) at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) at org.jboss.xb.binding.parser.sax.SaxJBossXBParser.parse(SaxJBossXBParser.java:173) ... 29 more
The test to reproduce this is org.jboss.test.microcontainer.beans.test.AspectWithDependencyJaxbDeploymentTestCase. -
21. Re: Implementing JAXB style parsing for aop-mc-int
adrian.brock Feb 27, 2008 12:24 PM (in response to kabirkhan)Kabir,
Why have you written BeanMetaUtil?
There already is a BeanMetaDataBuilder class inside the MC.
You shouldn't have to reference any org.jboss.beans.metadata.plugins classes
outside the MC project.
Doing so, is just asking for trouble. :-) -
22. Re: Implementing JAXB style parsing for aop-mc-int
adrian.brock Feb 27, 2008 12:33 PM (in response to kabirkhan)Also, why are using GenericBeanMetaData?
I've deprecated this old class to avoid confusion, it can't possibly work
with JBoss/AXB -
23. Re: Implementing JAXB style parsing for aop-mc-int
adrian.brock Feb 27, 2008 1:18 PM (in response to kabirkhan)Even if you fix it to extends GenericBeanMetaDataFactory2 (or use your own factory),
what you are trying to do isn't going to work at the moment.
1) With the way the MC beans are currently marked up, there is no global
type "property" in the MC schema. i.e. there is no @XmlRootElement
or type name here:@XmlType(propOrder={"annotations", "value"}) public class AbstractPropertyMetaData
It should be something like this to conform with the schema document@XmlRootElement(name="property") @XmlType(name="property" propOrder={"annotations", "value"})
This is obviously wrong and needs fixing.
The same is true for a number of other types.
2) But even if we did this, the way the builder is currently working
is that if it finds a class in your class hierarchy, it will add it to your namespace.
One way to fix this would be to mark it up as@XmlRootElement(name="property" namespace="urn:jboss:bean-deployer:2.0") @XmlType(name="property" namespace="urn:jboss:bean-deployer:2.0")
but we don't want to do this, because then the MC couldn't re-use this class across
versions.
I know Alex added a feature where he introduced an xmlns annotation,
but I don't know if it solves this problem. We'd need to ask him.
3) The third point is that you just leave it as it
and have all the mc elements and types in your namespace
which means that users won't have to specify xmlns tags.<aspect xmlns:aop="urn:jboss:aop-beans:1.0" class="org.jboss.test.microcontainer.beans.TestAspectWithDependency"> <property name="dependency"><inject bean="Dependency"/></property> </aspect>
-
24. Re: Implementing JAXB style parsing for aop-mc-int
adrian.brock Feb 27, 2008 1:31 PM (in response to kabirkhan)We could actually make (3) a lot easier to manage
if we used xsd:redefine
http://www.w3.org/TR/xmlschema-1/#modify-schema
and shared a common schema to define the shared elements.
i.e. create an mc-common.xsd with no target namespace
and all the shared elements/types
then we each redefine it into our own namespace.
I think (3) would also reduce the amout of typing and baggage
the user has to do, since they don't have to xmlns everywhere. ;-) -
25. Re: Implementing JAXB style parsing for aop-mc-int
kabirkhan Feb 28, 2008 5:45 AM (in response to kabirkhan)"adrian@jboss.org" wrote:
|
There already is a BeanMetaDataBuilder class inside the MC.
OK, that looks a lot nicer :-) -
26. Re: Implementing JAXB style parsing for aop-mc-int
kabirkhan Feb 28, 2008 1:29 PM (in response to kabirkhan) -
27. Re: Implementing JAXB style parsing for aop-mc-int
kabirkhan Mar 5, 2008 8:02 AM (in response to kabirkhan)Reading this thread http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4134204#4134204 I came back to this. Regarding 3) What would this xsd:refine map to in jaxb annotations? My understanding was that using jaxb it generates a schema from the annotations?
Apart from that, if I have understood you correctly, mc-commons.xsd would contain the current bean_deployer_2_0.xsd.
I would then be able to do<aop> <bean name="Bean" class="Foo"/> <aspect class="MyAspect" scope="PER_VM"> <property name="thing">XXX</property> </aspect> </aop>
If I wanted to do this the other way around, I would need to use xmlns on the aop specific elements<deployment> <bean name="Bean" class="Foo"/> <aspect xmlns:aop="urn:jboss:aop-beans:1.0" class="MyAspect" scope="PER_VM"> <property name="thing">XXX</property> </aspect> </deployment>
I'm not sure what the xmlns should be for property, but apart from that is my understanding correct? -
28. Re: Implementing JAXB style parsing for aop-mc-int
kabirkhan Mar 5, 2008 8:06 AM (in response to kabirkhan)The root element probably still needs the namespace, so my 2 previous examples should read
<aop xmlns:aop="urn:jboss:aop-beans:1.0"> <bean name="Bean" class="Foo"/> <aspect class="MyAspect" scope="PER_VM"> <property name="thing">XXX</property> </aspect> </aop>
<deployment xmlns="urn:jboss:bean-deployer:2.0"> <bean name="Bean" class="Foo"/> <aspect xmlns:aop="urn:jboss:aop-beans:1.0" class="MyAspect" scope="PER_VM"> <property xmlns="???" name="thing">XXX</property> </aspect> </deployment>
-
29. Re: Implementing JAXB style parsing for aop-mc-int
adrian.brock Mar 5, 2008 8:44 AM (in response to kabirkhan)"kabir.khan@jboss.com" wrote:
Reading this thread http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4134204#4134204 I came back to this. Regarding 3) What would this xsd:refine map to in jaxb annotations? My understanding was that using jaxb it generates a schema from the annotations?
It doesn't map to anything .
The xsd:redefine, just specifies what is the default behaviour the JBossXBBuilder
which is to include types reachable from your hierarchy in your namespace
(absent any explicit namepace= in the annotations).
Apart from that, if I have understood you correctly, mc-commons.xsd would contain the current bean_deployer_2_0.xsd.
Yes, except the root elements (deployment, bean, etc.) and without a namspace
I would then be able to do<aop> <bean name="Bean" class="Foo"/> <aspect class="MyAspect" scope="PER_VM"> <property name="thing">XXX</property> </aspect> </aop>
Correct
If I wanted to do this the other way around, I would need to use xmlns on the aop specific elements<deployment> <bean name="Bean" class="Foo"/> <aspect xmlns:aop="urn:jboss:aop-beans:1.0" class="MyAspect" scope="PER_VM"> <property name="thing">XXX</property> </aspect> </deployment>
I'm not sure what the xmlns should be for property, but apart from that is my understanding correct?
The idea is you don't need one.
What you defined is probably not correct unless your schema allows urn:jboss:bean-deployer:2.0:property
as an element of aspect.
The correct usage would be either
explicit<deployment> <bean name="Bean" class="Foo"/> <aspect xmlns:aop="urn:jboss:aop-beans:1.0" class="MyAspect" scope="PER_VM"> <aop:property name="thing">XXX</aop:property> </aspect> </deployment>
or change the default namespace<deployment> <bean name="Bean" class="Foo"/> <!-- HERE - simple xmlns --> <aspect xmlns="urn:jboss:aop-beans:1.0" class="MyAspect" scope="PER_VM"> <property name="thing">XXX</property> </aspect> </deployment>