You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by gn...@apache.org on 2006/04/28 17:51:57 UTC

svn commit: r397934 - in /geronimo/xbean/trunk/xbean-spring/src: main/java/org/apache/xbean/spring/context/impl/ main/java/org/apache/xbean/spring/generator/ test/java/org/apache/xbean/spring/context/ test/java/org/apache/xbean/spring/example/ test/jav...

Author: gnodet
Date: Fri Apr 28 08:51:55 2006
New Revision: 397934

URL: http://svn.apache.org/viewcvs?rev=397934&view=rev
Log:
XBEAN-8: Support flat collections
XBEAN-9: Support flat properties

Added:
    geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/context/RecipeUsingSpringTest.java
    geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/context/RecipeUsingXBeanTest.java
    geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/example/Recipe.java
    geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/example/RecipeService.java
    geronimo/xbean/trunk/xbean-spring/src/test/resources/org/apache/xbean/spring/context/recipe-normal.xml
    geronimo/xbean/trunk/xbean-spring/src/test/resources/org/apache/xbean/spring/context/recipe-xbean.xml
Modified:
    geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/context/impl/MappingMetaData.java
    geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/context/impl/XBeanXmlBeanDefinitionParser.java
    geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/generator/ElementMapping.java
    geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/generator/QdoxMappingLoader.java
    geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/generator/XmlMetadataGenerator.java
    geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/generator/ModelTest.java

Modified: geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/context/impl/MappingMetaData.java
URL: http://svn.apache.org/viewcvs/geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/context/impl/MappingMetaData.java?rev=397934&r1=397933&r2=397934&view=diff
==============================================================================
--- geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/context/impl/MappingMetaData.java (original)
+++ geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/context/impl/MappingMetaData.java Fri Apr 28 08:51:55 2006
@@ -191,4 +191,13 @@
     public String getMapKeyName(String elementName, String property) {
         return properties.getProperty(elementName + "." + property + ".map.keyName");
     }
+
+    public String getFlatCollectionProperty(String elementName, String property)
+    {
+        return properties.getProperty(elementName + "." + property + ".flatCollection");
+    }
+    
+    public boolean isFlatProperty(String elementName, String property)  {
+        return properties.getProperty(elementName + "." + property + ".flat") != null;
+    }
 }

Modified: geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/context/impl/XBeanXmlBeanDefinitionParser.java
URL: http://svn.apache.org/viewcvs/geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/context/impl/XBeanXmlBeanDefinitionParser.java?rev=397934&r1=397933&r2=397934&view=diff
==============================================================================
--- geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/context/impl/XBeanXmlBeanDefinitionParser.java (original)
+++ geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/context/impl/XBeanXmlBeanDefinitionParser.java Fri Apr 28 08:51:55 2006
@@ -37,6 +37,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.springframework.beans.MutablePropertyValues;
+import org.springframework.beans.PropertyValue;
 import org.springframework.beans.factory.BeanDefinitionStoreException;
 import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.beans.factory.config.BeanDefinitionHolder;
@@ -44,6 +45,7 @@
 import org.springframework.beans.factory.support.AbstractBeanDefinition;
 import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
 import org.springframework.beans.factory.support.DefaultListableBeanFactory;
+import org.springframework.beans.factory.support.ManagedList;
 import org.springframework.beans.factory.xml.DefaultXmlBeanDefinitionParser;
 import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
 import org.springframework.context.support.AbstractApplicationContext;
@@ -121,6 +123,39 @@
     /**
      * Parses the non-standard XML element as a Spring bean definition
      */
