Author: rdonkin
Date: Thu May 18 15:00:07 2006
New Revision: 407644

URL: http://svn.apache.org/viewvc?rev=407644&view=rev
Log:
Improved default mapping for collection subclasses.

Added:
    
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/expression/CollectionUpdater.java
    
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/expression/TestCollectionUpdater.java
    
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/
    
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/AlphaList.java
    
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/AlphaOneImpl.java
    
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/AlphaTwoImpl.java
    
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/IAlpha.java
    
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/TestPolyList.java
Modified:
    
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/XMLIntrospector.java
    jakarta/commons/proper/betwixt/trunk/xdocs/guide/derived.xml
    jakarta/commons/proper/betwixt/trunk/xdocs/tasks.xml

Modified: 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/XMLIntrospector.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/XMLIntrospector.java?rev=407644&r1=407643&r2=407644&view=diff
==============================================================================
--- 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/XMLIntrospector.java
 (original)
+++ 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/XMLIntrospector.java
 Thu May 18 15:00:07 2006
@@ -37,6 +37,7 @@
 import org.apache.commons.betwixt.digester.MultiMappingBeanInfoDigester;
 import org.apache.commons.betwixt.digester.XMLBeanInfoDigester;
 import org.apache.commons.betwixt.digester.XMLIntrospectorHelper;
+import org.apache.commons.betwixt.expression.CollectionUpdater;
 import org.apache.commons.betwixt.expression.EmptyExpression;
 import org.apache.commons.betwixt.expression.IteratorExpression;
 import org.apache.commons.betwixt.expression.MapEntryAdder;
@@ -727,9 +728,12 @@
                 getLog().trace("Bean is loop");
                 ElementDescriptor loopDescriptor = new ElementDescriptor();
                 loopDescriptor.setCollective(true);
+                loopDescriptor.setHollow(true);
+                loopDescriptor.setSingularPropertyType(Object.class);
                 loopDescriptor.setContextExpression(
                     new IteratorExpression( EmptyExpression.getInstance() )
                 );
+                loopDescriptor.setUpdater(CollectionUpdater.getInstance());
                 if ( bean.isMapType() ) {
                     loopDescriptor.setQualifiedName( "entry" );
                 }

Added: 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/expression/CollectionUpdater.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/expression/CollectionUpdater.java?rev=407644&view=auto
==============================================================================
--- 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/expression/CollectionUpdater.java
 (added)
+++ 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/expression/CollectionUpdater.java
 Thu May 18 15:00:07 2006
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2006 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.expression;
+
+import java.util.Collection;
+
+/**
+ * Updates a Collection by adding the new value to it.
+ */
+public class CollectionUpdater implements Updater {
+
+    private static CollectionUpdater INSTANCE;
+    
+    /**
+     * Gets singleton instance.
+     * @return <code>CollectionUpdater</code>, not null
+     */
+    public static synchronized CollectionUpdater getInstance() {
+         if (INSTANCE == null) {
+             INSTANCE = new CollectionUpdater();
+         }
+         return INSTANCE;
+    }
+    
+    /**
+     * Updates collection contained by the context by adding the new value.
+     * @param context <code>Context</code>, not null
+     * @param newValue value to be added, possibly null 
+     */
+    public void update(Context context, Object newValue) {
+            if (newValue != null) {
+                Object subject = context.getBean();
+                if (subject != null && subject instanceof Collection) {
+                    Collection collection = (Collection) subject;
+                    collection.add(newValue);
+                }
+            }
+    }
+}

Added: 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/expression/TestCollectionUpdater.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/expression/TestCollectionUpdater.java?rev=407644&view=auto
==============================================================================
--- 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/expression/TestCollectionUpdater.java
 (added)
