Mixing wildcards and elements
kabirkhan Apr 28, 2008 2:34 PMAlex,
Can you please take a quick look at the XmlLoadableAopTestCase in the aop-mc-int project?
Basically we have
@JBossXmlSchema(namespace="urn:jboss:aop-beans:1.0", elementFormDefault=XmlNsForm.QUALIFIED) @XmlRootElement(name="aspect") public class AspectBeanMetaDataFactory extends AspectManagerAwareBeanMetaDataFactory implements BeanMetaDataFactory { ... private List<Element> elements; public List<Element> getElements() { return elements; } @XmlAnyElement(lax=true) public void setElements(List<Element> elements) { this.elements = elements; } @Override public List<BeanMetaData> getBeans() { ArrayList<BeanMetaData> result = new ArrayList<BeanMetaData>(); this.name = super.getBean(); } } @XmlRootElement(name="beanfactory") @XmlType(name="beanfactoryType", propOrder={"aliases", "annotations", "classLoader", "constructor", "properties", "create", "start", "depends", "demands", "supplies", "installs", "uninstalls", "installCallbacks", "uninstallCallbacks"}) public class GenericBeanFactoryMetaData extends JBossObject implements BeanMetaDataFactory, Serializable { ... protected Set<PropertyMetaData> properties; public Set<PropertyMetaData> getProperties() { return properties; } @XmlElement(name="property", type=AbstractPropertyMetaData.class) public void setProperties(Set<PropertyMetaData> properties) { this.properties = properties; } public List<BeanMetaData> getBeans() { ... if (properties != null && properties.size() > 0) { PropertyMap propertyMap = new PropertyMap(); for (PropertyMetaData property : properties) //CCE as explained below { propertyMap.put(property.getName(), property.getValue()); } builder.addPropertyMetaData("properties", propertyMap); } ... } }
In XmlLoadableAopTestCase.xml I have the following defined:
<aspect class="org.jboss.test.microcontainer.beans.XmlLoadableAspect"> <somexml>hello</somexml> <attribute name="IntAttr">12</attribute> <!-- <property name="property">Test1</property> --> </aspect>
"attribute" and "somexml" are wildcards, while "property" is declared on GBFMD. As it is the test is fine. If I remove somexml and attribute, and uncomment property it also parses fine. If I enable all three elements, I get a CCE at the point shown in GBFMD.getBEans(), since the properties map now contains one element of type org.apache.xerces.dom.ElementNSImpl instead of PropertyMetaData. I tried to reproduce this in the jbossxb project, but it worked as expected there, so I have probably missed some minor detail?