+    protected BeanDefinitionHolder parseBeanFromExtensionElement(Element element, String parentClass, String property) {
+        String uri = element.getNamespaceURI();
+        String localName = getLocalName(element);
+
+        MappingMetaData metadata = findNamespaceProperties(uri, localName);
+        if (metadata != null) {
+            // lets see if we configured the localName to a bean class
+            String className = getPropertyDescriptor(parentClass, property).getPropertyType().getName();
+            if (className != null) {
+                return parseBeanFromExtensionElement(element, metadata, className);
+            }
+        }
+        return null;
+    }
+
+    private BeanDefinitionHolder parseBeanFromExtensionElement(Element element, MappingMetaData metadata, String className) {
+        Element original = cloneElement(element);
+        // lets assume the class name == the package name plus the
+        element.setAttributeNS(null, "class", className);
+        addSpringAttributeValues(className, element);
+        BeanDefinitionHolder definition = parseBeanDefinitionElement(element, false);
+        addAttributeProperties(definition, metadata, className, original);
+        addContentProperty(definition, metadata, element);
+        addNestedPropertyElements(definition, metadata, className, element);
+        coerceNamespaceAwarePropertyValues(definition, element);
+        declareLifecycleMethods(definition, metadata, element);
+        namedConstructorArgs.processParameters(definition, metadata);
+        return definition;
+    }
+    
+    /**
+     * Parses the non-standard XML element as a Spring bean definition
+     */
     protected BeanDefinitionHolder parseBeanFromExtensionElement(Element element) {
         String uri = element.getNamespaceURI();
         String localName = getLocalName(element);
@@ -130,18 +165,7 @@
             // lets see if we configured the localName to a bean class
             String className = metadata.getClassName(localName);
             if (className != null) {
-                Element original = cloneElement(element);
-                // lets assume the class name == the package name plus the
-                element.setAttributeNS(null, "class", className);
-                addSpringAttributeValues(className, element);
-                BeanDefinitionHolder definition = parseBeanDefinitionElement(element, false);
-                addAttributeProperties(definition, metadata, className, original);
-                addContentProperty(definition, metadata, element);
-                addNestedPropertyElements(definition, metadata, className, element);
-                coerceNamespaceAwarePropertyValues(definition, element);
-                declareLifecycleMethods(definition, metadata, element);
-                namedConstructorArgs.processParameters(definition, metadata);
-                return definition;
+                return parseBeanFromExtensionElement(element, metadata, className);
             } else {
                 throw new BeanDefinitionStoreException("Unrecognized xbean element mapping: " + localName + " in namespace " + uri);
             }
@@ -333,6 +357,7 @@
     protected void addNestedPropertyElements(BeanDefinitionHolder definition, MappingMetaData metadata,
             String className, Element element) {
         NodeList nl = element.getChildNodes();
+
         for (int i = 0; i < nl.getLength(); i++) {
             Node node = nl.item(i);
             if (node instanceof Element) {
@@ -356,12 +381,33 @@
                         value = parseListElement(childElement, propertyName);
                     }
                     else {
-                        propertyName = metadata.getNestedProperty(getLocalName(element), localName);
+                        propertyName = metadata.getFlatCollectionProperty(getLocalName(element), localName);
                         if (propertyName != null) {
-                            // lets find the first child bean that parses fine
-                            value = parseChildExtensionBean(childElement);
+                            Object def = parseBeanFromExtensionElement(childElement);
+                            PropertyValue pv = definition.getBeanDefinition().getPropertyValues().getPropertyValue(propertyName);
+                            if (pv != null) {
+                                Collection l = (Collection) pv.getValue();
+                                l.add(def);
+                                continue;
+                            } else {
+                                ManagedList l = new ManagedList();
+                                l.add(def);
+                                value = l;
+                            }
+                        } else {
+                            propertyName = metadata.getNestedProperty(getLocalName(element), localName);
+                            if (propertyName != null) {
+                                // lets find the first child bean that parses fine
+                                value = parseChildExtensionBean(childElement);
+                            }
                         }
                     }
+                    
+                    if (propertyName == null && metadata.isFlatProperty(getLocalName(element), localName)) {
+                       value = parseBeanFromExtensionElement(childElement, className, localName);
+                       propertyName = localName;
+                    }
+                    
                     if (propertyName == null) {
                         value = tryParseNestedPropertyViaIntrospection(metadata, className, childElement);
                         propertyName = localName;

Modified: geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/generator/ElementMapping.java
URL: http://svn.apache.org/viewcvs/geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/generator/ElementMapping.java?rev=397934&r1=397933&r2=397934&view=diff
==============================================================================
--- geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/generator/ElementMapping.java (original)
+++ geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/generator/ElementMapping.java Fri Apr 28 08:51:55 2006
@@ -42,9 +42,13 @@
     private final Set attributes;
     private final Map attributesByName;
     private final List constructors;
+    private final List flatProperties;
     private final Map maps;
+    private final Map flatCollections;
     
-    public ElementMapping(String namespace, String elementName, String className, String description, boolean rootElement, String initMethod, String destroyMethod, String factoryMethod, String contentProperty, Set attributes, List constructors, Map maps) {
+    public ElementMapping(String namespace, String elementName, String className, String description, 
+            boolean rootElement, String initMethod, String destroyMethod, String factoryMethod, 
+            String contentProperty, Set attributes, List constructors, List flatProperties, Map maps, Map flatCollections) {
         if (namespace == null) throw new NullPointerException("namespace");
         if (elementName == null) throw new NullPointerException("elementName");
         if (className == null) throw new NullPointerException("className");
@@ -63,6 +67,8 @@
         this.constructors = constructors;
         this.attributes = Collections.unmodifiableSet(new TreeSet(attributes));
         this.maps = Collections.unmodifiableMap(maps);
+        this.flatProperties = Collections.unmodifiableList(flatProperties);
+        this.flatCollections = Collections.unmodifiableMap(flatCollections);
         
         Map attributesByName = new HashMap();
         for (Iterator iterator = attributes.iterator(); iterator.hasNext();) {
@@ -124,6 +130,14 @@
         return (MapMapping) maps.get(name);
     }
     
+    public Map getFlatCollections() {
+        return flatCollections;
+    }
+
+    public List getFlatProperties() {
+        return flatProperties;
+    }
+
     public List getConstructors() {
         return constructors;
     }

Modified: geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/generator/QdoxMappingLoader.java
URL: http://svn.apache.org/viewcvs/geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/generator/QdoxMappingLoader.java?rev=397934&r1=397933&r2=397934&view=diff
==============================================================================
--- geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/generator/QdoxMappingLoader.java (original)
+++ geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/generator/QdoxMappingLoader.java Fri Apr 28 08:51:55 2006
@@ -16,17 +16,6 @@
  */
 package org.apache.xbean.spring.generator;
 
-import com.thoughtworks.qdox.JavaDocBuilder;
-import com.thoughtworks.qdox.model.BeanProperty;
-import com.thoughtworks.qdox.model.DocletTag;
-import com.thoughtworks.qdox.model.JavaClass;
-import com.thoughtworks.qdox.model.JavaMethod;
-import com.thoughtworks.qdox.model.JavaParameter;
-import com.thoughtworks.qdox.model.JavaSource;
-import com.thoughtworks.qdox.model.Type;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -39,6 +28,18 @@
 import java.util.Set;
 import java.util.TreeSet;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import com.thoughtworks.qdox.JavaDocBuilder;
+import com.thoughtworks.qdox.model.BeanProperty;
+import com.thoughtworks.qdox.model.DocletTag;
+import com.thoughtworks.qdox.model.JavaClass;
+import com.thoughtworks.qdox.model.JavaMethod;
+import com.thoughtworks.qdox.model.JavaParameter;
+import com.thoughtworks.qdox.model.JavaSource;
+import com.thoughtworks.qdox.model.Type;
+
 /**
  * @author Dain Sundstrom
  * @version $Id$
@@ -51,6 +52,9 @@
     public static final String DESTROY_METHOD_ANNOTATION = "org.apache.xbean.DestroyMethod";
     public static final String FACTORY_METHOD_ANNOTATION = "org.apache.xbean.FactoryMethod";
     public static final String MAP_ANNOTATION = "org.apache.xbean.Map";
+    public static final String FLAT_PROPERTY_ANNOTATION = "org.apache.xbean.Flat";
+    public static final String FLAT_COLLECTION_ANNOTATION = "org.apache.xbean.FlatCollection";
+    public static final String ELEMENT_ANNOTATION = "org.apache.xbean.Element";
     
     private static final Log log = LogFactory.getLog(QdoxMappingLoader.class);
     private final String defaultNamespace;
@@ -162,6 +166,8 @@
         String contentProperty = getProperty(xbeanTag, "contentProperty");
 
         Map mapsByPropertyName = new HashMap();
+        List flatProperties = new ArrayList();
+        Map flatCollections = new HashMap();
         Set attributes = new HashSet();
         Map attributesByPropertyName = new HashMap();
         BeanProperty[] beanProperties = javaClass.getBeanProperties();
@@ -183,6 +189,19 @@
                                 mapTag.getNamedParameter("keyName"));
                         mapsByPropertyName.put(beanProperty.getName(), mm);
                     }
+                    
+                    DocletTag flatColTag = acc.getTagByName(FLAT_COLLECTION_ANNOTATION);
+                    if (flatColTag != null) {
+                        String childName = flatColTag.getNamedParameter("childElement");
+                        if (childName == null)
+                            throw new InvalidModelException("Flat collections must specify the childElement attribute.");
+                        flatCollections.put(beanProperty.getName(), childName);
+                    }
+                    
+                    DocletTag flatPropTag = acc.getTagByName(FLAT_PROPERTY_ANNOTATION);
+                    if (flatPropTag != null) {
+                        flatProperties.add(beanProperty.getName());
+                    }
                 }
             }
         }
@@ -246,7 +265,9 @@
                 contentProperty,
                 attributes,
                 constructorArgs,
-                mapsByPropertyName);
+                flatProperties,
+                mapsByPropertyName,
+                flatCollections);
     }
 
     private String getElementName(JavaClass javaClass, DocletTag tag) {

Modified: geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/generator/XmlMetadataGenerator.java
URL: http://svn.apache.org/viewcvs/geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/generator/XmlMetadataGenerator.java?rev=397934&r1=397933&r2=397934&view=diff
==============================================================================
--- geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/generator/XmlMetadataGenerator.java (original)
+++ geronimo/xbean/trunk/xbean-spring/src/main/java/org/apache/xbean/spring/generator/XmlMetadataGenerator.java Fri Apr 28 08:51:55 2006
@@ -95,12 +95,24 @@
             out.println(element.getElementName() + ".factoryMethod = " + factoryMethod);
         }
         
+        List flatProperties = element.getFlatProperties();
+        for (Iterator itr = flatProperties.iterator(); itr.hasNext();) {
+            out.println(element.getElementName() + "." + itr.next() + ".flat");
+        }
+
         Map maps = element.getMapMappings();
         for (Iterator itr = maps.entrySet().iterator(); itr.hasNext();) {
             Map.Entry entry = (Map.Entry) itr.next();
             MapMapping mm = (MapMapping) entry.getValue();
             out.println(element.getElementName() + "." + entry.getKey() + ".map.entryName = " + mm.getEntryName());
             out.println(element.getElementName() + "." + entry.getKey() + ".map.keyName = " + mm.getKeyName());
+        }
+        
+        Map flatCollections = element.getFlatCollections();
+        for (Iterator itr = flatCollections.entrySet().iterator(); itr.hasNext();) {
+            Map.Entry entry = (Map.Entry) itr.next();
+            String child = (String) entry.getValue();
+            out.println(element.getElementName() + "." + child + ".flatCollection = " + entry.getKey());
         }
     }
 

Added: geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/context/RecipeUsingSpringTest.java
URL: http://svn.apache.org/viewcvs/geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/context/RecipeUsingSpringTest.java?rev=397934&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/context/RecipeUsingSpringTest.java (added)
+++ geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/context/RecipeUsingSpringTest.java Fri Apr 28 08:51:55 2006
@@ -0,0 +1,50 @@
+/**
+ * 
+ * Copyright 2005-2006 The Apache Software Foundation or its licensors,  as applicable.
+ * 
+ * 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.xbean.spring.context;
+
+import java.util.List;
+
+import org.apache.xbean.spring.example.Recipe;
+import org.apache.xbean.spring.example.RecipeService;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+
+public class RecipeUsingSpringTest extends SpringTestSupport {
+
+    public void testRecipes() throws Exception {
+        RecipeService svc = (RecipeService) getBean("recipeService");
+
+        List list = svc.getRecipes();
+        assertNotNull(list);
+        assertEquals(2, list.size());
+        Recipe r = (Recipe) list.get(0);
+        assertEquals("Food", r.getIngredients());
+        assertEquals("Mash together", r.getInstructions());
+        
+        r = (Recipe) list.get(1);
+        assertEquals("Food", r.getIngredients());
+        assertEquals("Mash together", r.getInstructions());
+        
+        assertNotNull(svc.getTopRecipe());
+        assertEquals("Food", svc.getTopRecipe().getIngredients());
+    }
+
+    protected AbstractXmlApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext("org/apache/xbean/spring/context/recipe-normal.xml");
+    }
+
+}

Added: geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/context/RecipeUsingXBeanTest.java
URL: http://svn.apache.org/viewcvs/geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/context/RecipeUsingXBeanTest.java?rev=397934&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/context/RecipeUsingXBeanTest.java (added)
+++ geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/context/RecipeUsingXBeanTest.java Fri Apr 28 08:51:55 2006
@@ -0,0 +1,28 @@
+/**
+ * 
+ * Copyright 2005-2006 The Apache Software Foundation or its licensors,  as applicable.
+ * 
+ * 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.xbean.spring.context;
+
+import org.springframework.context.support.AbstractXmlApplicationContext;
+
+public class RecipeUsingXBeanTest extends RecipeUsingSpringTest {
+
+    protected AbstractXmlApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext("org/apache/xbean/spring/context/recipe-xbean.xml");
+    }
+
+}

Added: geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/example/Recipe.java
URL: http://svn.apache.org/viewcvs/geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/example/Recipe.java?rev=397934&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/example/Recipe.java (added)
+++ geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/example/Recipe.java Fri Apr 28 08:51:55 2006
@@ -0,0 +1,49 @@
+/**
+ * 
+ * Copyright 2005-2006 The Apache Software Foundation or its licensors,  as applicable.
+ * 
+ * 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.xbean.spring.example;
+
+/**
+ * @org.apache.xbean.XBean element="recipe"
+ * @author Dan Diephouse
+ */
+public class Recipe
+{
+    private String ingredients;
+    private String instructions;
+    
+    public String getInstructions()
+    {
+        return instructions;
+    }
+
+    public void setInstructions(String instructions)
+    {
+        this.instructions = instructions;
+    }
+
+    public String getIngredients()
+    {
+        return ingredients;
+    }
+
+    public void setIngredients(String ingredients)
+    {
+        this.ingredients = ingredients;
+    }
+
+}

Added: geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/example/RecipeService.java
URL: http://svn.apache.org/viewcvs/geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/example/RecipeService.java?rev=397934&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/example/RecipeService.java (added)
+++ geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/example/RecipeService.java Fri Apr 28 08:51:55 2006
@@ -0,0 +1,55 @@
+/**
+ * 
+ * Copyright 2005-2006 The Apache Software Foundation or its licensors,  as applicable.
+ * 
+ * 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.xbean.spring.example;
+
+import java.util.List;
+/**
+ * @org.apache.xbean.XBean element="recipe-service"
+ * @author Dan Diephouse
+ */
+public class RecipeService
+{
+    private List recipes;
+    private Recipe topRecipe;
+    
+    /**
+     * @org.apache.xbean.FlatCollection childElement="recipe"
+     * @return
+     */
+    public List getRecipes()
+    {
+        return recipes;
+    }
+
+    public void setRecipes(List recipes)
+    {
+        this.recipes = recipes;
+    }
+
+    /**
+     * @org.apache.xbean.Flat
+     * @return
+     */
+    public Recipe getTopRecipe() {
+        return topRecipe;
+    }
+
+    public void setTopRecipe(Recipe topRecipe) {
+        this.topRecipe = topRecipe;
+    }
+}

Modified: geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/generator/ModelTest.java
URL: http://svn.apache.org/viewcvs/geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/generator/ModelTest.java?rev=397934&r1=397933&r2=397934&view=diff
==============================================================================
--- geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/generator/ModelTest.java (original)
+++ geronimo/xbean/trunk/xbean-spring/src/test/java/org/apache/xbean/spring/generator/ModelTest.java Fri Apr 28 08:51:55 2006
@@ -16,15 +16,16 @@
  */
 package org.apache.xbean.spring.generator;
 
-import junit.framework.TestCase;
-
+import java.beans.PropertyEditorManager;
 import java.io.File;
+import java.util.Arrays;
 import java.util.Iterator;
-import java.util.Set;
-import java.util.List;
 import java.util.LinkedList;
-import java.util.Arrays;
-import java.beans.PropertyEditorManager;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import junit.framework.TestCase;
 
 /**
  * @author Dain Sundstrom
@@ -65,6 +66,13 @@
         assertNotNull(beerId);
         AttributeMapping beerName = beer.getAttribute("name");
         assertNotNull(beerName);
+        
+        ElementMapping recipeService = defaultNamespace.getElement("recipe-service");
+        assertNotNull(recipeService);
+        
+        Map flatCollections = recipeService.getFlatCollections();
+        assertNotNull(flatCollections);
+        assertEquals(1, flatCollections.size());
     }
 
     public void testPropertyEditor() {

Added: geronimo/xbean/trunk/xbean-spring/src/test/resources/org/apache/xbean/spring/context/recipe-normal.xml
URL: http://svn.apache.org/viewcvs/geronimo/xbean/trunk/xbean-spring/src/test/resources/org/apache/xbean/spring/context/recipe-normal.xml?rev=397934&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-spring/src/test/resources/org/apache/xbean/spring/context/recipe-normal.xml (added)
+++ geronimo/xbean/trunk/xbean-spring/src/test/resources/org/apache/xbean/spring/context/recipe-normal.xml Fri Apr 28 08:51:55 2006
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+<beans>
+  <bean id="recipeService" class="org.apache.xbean.spring.example.RecipeService">
+    <property name="recipes">
+      <list>
+        <bean class="org.apache.xbean.spring.example.Recipe">
+          <property name="instructions" value="Mash together" />
+          <property name="ingredients" value="Food" />
+        </bean>
+        <bean class="org.apache.xbean.spring.example.Recipe">
+          <property name="instructions" value="Mash together" />
+          <property name="ingredients" value="Food" />
+        </bean>
+      </list>
+    </property>
+    <property name="topRecipe"> 
+      <bean class="org.apache.xbean.spring.example.Recipe">
+        <property name="instructions" value="Mash together" />
+        <property name="ingredients" value="Food" />
+      </bean>
+    </property>
+  </bean>
+</beans>

Added: geronimo/xbean/trunk/xbean-spring/src/test/resources/org/apache/xbean/spring/context/recipe-xbean.xml
URL: http://svn.apache.org/viewcvs/geronimo/xbean/trunk/xbean-spring/src/test/resources/org/apache/xbean/spring/context/recipe-xbean.xml?rev=397934&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-spring/src/test/resources/org/apache/xbean/spring/context/recipe-xbean.xml (added)
+++ geronimo/xbean/trunk/xbean-spring/src/test/resources/org/apache/xbean/spring/context/recipe-xbean.xml Fri Apr 28 08:51:55 2006
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns:x="http://xbean.apache.org/schemas/pizza" xmlns:foo="urn:foo">
+
+  <x:recipe-service id="recipeService">
+    <x:topRecipe>
+      <x:instructions>Mash together</x:instructions>
+      <x:ingredients>Food</x:ingredients>
+    </x:topRecipe>
+    <x:recipe>
+      <x:instructions>Mash together</x:instructions>
+      <x:ingredients>Food</x:ingredients>
+    </x:recipe>
+    <x:recipe>
+      <x:instructions>Mash together</x:instructions>
+      <x:ingredients>Food</x:ingredients>
+    </x:recipe>
+  </x:recipe-service>
+
+</beans>