+++ 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/expression/TestCollectionUpdater.java
 Thu May 18 15:00:07 2006
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2006 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.expression;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+/**
+ * Tests for [EMAIL PROTECTED] CollectionUpdater}.
+ */
+public class TestCollectionUpdater extends TestCase {
+    
+    private CollectionUpdater updater = CollectionUpdater.getInstance();
+    private Context context = new Context();
+   
+    protected void setUp() throws Exception {
+        super.setUp();
+        updater = CollectionUpdater.getInstance();
+        context = new Context();
+    }
+    
+    public void testUpdateNull() throws Exception {
+        context.setBean(null);
+        updater.update(context, null);
+        updater.update(context, "Whatever");
+    }
+
+    public void testUpdateNotCollection() throws Exception {
+        context.setBean("Whatever");
+        updater.update(context, null);
+        updater.update(context, "Whatever");
+    }
+    
+    public void testUpdateCollection() throws Exception {
+        List list = new ArrayList();
+        context.setBean(list);
+        updater.update(context, null);
+        updater.update(context, "Whatever");
+        assertEquals("Updater updates the list with the value", 1, 
list.size());
+        updater.update(context, "Thus");
+        assertEquals("Updater updates the list with the value",  2, 
list.size());
+        assertEquals("Updater updates the list in order", "Whatever", 
list.get(0));
+        assertEquals("Updater updates the list in order", "Thus", list.get(1));
+    }
+}

Added: 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/AlphaList.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/AlphaList.java?rev=407644&view=auto
==============================================================================
--- 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/AlphaList.java
 (added)
+++ 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/AlphaList.java
 Thu May 18 15:00:07 2006
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2006 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.poly;
+
+import java.util.*;
+
+public class AlphaList extends ArrayList {
+
+}

Added: 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/AlphaOneImpl.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/AlphaOneImpl.java?rev=407644&view=auto
==============================================================================
--- 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/AlphaOneImpl.java
 (added)
+++ 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/AlphaOneImpl.java
 Thu May 18 15:00:07 2006
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2006 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.poly;
+
+public class AlphaOneImpl implements IAlpha {
+
+       public void alpha() {
+       }
+
+}

Added: 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/AlphaTwoImpl.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/AlphaTwoImpl.java?rev=407644&view=auto
==============================================================================
--- 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/AlphaTwoImpl.java
 (added)
+++ 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/AlphaTwoImpl.java
 Thu May 18 15:00:07 2006
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2006 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.poly;
+
+public class AlphaTwoImpl implements IAlpha {
+
+       public void alpha() {
+       }
+
+}

Added: 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/IAlpha.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/IAlpha.java?rev=407644&view=auto
==============================================================================
--- 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/IAlpha.java
 (added)
+++ 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/IAlpha.java
 Thu May 18 15:00:07 2006
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2006 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.poly;
+
+public interface IAlpha {
+
+       public void alpha();
+}

Added: 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/TestPolyList.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/TestPolyList.java?rev=407644&view=auto
==============================================================================
--- 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/TestPolyList.java
 (added)
