Author: rdonkin
Date: Thu Feb 17 12:53:49 2005
New Revision: 154190

URL: http://svn.apache.org/viewcvs?view=rev&rev=154190
Log:
Added strategy for id storage. Contributed by Christian Aust.

Added:
    
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/strategy/DefaultIdStoringStrategy.java
    
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/strategy/IdStoringStrategy.java
    
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/strategy/ElementsList.java
    
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/strategy/TestIdStorageStrategy.java
Modified:
    
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/BindingConfiguration.java
    
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/expression/Context.java
    
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/AbstractBeanWriter.java
    
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/read/ReadContext.java
    
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/strategy/ActionMappingStrategy.java
    
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/recursion/TestRecursion.java

Modified: 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/BindingConfiguration.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/BindingConfiguration.java?view=diff&r1=154189&r2=154190
==============================================================================
--- 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/BindingConfiguration.java
 (original)
+++ 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/BindingConfiguration.java
 Thu Feb 17 12:53:49 2005
@@ -18,6 +18,7 @@
 import java.io.Serializable;
 
 import org.apache.commons.betwixt.strategy.DefaultObjectStringConverter;
+import org.apache.commons.betwixt.strategy.IdStoringStrategy;
 import org.apache.commons.betwixt.strategy.ObjectStringConverter;
 import org.apache.commons.betwixt.strategy.ValueSuppressionStrategy;
 
@@ -48,6 +49,8 @@
     private String classNameAttribute = "className";
     /** Strategy for suppressing attributes with certain values when writing */
     private ValueSuppressionStrategy valueSuppressionStrategy  = 
ValueSuppressionStrategy.DEFAULT;
+    /** Strategy for storing and accessing ID values */
+    private IdStoringStrategy idStoringStrategy = IdStoringStrategy.DEFAULT;
     
     /**
      * Constructs a BindingConfiguration with default properties.
@@ -147,5 +150,24 @@
     public void setValueSuppressionStrategy(
             ValueSuppressionStrategy valueSuppressionStrategy) {
         this.valueSuppressionStrategy = valueSuppressionStrategy;
+    }
+    
+       /**
+     * Gets the strategy used to manage storage and retrieval of id's.
+     * 
+     * @return Returns the idStoringStrategy, not null
+     */
+    public IdStoringStrategy getIdMappingStrategy() {
+        return idStoringStrategy;
+    }
+
+    /**
+     * Sets the strategy used to manage storage and retrieval of id's.
+     * 
+     * @param idStoringStrategy
+     *            The idStoringStrategy to set, not null
+     */
+    public void setIdMappingStrategy(IdStoringStrategy idMappingStrategy) {
+        this.idStoringStrategy = idMappingStrategy;
     }
 }

Modified: 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/expression/Context.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/expression/Context.java?view=diff&r1=154189&r2=154190
==============================================================================
--- 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/expression/Context.java
 (original)
+++ 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/expression/Context.java
 Thu Feb 17 12:53:49 2005
@@ -19,6 +19,7 @@
 import java.util.Map;
 
 import org.apache.commons.betwixt.BindingConfiguration;
+import org.apache.commons.betwixt.strategy.IdStoringStrategy;
 import org.apache.commons.betwixt.strategy.ObjectStringConverter;
 import org.apache.commons.betwixt.strategy.ValueSuppressionStrategy;
 import org.apache.commons.logging.Log;
@@ -269,4 +270,14 @@
             ValueSuppressionStrategy valueSuppressionStrategy) {
         
bindingConfiguration.setValueSuppressionStrategy(valueSuppressionStrategy);
     }
+    
+    /**
+     * Gets the strategy used to manage storage and retrieval of id's.
+     * 
+     * @return Returns the idStoringStrategy, not null
+     */
+    public IdStoringStrategy getIdMappingStrategy() {
+        return bindingConfiguration.getIdMappingStrategy();
+    }
+    
 }

Modified: 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/AbstractBeanWriter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/AbstractBeanWriter.java?view=diff&r1=154189&r2=154190
==============================================================================
--- 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/AbstractBeanWriter.java
 (original)
+++ 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/AbstractBeanWriter.java
 Thu Feb 17 12:53:49 2005
@@ -19,7 +19,6 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.Iterator;
 
 import org.apache.commons.betwixt.AttributeDescriptor;
@@ -92,8 +91,6 @@
 
     /** Log used for logging (Doh!) */
     private Log log = LogFactory.getLog( AbstractBeanWriter.class );
-    /** Map containing ID attribute values for beans */
-    private HashMap idMap = new HashMap();
     /** Stack containing beans - used to detect cycles */
     private ArrayStack beanStack = new ArrayStack();
     /** Used to generate ID attribute values*/
