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]