You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by rd...@apache.org on 2005/04/20 23:40:04 UTC
svn commit: r162076 - in /jakarta/commons/proper/betwixt/trunk/src:
java/org/apache/commons/betwixt/ java/org/apache/commons/betwixt/registry/
test/org/apache/commons/betwixt/ test/org/apache/commons/betwixt/registry/
Author: rdonkin
Date: Wed Apr 20 14:40:03 2005
New Revision: 162076
URL: http://svn.apache.org/viewcvs?rev=162076&view=rev
Log:
Fixed some problems with polymorphic binding in collections
Added:
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/TestCollectionMapping.java
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/registry/TestRegistryPolymorphicResolution.java
Modified:
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/ElementDescriptor.java
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/registry/DefaultXMLBeanInfoRegistry.java
Modified: jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/ElementDescriptor.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/ElementDescriptor.java?rev=162076&r1=162075&r2=162076&view=diff
==============================================================================
--- jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/ElementDescriptor.java (original)
+++ jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/ElementDescriptor.java Wed Apr 20 14:40:03 2005
@@ -313,8 +313,12 @@
ElementDescriptor elementDescriptor = null;
ElementDescriptor descriptorWithNullName = null;
+ ElementDescriptor firstPolymorphic = null;
ElementDescriptor[] elementDescriptors = getElementDescriptors();
for (int i=0, size=elementDescriptors.length; i<size; i++) {
+ if (firstPolymorphic == null && elementDescriptors[i].isPolymorphic()) {
+ firstPolymorphic = elementDescriptors[i];
+ }
String elementName = elementDescriptors[i].getQualifiedName();
if (name.equals(elementName)) {
elementDescriptor = elementDescriptors[i];
@@ -323,6 +327,9 @@
if (descriptorWithNullName == null && elementName == null) {
descriptorWithNullName = elementDescriptors[i];
}
+ }
+ if (elementDescriptor == null) {
+ elementDescriptor = firstPolymorphic;
}
if (elementDescriptor == null) {
elementDescriptor = descriptorWithNullName;
Modified: jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/registry/DefaultXMLBeanInfoRegistry.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/registry/DefaultXMLBeanInfoRegistry.java?rev=162076&r1=162075&r2=162076&view=diff
==============================================================================
--- jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/registry/DefaultXMLBeanInfoRegistry.java (original)
+++ jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/registry/DefaultXMLBeanInfoRegistry.java Wed Apr 20 14:40:03 2005
@@ -78,10 +78,14 @@
for (Iterator it = cachedClasses.iterator(); it.hasNext();) {
XMLBeanInfo beanInfo = get((Class)it.next());
ElementDescriptor typeDescriptor = beanInfo.getElementDescriptor();
- if (mapping.getName().equals(typeDescriptor.getQualifiedName()) &&
- mappedDescriptor.getPropertyType().isAssignableFrom(beanInfo.getBeanClass())) {
- result = beanInfo.getBeanClass();
- break;
+ boolean sameName = mapping.getName().equals(typeDescriptor.getQualifiedName());
+ if (sameName)
+ {
+ boolean compatibleClass = mappedDescriptor.getSingularPropertyType().isAssignableFrom(beanInfo.getBeanClass());
+ if (compatibleClass ) {
+ result = beanInfo.getBeanClass();
+ break;
+ }
}
}
return result;
Added: jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/TestCollectionMapping.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/TestCollectionMapping.java?rev=162076&view=auto
==============================================================================
--- jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/TestCollectionMapping.java (added)
+++ jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/TestCollectionMapping.java Wed Apr 20 14:40:03 2005
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.betwixt;
+
+
+import java.beans.IntrospectionException;
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.commons.betwixt.io.BeanReader;
+import org.apache.commons.betwixt.io.BeanWriter;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+/**
+ * Tests the multi-mapping of collections with polymorphic entries.
+ *
+ * @author Thomas Dudziak (tomdz@apache.org)
+ */
+public class TestCollectionMapping extends AbstractTestCase
+{
+ public static class Container
+ {
+ private List _elements = new ArrayList();
+
+ public Iterator getElements()
+ {
+ return _elements.iterator();
+ }
+
+ public void addElement(Element element)
+ {
+ _elements.add(element);
+ }
+ }
+
+ public static interface Element
+ {}
+
+ public static class ElementA implements Element
+ {}
+
+ public static class ElementB implements Element
+ {}
+
+ private static final String MAPPING =
+ "<?xml version=\"1.0\"?>\n"+
+ "<betwixt-config>\n"+
+ " <class name=\"org.apache.commons.betwixt.TestCollectionMapping$Container\">\n"+
+ " <element name=\"container\">\n"+
+ " <element name=\"elements\">\n"+
+ " <element property=\"elements\" updater='addElement'/>\n"+
+ " </element>\n"+
+ " </element>\n"+
+ " </class>\n"+
+ " <class name=\"org.apache.commons.betwixt.TestCollectionMapping$ElementA\">\n"+
+ " <element name=\"elementA\"/>\n"+
+ " </class>\n"+
+ " <class name=\"org.apache.commons.betwixt.TestCollectionMapping$ElementB\">\n"+
+ " <element name=\"elementB\"/>\n"+
+ " </class>\n"+
+ "</betwixt-config>";
+ private static final String EXPECTED =
+ "<?xml version=\"1.0\" ?>\n"+
+ " <container>\n"+
+ " <elements>\n"+
+ " <elementB/>\n"+
+ " <elementA/>\n"+
+ " </elements>\n"+
+ " </container>\n";
+
+ public TestCollectionMapping(String testName)
+ {
+ super(testName);
+ }
+
+ public void testRoundTripWithSingleMappingFile() throws IOException, SAXException, IntrospectionException
+ {
+ Container container = new Container();
+
+ container.addElement(new ElementB());
+ container.addElement(new ElementA());
+
+ StringWriter outputWriter = new StringWriter();
+
+ outputWriter.write("<?xml version=\"1.0\" ?>\n");
+
+ BeanWriter beanWriter = new BeanWriter(outputWriter);
+
+ beanWriter.enablePrettyPrint();
+ beanWriter.setWriteEmptyElements(true);
+ beanWriter.getBindingConfiguration().setMapIDs(false);
+ beanWriter.getXMLIntrospector().register(new InputSource(new StringReader(MAPPING)));
+ beanWriter.write(container);
+
+ String output = outputWriter.toString();
+
+ assertEquals(EXPECTED, output);
+
+ BeanReader beanReader = new BeanReader();
+
+ beanReader.registerMultiMapping(new InputSource(new StringReader(MAPPING)));
+
+ StringReader xmlReader = new StringReader(output);
+
+ container = (Container)beanReader.parse(xmlReader);
+
+ Iterator it = container.getElements();
+
+ assertTrue(it.next() instanceof ElementB);
+ assertTrue(it.next() instanceof ElementA);
+ assertFalse(it.hasNext());
+ }
+
+}
Added: jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/registry/TestRegistryPolymorphicResolution.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/registry/TestRegistryPolymorphicResolution.java?rev=162076&view=auto
==============================================================================
--- jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/registry/TestRegistryPolymorphicResolution.java (added)
+++ jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/registry/TestRegistryPolymorphicResolution.java Wed Apr 20 14:40:03 2005
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.betwixt.registry;
+
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.commons.betwixt.BindingConfiguration;
+import org.apache.commons.betwixt.ElementDescriptor;
+import org.apache.commons.betwixt.XMLIntrospector;
+import org.apache.commons.betwixt.TestCollectionMapping.Element;
+import org.apache.commons.betwixt.io.read.ElementMapping;
+import org.apache.commons.betwixt.io.read.ReadConfiguration;
+import org.apache.commons.betwixt.io.read.ReadContext;
+import org.xml.sax.InputSource;
+import org.xml.sax.helpers.AttributesImpl;
+
+import junit.framework.TestCase;
+
+/**
+ * @author Thomas Dudziak (tomdz@apache.org)
+ */
+public class TestRegistryPolymorphicResolution extends TestCase {
+
+ public static class Container
+ {
+ private List _elements = new ArrayList();
+
+ public Iterator getElements()
+ {
+ return _elements.iterator();
+ }
+
+ public void addElement(Element element)
+ {
+ _elements.add(element);
+ }
+ }
+
+ public static interface Element
+ {}
+
+ public static class ElementA implements Element
+ {}
+
+ public static class ElementB implements Element
+ {}
+
+ private static final String MAPPING =
+ "<?xml version=\"1.0\"?>\n"+
+ "<betwixt-config>\n"+
+ " <class name=\"org.apache.commons.betwixt.registry.TestRegistryPolymorphicResolution$Container\">\n"+
+ " <element name=\"container\">\n"+
+ " <element name=\"elements\">\n"+
+ " <element property=\"elements\"/>\n"+
+ " </element>\n"+
+ " </element>\n"+
+ " </class>\n"+
+ " <class name=\"org.apache.commons.betwixt.registry.TestRegistryPolymorphicResolution$ElementA\">\n"+
+ " <element name=\"elementA\"/>\n"+
+ " </class>\n"+
+ " <class name=\"org.apache.commons.betwixt.registry.TestRegistryPolymorphicResolution$ElementB\">\n"+
+ " <element name=\"elementB\"/>\n"+
+ " </class>\n"+
+ "</betwixt-config>";
+
+ public void testRegisterThenResolve() throws Exception
+ {
+ XMLIntrospector introspector = new XMLIntrospector();
+ introspector.register(new InputSource(new StringReader(MAPPING)));
+
+
+ ElementDescriptor descriptor = introspector.introspect(Element.class).getElementDescriptor();
+ ElementMapping elementMapping = new ElementMapping();
+ elementMapping.setAttributes(new AttributesImpl());
+ elementMapping.setName("Bogus");
+ elementMapping.setDescriptor(descriptor);
+ elementMapping.setType(Iterator.class);
+ ReadContext readContext = new ReadContext(new BindingConfiguration(), new ReadConfiguration());
+
+ assertNull(introspector.getPolymorphicReferenceResolver().resolveType(elementMapping, readContext));
+
+ elementMapping.setName("elementA");
+ Class resolution = introspector.getPolymorphicReferenceResolver().resolveType(elementMapping, readContext);
+ assertEquals("Should resolve to the element about", ElementA.class, resolution);
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org