@@ -345,7 +342,7 @@
                 } else {
                     pushBean ( context.getBean() );
                     if ( getBindingConfiguration().getMapIDs() ) {
-                        ref = (String) idMap.get( context.getBean() );
+                       ref = 
getBindingConfiguration().getIdMappingStrategy().getReferenceFor(context, 
context.getBean());
                     }
                     if ( ref == null ) {
                         // this is the first time that this bean has be written
@@ -353,7 +350,7 @@
                         if (idAttribute == null) {
                             // use a generated id
                             id = idGenerator.nextId();
-                            idMap.put( bean, id );
+                            
getBindingConfiguration().getIdMappingStrategy().setReference(context, bean, 
id);
                             
                             if ( getBindingConfiguration().getMapIDs() ) {
                                 // write element with id
@@ -396,7 +393,7 @@
                                 // convert to string
                                 id = exp.toString();
                             }
-                            idMap.put( bean, id);
+                            
getBindingConfiguration().getIdMappingStrategy().setReference(context, bean, 
id);
                             
                             // the ID attribute should be written automatically
                             writeElement( 

Modified: 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/read/ReadContext.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/read/ReadContext.java?view=diff&r1=154189&r2=154190
==============================================================================
--- 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/read/ReadContext.java
 (original)
+++ 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/io/read/ReadContext.java
 Thu Feb 17 12:53:49 2005
@@ -16,7 +16,6 @@
 package org.apache.commons.betwixt.io.read;
 
 import java.beans.IntrospectionException;
-import java.util.HashMap;
 
 import org.apache.commons.betwixt.AttributeDescriptor;
 import org.apache.commons.betwixt.BindingConfiguration;
@@ -49,9 +48,7 @@
   * @since 0.5
   */
 public class ReadContext extends Context {
-
-       /** Beans indexed by ID strings */
-       private HashMap beansById = new HashMap();
+;
        /** Classloader to be used to load beans during reading */
        private ClassLoader classLoader;
        /** The read specific configuration */
@@ -117,7 +114,6 @@
          */
        public ReadContext(ReadContext readContext) {
                super(readContext);
-               beansById = readContext.beansById;
                classLoader = readContext.classLoader;
                readConfiguration = readContext.readConfiguration;
        }
@@ -129,7 +125,7 @@
         * @param bean the Object to store, not null
         */
        public void putBean(String id, Object bean) {
-               beansById.put(id, bean);
+               getIdMappingStrategy().setReference(this, bean, id);
        }
 
        /**
@@ -139,14 +135,14 @@
         * @return the Object that the ID references, otherwise null
         */
        public Object getBean(String id) {
-               return beansById.get(id);
+               return getIdMappingStrategy().getReferenced(this, id);
        }
 
        /** 
         * Clears the beans indexed by id.
         */
        public void clearBeans() {
-               beansById.clear();
+        getIdMappingStrategy().reset();
        }
 
        /**

Modified: 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/strategy/ActionMappingStrategy.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/strategy/ActionMappingStrategy.java?view=diff&r1=154189&r2=154190
==============================================================================
--- 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/strategy/ActionMappingStrategy.java
 (original)
+++ 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/strategy/ActionMappingStrategy.java
 Thu Feb 17 12:53:49 2005
@@ -19,6 +19,7 @@
 
 import org.apache.commons.betwixt.io.read.MappingAction;
 import org.apache.commons.betwixt.io.read.ReadContext;
+import org.apache.commons.betwixt.strategy.DefaultActionMappingStrategy;
 import org.xml.sax.Attributes;
 
 /**

Added: 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/strategy/DefaultIdStoringStrategy.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/strategy/DefaultIdStoringStrategy.java?view=auto&rev=154190
==============================================================================
--- 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/strategy/DefaultIdStoringStrategy.java
 (added)
+++ 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/strategy/DefaultIdStoringStrategy.java
 Thu Feb 17 12:53:49 2005
@@ -0,0 +1,99 @@
+/*
+ * 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.strategy;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.commons.betwixt.expression.Context;
+
+/**
+ * Stores every ID that given to it into an internal <code>HashMap</code> and
+ * returns it on request.
+ * 
+ * @author <a href="mailto:[EMAIL PROTECTED]">Christian Aust </a>
+ * @since 0.6.1
+ */
+public class DefaultIdStoringStrategy extends IdStoringStrategy {
+    private Map idByBeanMap;
+    private Map beanByIdMap;
+
+    /**
+     * Constructs a [EMAIL PROTECTED] IdStoringStrategy}using a 
<code>HashMap</code> for
+     * storage.
+     */
+    public DefaultIdStoringStrategy() {
+        idByBeanMap = new HashMap();
+        beanByIdMap = new HashMap();
+    }
+
+    /**
+     * Returns a String id for the given bean if it has been stored previously.
+     * Otherwise returns null.
+     * 
+     * @param context
+     *            current context, not null
+     * @param bean
+     *            the instance, not null
+     * @return id as String, or null if not found
+     * @see 
org.apache.commons.betwixt.strategy.IdStoringStrategy#getReferenceFor(org.apache.commons.betwixt.expression.Context,
+     *      java.lang.Object)
+     */
+    public String getReferenceFor(Context context, Object bean) {
+        return (String) idByBeanMap.get(bean);
+    }
+
+    /**
+     * Stores an ID for the given instance and context. It will check first if
+     * this ID has been previously stored and will do nothing in that case.
+     * 
+     * @param context
+     *            current context, not null
+     * @param bean
+     *            current instance, not null
+     * @param id
+     *            the ID to store
+     * @see 
org.apache.commons.betwixt.strategy.IdStoringStrategy#setReference(org.apache.commons.betwixt.expression.Context,
+     *      java.lang.Object, java.lang.String)
+     */
+    public void setReference(Context context, Object bean, String id) {
+        if (!idByBeanMap.containsKey(bean)) {
+            idByBeanMap.put(bean, id);
+            beanByIdMap.put(id, bean);
+        }
+    }
+    
+    /**
+     * Gets an object matching the given reference.
+     * @param context <code>Context</code>, not null
+     * @param id the reference id
+     * @return an bean matching the given reference, 
+     * or null if there is no bean matching the given reference
+     */
+    public Object getReferenced(Context context, String id) {
+        return beanByIdMap.get(id);
+    }
+
+    /**
+     * Clears all beans.
+     */
+    public void reset() {
+        idByBeanMap.clear();
+        beanByIdMap.clear();
+    }
+    
+    
+}

Added: 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/strategy/IdStoringStrategy.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/strategy/IdStoringStrategy.java?view=auto&rev=154190
==============================================================================
--- 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/strategy/IdStoringStrategy.java
 (added)
+++ 
jakarta/commons/proper/betwixt/trunk/src/java/org/apache/commons/betwixt/strategy/IdStoringStrategy.java
 Thu Feb 17 12:53:49 2005
@@ -0,0 +1,84 @@
+/*
+ * 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.strategy;
+
+import org.apache.commons.betwixt.expression.Context;
+
+/**
+ * Pluggable strategy for id storage management.
+ * It is possible to use this strategy for innovative
+ * active storage storage strategies as well as passive ones.
+ * For example, it is possible to have some beans map to 
+ * references without ever being fully mapped.
+ * 
+ * @author <a href="mailto:[EMAIL PROTECTED]">Christian Aust </a>
+ * @since 0.6.1
+ */
+public abstract class IdStoringStrategy {
+
+    /**
+     * Default storage strategy
+     * 
+     * @see DefaultIdStoringStrategy
+     */
+    public static IdStoringStrategy DEFAULT = new DefaultIdStoringStrategy();
+
+    /**
+     * Retrieves a reference for the given instance.
+     * If a not null value is returned from this method,
+     * then the bean content will not be written.
+     * Use [EMAIL PROTECTED] IDGenerator} strategy to vary the values
+     * written for a bean.
+     * 
+     * @param context
+     *            current context, not null
+     * @param bean
+     *            the instance, not null
+     * @return id as String when this bean has already been reference, 
+     * or null to indicate that this bean is not yet reference
+     */
+    public abstract String getReferenceFor(Context context, Object bean);
+
+    /**
+     * Stores an instance reference for later retrieval.
+     * This method is shared by writing and reading.
+     *  
+     * @param context
+     *            current context, not null
+     * @param bean
+     *            the instance, not null
+     * @param id
+     *            the id to use
+     */
+    public abstract void setReference(Context context, Object bean, String id);
+
+    /**
+     * Gets an object matching the given reference.
+     * @param context <code>Context</code>, not null
+     * @param id the reference id
+     * @return an bean matching the given reference, 
+     * or null if there is no bean matching the given reference
+     */
+    public abstract Object getReferenced(Context context, String id);
+    
+    /**
+     * Reset to the initial state.
+     *
+     */
+    public abstract void reset();
+    
+}

Modified: 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/recursion/TestRecursion.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/recursion/TestRecursion.java?view=diff&r1=154189&r2=154190
==============================================================================
--- 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/recursion/TestRecursion.java
 (original)
+++ 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/recursion/TestRecursion.java
 Thu Feb 17 12:53:49 2005
@@ -12,8 +12,8 @@
  * 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.recursion;
 
 import java.io.StringReader;
@@ -30,57 +30,52 @@
 import org.apache.commons.betwixt.io.BeanWriter;
 import org.apache.commons.betwixt.io.CyclicReferenceException;
 
-
 /**
  * This will test the recursive behaviour of betwixt.
- *
- * @author <a href="mailto:[EMAIL PROTECTED]">Martin van den Bemt</a>
- * @version $Id: TestRecursion.java,v 1.15 2004/06/13 21:32:48 rdonkin Exp $
+ * 
+ * @author <a href="mailto:[EMAIL PROTECTED]">Martin van den Bemt </a>
+ * @version $Id$
  */
-public class TestRecursion extends AbstractTestCase
-{
-    
-
-    
-    public TestRecursion(String testName)
-    {
+public class TestRecursion extends AbstractTestCase {
+
+    public TestRecursion(String testName) {
         super(testName);
     }
-    
-    public static Test suite()
-    {
+
+    public static Test suite() {
         return new TestSuite(TestRecursion.class);
     }
-    
+
     /**
      * This will test reading a simple recursive xml file
-     * 
+     *  
      */
-    public void testReadwithCollectionsInElementRoundTrip()
-    throws Exception
-    {
-        //SimpleLog log = new 
SimpleLog("[testReadwithCollectionsInElementRoundTrip:XMLIntrospectorHelper]");
+    public void testReadwithCollectionsInElementRoundTrip() throws Exception {
+        //SimpleLog log = new
+        // 
SimpleLog("[testReadwithCollectionsInElementRoundTrip:XMLIntrospectorHelper]");
         //log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
         //XMLIntrospectorHelper.setLog(log);
-        
-        //log = new 
SimpleLog("[testReadwithCollectionsInElementRoundTrip:XMLIntrospector]");
+
+        //log = new
+        // 
SimpleLog("[testReadwithCollectionsInElementRoundTrip:XMLIntrospector]");
         //log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
-    
+
         XMLIntrospector intro = createXMLIntrospector();
         //intro.setLog(log);
         intro.getConfiguration().setWrapCollectionsInElement(true);
-        
-        //log = new 
SimpleLog("[testReadwithCollectionsInElementRoundTrip:BeanReader]");
+
+        //log = new
+        // SimpleLog("[testReadwithCollectionsInElementRoundTrip:BeanReader]");
         //log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
-        
+
         BeanReader reader = new BeanReader();
         reader.setXMLIntrospector(intro);
         //reader.setLog(log);
         reader.registerBeanClass(ElementBean.class);
-        
-        ElementBean bean = (ElementBean) reader.parse(
-                    
getTestFileURL("src/test/org/apache/commons/betwixt/recursion/recursion.xml"));
-        
+
+        ElementBean bean = (ElementBean) reader
+                
.parse(getTestFileURL("src/test/org/apache/commons/betwixt/recursion/recursion.xml"));
+
         List elements = bean.getElements();
         assertEquals("Root elements size", 2, elements.size());
         Element elementOne = (Element) elements.get(0);
@@ -91,114 +86,128 @@
         elements = elementOne.getElements();
         assertEquals("Element one children", 2, elements.size());
         Element elementOneOne = (Element) elements.get(0);
-        assertEquals("Element one one name", "element11", 
elementOneOne.getName());
+        assertEquals("Element one one name", "element11", elementOneOne
+                .getName());
         Element elementOneTwo = (Element) elements.get(1);
-        assertEquals("Element one two name", "element12", 
elementOneTwo.getName());
-        assertEquals("Element one two children", 0, 
elementOneTwo.getElements().size());
+        assertEquals("Element one two name", "element12", elementOneTwo
+                .getName());
+        assertEquals("Element one two children", 0, elementOneTwo.getElements()
+                .size());
         elements = elementOneOne.getElements();
         assertEquals("Element one one children", 2, elements.size());
         Element elementOneOneOne = (Element) elements.get(0);
-        assertEquals("Element one one one name", "element111", 
elementOneOneOne.getName());
+        assertEquals("Element one one one name", "element111", elementOneOneOne
+                .getName());
         Element elementOneOneTwo = (Element) elements.get(1);
-        assertEquals("Element one one two name", "element112", 
elementOneOneTwo.getName());        
-        
+        assertEquals("Element one one two name", "element112", elementOneOneTwo
+                .getName());
+
         StringWriter buffer = new StringWriter();
-        write (bean, buffer, true);
-            
+        write(bean, buffer, true);
+
         String xml = "<?xml version='1.0'?><ElementBean><elements><element 
name='element1'>"
-                    + "<elements><element name='element11'><elements><element 
name='element111'>"
-                    + "<elements/></element><element 
name='element112'><elements/></element>"
-                    + "</elements></element><element 
name='element12'><elements/></element>"
-                    + "</elements></element><element 
name='element2'><elements/>"
-                    + "</element></elements></ElementBean>";
-        
-        xmlAssertIsomorphic(   
-                    parseString(xml), 
-                    parseString(buffer.getBuffer().toString()), 
-                    true);
+                + "<elements><element name='element11'><elements><element 
name='element111'>"
+                + "<elements/></element><element 
name='element112'><elements/></element>"
+                + "</elements></element><element 
name='element12'><elements/></element>"
+                + "</elements></element><element name='element2'><elements/>"
+                + "</element></elements></ElementBean>";
+
+        xmlAssertIsomorphic(parseString(xml), parseString(buffer.getBuffer()
+                .toString()), true);
     }
+
     /**
      * This will test reading a simple recursive xml file
      */
-    public void testReadWithoutCollectionsInElementRoundTrip()
-    throws Exception
-    {
-//        SimpleLog log = new 
SimpleLog("[testReadWithoutCollectionsInElementRoundTrip:BeanRuleSet]");
-//        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
-//        BeanRuleSet.setLog(log);
-        
-//     log = new 
SimpleLog("[testReadWithoutCollectionsInElementRoundTrip:XMLIntrospector]");
-//        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
- 
+    public void testReadWithoutCollectionsInElementRoundTrip() throws 
Exception {
+        //        SimpleLog log = new
+        // 
SimpleLog("[testReadWithoutCollectionsInElementRoundTrip:BeanRuleSet]");
+        //        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
+        //        BeanRuleSet.setLog(log);
+
+        //     log = new
+        // 
SimpleLog("[testReadWithoutCollectionsInElementRoundTrip:XMLIntrospector]");
+        //        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
+
         XMLIntrospector intro = createXMLIntrospector();
         intro.getConfiguration().setWrapCollectionsInElement(false);
-//        intro.setLog(log);
-//        log = new 
SimpleLog("[testReadWithoutCollectionsInElementRoundTrip:XMLIntrospectorHelper]");
-//        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
-//        XMLIntrospectorHelper.setLog(log);
+        //        intro.setLog(log);
+        //        log = new
+        // 
SimpleLog("[testReadWithoutCollectionsInElementRoundTrip:XMLIntrospectorHelper]");
+        //        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
+        //        XMLIntrospectorHelper.setLog(log);
         BeanReader reader = new BeanReader();
-//        log = new 
SimpleLog("[testReadWithoutCollectionsInElementRoundTrip:BeanReader]");
-//        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
-//        reader.setLog(log);
+        //        log = new
+        // 
SimpleLog("[testReadWithoutCollectionsInElementRoundTrip:BeanReader]");
+        //        log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
+        //        reader.setLog(log);
         reader.setXMLIntrospector(intro);
         reader.registerBeanClass(ElementBean.class);
-        ElementBean bean = (ElementBean) reader.
-                        
parse(getTestFileURL("src/test/org/apache/commons/betwixt/recursion/recursion2.xml"));
+        ElementBean bean = (ElementBean) reader
+                
.parse(getTestFileURL("src/test/org/apache/commons/betwixt/recursion/recursion2.xml"));
         List elements = bean.getElements();
         assertEquals("Number of elements in root bean", 2, elements.size());
         Element elementOne = (Element) bean.elements.get(0);
         assertEquals("First element name", "element1", elementOne.getName());
         Element elementTwo = (Element) bean.elements.get(1);
         assertEquals("Second element name", "element2", elementTwo.getName());
-        
+
         elements = elementOne.getElements();
-        assertEquals("Number of child elements in first element", 2, 
elements.size());
+        assertEquals("Number of child elements in first element", 2, elements
+                .size());
         Element elementOneOne = (Element) elements.get(0);
         assertEquals("11 element name", "element11", elementOneOne.getName());
         Element elementOneTwo = (Element) elements.get(1);
         assertEquals("12 element name", "element12", elementOneTwo.getName());
-        
+
         elements = elementOneOne.getElements();
-        assertEquals("Number of child elements in element 11", 2, 
elements.size());
+        assertEquals("Number of child elements in element 11", 2, elements
+                .size());
         Element elementOneOneOne = (Element) elements.get(0);
-        assertEquals("111 element name", "element111", 
elementOneOneOne.getName());
+        assertEquals("111 element name", "element111", elementOneOneOne
+                .getName());
+
+        assertEquals("111 child elements ", 0, elementOneOneOne.getElements()
+                .size());
 
-        assertEquals("111 child elements ", 0, 
elementOneOneOne.getElements().size());
-        
         Element elementOneOneTwo = (Element) elements.get(1);
-        assertEquals("112 element name", "element112", 
elementOneOneTwo.getName());
-        assertEquals("112 child elements ", 0, 
elementOneOneTwo.getElements().size());
-        
+        assertEquals("112 element name", "element112", elementOneOneTwo
+                .getName());
+        assertEquals("112 child elements ", 0, elementOneOneTwo.getElements()
+                .size());
+
         elements = elementOneTwo.getElements();
-        assertEquals("Number of child elements in element 12", 0, 
elements.size());
-        
+        assertEquals("Number of child elements in element 12", 0, elements
+                .size());
+
         elements = elementTwo.getElements();
-        assertEquals("Number of child elements in element 2", 0, 
elements.size());
-        
+        assertEquals("Number of child elements in element 2", 0, elements
+                .size());
+
         StringWriter buffer = new StringWriter();
         buffer.write("<?xml version='1.0'?>");
-        write (bean, buffer, false);
- 
+        write(bean, buffer, false);
+
         String xml = "<ElementBean><element name='element1'><element 
name='element11'><element name='element111' />"
                 + "<element name='element112' /> </element><element 
name='element12' /> </element>"
                 + "<element name='element2' /> </ElementBean>";
-        
-        xmlAssertIsomorphic(parseString(xml), 
parseString(buffer.getBuffer().toString()), true);
-        
+
+        xmlAssertIsomorphic(parseString(xml), parseString(buffer.getBuffer()
+                .toString()), true);
+
     }
-    
+
     /**
-     * Opens a writer and writes an object model according to the
-     * retrieved bean
+     * Opens a writer and writes an object model according to the retrieved 
bean
      */
     private void write(Object bean, Writer out, boolean wrapIt)
-    throws Exception
-    {
+            throws Exception {
         BeanWriter writer = new BeanWriter(out);
-        writer.setWriteEmptyElements( true );
+        writer.setWriteEmptyElements(true);
         writer.setXMLIntrospector(createXMLIntrospector());
         // specifies weather to use collection elements or not.
-        
writer.getXMLIntrospector().getConfiguration().setWrapCollectionsInElement(wrapIt);
+        writer.getXMLIntrospector().getConfiguration()
+                .setWrapCollectionsInElement(wrapIt);
         // we don't want to write Id attributes to every element
         // we just want our opbject model written nothing more..
         writer.getBindingConfiguration().setMapIDs(false);
@@ -207,6 +216,7 @@
         writer.setEndOfLine("\n");
         writer.write(bean);
     }
+
     /**
      * Set up the XMLIntroSpector
      */
@@ -216,160 +226,153 @@
         // set elements for attributes to true
         introspector.getConfiguration().setAttributesForPrimitives(true);
         introspector.getConfiguration().setWrapCollectionsInElement(false);
-        
+
         return introspector;
     }
-    
 
     /**
      */
-    public void testBeanWithIdProperty() throws Exception
-    {
+    public void testBeanWithIdProperty() throws Exception {
         IdBean bean = new IdBean("Hello, World");
         bean.setNotId("Not ID");
         StringWriter out = new StringWriter();
         out.write("<?xml version='1.0'?>");
         BeanWriter writer = new BeanWriter(out);
-        writer.setWriteEmptyElements( true );
-        
writer.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(true);
+        writer.setWriteEmptyElements(true);
+        writer.getXMLIntrospector().getConfiguration()
+                .setAttributesForPrimitives(true);
         writer.getBindingConfiguration().setMapIDs(true);
         writer.write(bean);
-        
+
         String xml = "<?xml version='1.0'?><IdBean notId='Not ID' id='Hello, 
World'/>";
-        
-        xmlAssertIsomorphic(parseString(xml), 
parseString(out.getBuffer().toString()), true);
-    }    
-    
+
+        xmlAssertIsomorphic(parseString(xml), parseString(out.getBuffer()
+                .toString()), true);
+    }
+
     /**
-     * Check that a cyclic reference exception is not thrown in this case 
+     * Check that a cyclic reference exception is not thrown in this case
      */
-    public void testCyclicReferenceStack1() throws Exception
-    {
+    public void testCyclicReferenceStack1() throws Exception {
         Element alpha = new Element("Alpha");
         Element beta = new Element("Beta");
         Element gamma = new Element("Gamma");
         Element epsilon = new Element("Epsilon");
-        
+
         alpha.addElement(beta);
         beta.addElement(gamma);
         gamma.addElement(epsilon);
         alpha.addElement(epsilon);
-        
+
         StringWriter stringWriter = new StringWriter();
         BeanWriter writer = new BeanWriter(stringWriter);
-        writer.setWriteEmptyElements( true );
+        writer.setWriteEmptyElements(true);
         writer.getBindingConfiguration().setMapIDs(false);
         writer.write(alpha);
 
         String xml = "<?xml 
version='1.0'?><Element><name>Alpha</name><elements><element>"
-                    + 
"<name>Beta</name><elements><element><name>Gamma</name><elements>"
-                    + 
"<element><name>Epsilon</name><elements/></element></elements>"
-                    + 
"</element></elements></element><element><name>Epsilon</name>"
-                    + "<elements/></element></elements></Element>";
-        
-        xmlAssertIsomorphic(parseString(xml), 
parseString(stringWriter.getBuffer().toString()), true);
-    }    
+                + 
"<name>Beta</name><elements><element><name>Gamma</name><elements>"
+                + 
"<element><name>Epsilon</name><elements/></element></elements>"
+                + 
"</element></elements></element><element><name>Epsilon</name>"
+                + "<elements/></element></elements></Element>";
+
+        xmlAssertIsomorphic(parseString(xml), parseString(stringWriter
+                .getBuffer().toString()), true);
+    }
 
     /**
      * This should throw a cyclic reference
      */
-    public void testCyclicReferenceStack2() throws Exception
-    {
+    public void testCyclicReferenceStack2() throws Exception {
         Element alpha = new Element("Alpha");
         Element beta = new Element("Beta");
         Element gamma = new Element("Gamma");
         Element epsilon = new Element("Epsilon");
-        
+
         alpha.addElement(beta);
         beta.addElement(gamma);
         gamma.addElement(epsilon);
         epsilon.addElement(beta);
-        
+
         StringWriter stringWriter = new StringWriter();
         BeanWriter writer = new BeanWriter(stringWriter);
-        writer.setWriteEmptyElements( true );
+        writer.setWriteEmptyElements(true);
         writer.getBindingConfiguration().setMapIDs(false);
-        
-        //SimpleLog log = new 
SimpleLog("[testCyclicReferenceStack2:BeanWriter]");
+
+        //SimpleLog log = new
+        // SimpleLog("[testCyclicReferenceStack2:BeanWriter]");
         //log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
         //writer.setLog(log);
-        
+
         //log = new SimpleLog("[testCyclicReferenceStack2:BeanWriter]");
         //log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
         //writer.setAbstractBeanWriterLog(log);
-        
+
         try {
             writer.write(alpha);
             fail("Cycle was not detected!");
-            
+
         } catch (CyclicReferenceException e) {
             // that's what we expected!
         }
-    }  
-    
-    
-       /** Tests for a stack overflow bug */
-       public void testRegisterOverflow() throws Exception {
-               BeanReader reader = new BeanReader();
-               try
-               {
-                       reader.registerBeanClass(NorthWind.class);
-               }
-               catch (StackOverflowError e)
-               {
-                       e.printStackTrace();
-                       fail("Expected registration to succeed");
-               }
-       }
-    
-       public void testRegisterOverflow2() throws Exception {
-               BeanReader beanReader = new BeanReader();
-               try
-               {
-                       beanReader.registerBeanClass(PersonTest.class);
-               }
-               catch (StackOverflowError e)
-               {
-                       e.printStackTrace();
-                       fail("Expected registration to succeed");
-               }
-       }
-       
-       public void  testCycleReferences() throws Exception {
-         PersonTest person = new PersonTest();
-         person.setName("John Doe");
-         AddressTest address = new AddressTest();
-         address.setStreetAddress("1221 Washington Street");
-         person.setAddress(address);
-         ReferenceTest reference = new ReferenceTest();
-         reference.setPerson(person);
-         address.setReference(reference);
-       
-         StringWriter outputWriter = new StringWriter();
-       
-         outputWriter.write("<?xml version='1.0' ?>\n");
-         BeanWriter beanWriter = new BeanWriter(outputWriter);
-         beanWriter.enablePrettyPrint();
-         beanWriter.getBindingConfiguration().setMapIDs(true);
-         beanWriter.write(person);   
-       
-         BeanReader beanReader = new BeanReader();
-         beanReader.getBindingConfiguration().setMapIDs(true);
-       
-         // Configure the reader
-         beanReader.registerBeanClass(PersonTest.class);
-         beanReader.registerBeanClass(AddressTest.class);
-         beanReader.registerBeanClass(ReferenceTest.class);
-       
-         String out = outputWriter.toString();
-         StringReader xmlReader = new StringReader(out);
-       
-         //Parse the xml
-         PersonTest result = (PersonTest)beanReader.parse(xmlReader);
-         assertSame("Cycle did not result in the same reference", result, 
result.getAddress().getReference().getPerson());
-       
-         }
-       
+    }
+
+    /** Tests for a stack overflow bug */
+    public void testRegisterOverflow() throws Exception {
+        BeanReader reader = new BeanReader();
+        try {
+            reader.registerBeanClass(NorthWind.class);
+        } catch (StackOverflowError e) {
+            e.printStackTrace();
+            fail("Expected registration to succeed");
+        }
+    }
+
+    public void testRegisterOverflow2() throws Exception {
+        BeanReader beanReader = new BeanReader();
+        try {
+            beanReader.registerBeanClass(PersonTest.class);
+        } catch (StackOverflowError e) {
+            e.printStackTrace();
+            fail("Expected registration to succeed");
+        }
+    }
+
+    public void testCycleReferences() throws Exception {
+        PersonTest person = new PersonTest();
+        person.setName("John Doe");
+        AddressTest address = new AddressTest();
+        address.setStreetAddress("1221 Washington Street");
+        person.setAddress(address);
+        ReferenceTest reference = new ReferenceTest();
+        reference.setPerson(person);
+        address.setReference(reference);
+
+        StringWriter outputWriter = new StringWriter();
+
+        outputWriter.write("<?xml version='1.0' ?>\n");
+        BeanWriter beanWriter = new BeanWriter(outputWriter);
+        beanWriter.enablePrettyPrint();
+        beanWriter.getBindingConfiguration().setMapIDs(true);
+        beanWriter.write(person);
+
+        BeanReader beanReader = new BeanReader();
+        beanReader.getBindingConfiguration().setMapIDs(true);
+
+        // Configure the reader
+        beanReader.registerBeanClass(PersonTest.class);
+        beanReader.registerBeanClass(AddressTest.class);
+        beanReader.registerBeanClass(ReferenceTest.class);
+
+        String out = outputWriter.toString();
+        StringReader xmlReader = new StringReader(out);
+
+        //Parse the xml
+        PersonTest result = (PersonTest) beanReader.parse(xmlReader);
+        assertSame("Cycle did not result in the same reference", result, result
+                .getAddress().getReference().getPerson());
+
+    }
 
 }
 

Added: 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/strategy/ElementsList.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/strategy/ElementsList.java?view=auto&rev=154190
==============================================================================
--- 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/strategy/ElementsList.java
 (added)
+++ 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/strategy/ElementsList.java
 Thu Feb 17 12:53:49 2005
@@ -0,0 +1,37 @@
+/*
+ * 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.strategy;
+
+import java.util.*;
+
+/**
+ */
+public class ElementsList {
+    private List elements = new ArrayList();
+    
+    public Iterator getElements() {
+        return elements.iterator();
+    }
+    
+    public void addElement(Element element) {
+        elements.add(element);
+    }
+    
+    public Element get(int index)
+    {
+        return (Element) elements.get(index);
+    }
+}

Added: 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/strategy/TestIdStorageStrategy.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/strategy/TestIdStorageStrategy.java?view=auto&rev=154190
==============================================================================
--- 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/strategy/TestIdStorageStrategy.java
 (added)
+++ 
jakarta/commons/proper/betwixt/trunk/src/test/org/apache/commons/betwixt/strategy/TestIdStorageStrategy.java
 Thu Feb 17 12:53:49 2005
@@ -0,0 +1,126 @@
+/*
+ * 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.strategy;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.Iterator;
+
+import org.apache.commons.betwixt.AbstractTestCase;
+import org.apache.commons.betwixt.expression.Context;
+import org.apache.commons.betwixt.io.BeanReader;
+import org.apache.commons.betwixt.io.BeanWriter;
+
+/**
+ */
+public class TestIdStorageStrategy extends AbstractTestCase {
+
+    public TestIdStorageStrategy(String testName) {
+        super(testName);   
+    }
+
+    public void testWrite() throws Exception {
+        
+        final Element alpha = new Element("ONE");
+        Element beta = new Element("TWO");
+        ElementsList elements = new ElementsList();
+        elements.addElement(alpha);
+        elements.addElement(beta);
+        
+        IdStoringStrategy storingStrategy = new DefaultIdStoringStrategy() {
+
+            public String getReferenceFor(Context context, Object bean) {
+                String result = null;
+                if (bean == alpha) {
+                    result = "ALPHA";
+                }
+                else
+                {
+                    result = super.getReferenceFor(context, bean);
+                }
+                return result;
+            }
+
+            public void setReference(Context context, Object bean, String id) {
+                if (bean != alpha) {
+                     super.setReference(context, bean, id);
+                }
+            }            
+        };
+        
+        StringWriter out = new StringWriter();
+        out.write("<?xml version='1.0'?>");
+        BeanWriter writer = new BeanWriter(out);
+        writer.getBindingConfiguration().setIdMappingStrategy(storingStrategy);
+        writer.write(elements);
+        
+        String expected = "<?xml version='1.0'?>" +
+                "<ElementsList id='1'>" +
+                "   <elements>" +
+                "       <element idref='ALPHA'/>" +
+                "       <element id='2'>" +
+                "           <value>TWO</value>" +
+                "       </element>" +
+                "   </elements>" +
+                "</ElementsList>";
+
+        xmlAssertIsomorphicContent(parseString(expected), parseString(out));
+    }
+    
+    public void testRead() throws Exception {
+        
+        String xml = "<?xml version='1.0'?>" +
+        "<ElementsList id='1'>" +
+        "   <elements>" +
+        "       <element idref='ALPHA'/>" +
+        "       <element id='2'>" +
+        "           <value>TWO</value>" +
+        "       </element>" +
+        "   </elements>" +
+        "</ElementsList>";
+        
+        final Element alpha = new Element("ONE");
+        
+        IdStoringStrategy storingStrategy = new DefaultIdStoringStrategy() {
+
+            public void setReference(Context context, Object bean, String id) {
+                if (bean != alpha) {
+                     super.setReference(context, bean, id);
+                }
+            }     
+            
+            public Object getReferenced(Context context, String id) {
+                if ("ALPHA".equals(id)) {
+                    return alpha;
+                }
+                return getReferenced(context, id);
+            }
+            
+        };
+        
+        BeanReader reader = new BeanReader();
+        reader.getBindingConfiguration().setIdMappingStrategy(storingStrategy);
+        reader.registerBeanClass(ElementsList.class);
+        ElementsList elements = (ElementsList) reader.parse(new 
StringReader(xml));
+        assertNotNull(elements);
+        Element one = elements.get(0);
+        assertTrue(one == alpha);
+        Element two = elements.get(1);
+        assertNotNull(two);
+    }
+    
+    
+}



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

Reply via email to