+++ 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/poly/TestPolyList.java
 Thu May 18 15:00:07 2006
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2006 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.poly;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import org.apache.commons.betwixt.AbstractTestCase;
+import org.apache.commons.betwixt.BindingConfiguration;
+import org.apache.commons.betwixt.ElementDescriptor;
+import org.apache.commons.betwixt.XMLBeanInfo;
+import org.apache.commons.betwixt.XMLIntrospector;
+import org.apache.commons.betwixt.io.BeanReader;
+import org.apache.commons.betwixt.io.BeanWriter;
+import org.xml.sax.InputSource;
+
+public class TestPolyList extends AbstractTestCase {
+
+       public TestPolyList(String testName) {
+               super(testName);
+       }
+
+       private static final String XML = "<AlphaList>" + "<AlphaOneImpl/>"
+                       + "<AlphaTwoImpl/>" + "</AlphaList>";
+
+       private static final String MAPPING = "<?xml version='1.0'?>"
+                       + "<betwixt-config>" 
+                       + "  <class 
name='org.apache.commons.betwixt.poly.AlphaOneImpl'>"
+                       + "   <element name='AlphaOneImpl'/>" 
+                       + "  </class>"
+                       + "  <class 
name='org.apache.commons.betwixt.poly.AlphaTwoImpl'>"
+                       + "    <element name='AlphaTwoImpl'/>" 
+                       + "  </class>"
+                       + "</betwixt-config>";
+       
+       public void testWrite() throws Exception {
+               AlphaList bean = new AlphaList();
+               AlphaOneImpl one = new AlphaOneImpl();
+               bean.add(one);
+               AlphaTwoImpl two = new AlphaTwoImpl();
+               bean.add(two);
+
+               StringWriter out = new StringWriter();
+               BeanWriter writer = new BeanWriter(out);
+               StringReader mapping = new StringReader(MAPPING);
+               writer.getXMLIntrospector().register(new InputSource(mapping));
+               configure(writer.getBindingConfiguration());
+               writer.write(bean);
+       
+        xmlAssertIsomorphicContent(
+                parseString(XML),
+                parseString(out.getBuffer().toString()),
+                true);
+       }
+
+       public void testRead() throws Exception {
+               StringReader in = new StringReader(XML);
+               BeanReader reader = new BeanReader();
+               StringReader mapping = new StringReader(MAPPING);
+               reader.registerMultiMapping(new InputSource(mapping));
+        reader.registerBeanClass(AlphaList.class);
+               configure(reader.getBindingConfiguration());
+               Object bean = reader.parse(in);
+               assertTrue(bean instanceof AlphaList);
+               AlphaList list = (AlphaList) bean;
+               assertEquals(2, list.size());
+       }
+
+       public void testIntrospection() throws Exception         {
+               XMLIntrospector introspector = new XMLIntrospector();
+               XMLBeanInfo beanInfo = introspector.introspect(AlphaList.class);
+               ElementDescriptor[] descriptors = 
beanInfo.getElementDescriptor().getElementDescriptors();
+               assertEquals("One descriptor", 1, descriptors.length);
+        assertTrue(descriptors[0].isHollow());
+        assertNotNull(descriptors[0].getContextExpression());
+        assertNotNull(descriptors[0].getUpdater());
+        assertEquals("A list can contain any object", Object.class, 
descriptors[0].getSingularPropertyType());
+       }
+
+       private void configure(BindingConfiguration configuration) {
+               configuration.setMapIDs(false);
+       }
+}

Modified: jakarta/commons/proper/betwixt/trunk/xdocs/guide/derived.xml
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/betwixt/trunk/xdocs/guide/derived.xml?rev=407644&r1=407643&r2=407644&view=diff
==============================================================================
--- jakarta/commons/proper/betwixt/trunk/xdocs/guide/derived.xml (original)
+++ jakarta/commons/proper/betwixt/trunk/xdocs/guide/derived.xml Thu May 18 
15:00:07 2006
@@ -237,5 +237,30 @@
         </p>
     </subsection>
 </section>
+<section name='Default Mapping For Collections Implementations'>
+       <p>
+The default mapping for a collection is the one created automatically
+by Betwixt. This is controlled by a number of general configuration settings.
+For some classes (including <code>Collection</code> implementations)
+special rules are applied. For collection implementations, these special
+rules ensure that the contents are written and polymophism is supported
+for reading.
+       </p>
+       <p>
+For example, suppose <code>AlphaList extends ArrayList</code>. It usually
+contains <code>BetaBean</code>'s and <code>GammaBean</code>'s. Use a 
+<a href='binding.html#Multi Mapping Document Format'>multi-mapping</a> contain
+mappings for just <code>BetaBean</code> and <code>GammaBean</code> and not
+<code>AlphaList</code>. This will force the default mapping to be used. 
+When reading, <code>AlphaList</code> should be registered after the 
+multimapping thus:
+       </p>
+<source><![CDATA[
+       BeanReader reader = ...
+       ...
+       reader.registerMultiMapping(...);
+    reader.registerBeanClass(AlphaList.class);
+]]></source>
+</section>
 </body>
 </document>

Modified: jakarta/commons/proper/betwixt/trunk/xdocs/tasks.xml
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/betwixt/trunk/xdocs/tasks.xml?rev=407644&r1=407643&r2=407644&view=diff
==============================================================================
--- jakarta/commons/proper/betwixt/trunk/xdocs/tasks.xml (original)
+++ jakarta/commons/proper/betwixt/trunk/xdocs/tasks.xml Thu May 18 15:00:07 
2006
@@ -200,6 +200,9 @@
     <subsection name='Since 0.7'>            
         <ul>
           <li>
+Improved support for natural polymorphic mappings of collection subclasses.
+          </li>
+          <li>
 Added support for option inheritance between parent and target mappings. Issue 
#37542.
           </li>
                <li>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to