You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ch...@apache.org on 2006/08/07 15:25:08 UTC

svn commit: r429336 - in /geronimo/xbean/trunk: xbean-spring-common/src/main/java/org/apache/xbean/spring/context/impl/ xbean-spring-common/src/main/java/org/apache/xbean/spring/generator/ xbean-spring-v1/src/main/java/org/apache/xbean/spring/context/v...

Author: chirino
Date: Mon Aug  7 06:25:07 2006
New Revision: 429336

URL: http://svn.apache.org/viewvc?rev=429336&view=rev
Log:
http://issues.apache.org/jira/browse/XBEAN-36

Added:
    geronimo/xbean/trunk/xbean-spring-v1/src/test/java/org/apache/xbean/spring/context/KegXBeanTest.java
    geronimo/xbean/trunk/xbean-spring-v1/src/test/java/org/apache/xbean/spring/example/KegService.java
    geronimo/xbean/trunk/xbean-spring-v1/src/test/java/org/apache/xbean/spring/example/MilliLittersPropertyEditor.java
    geronimo/xbean/trunk/xbean-spring-v1/src/test/resources/org/apache/xbean/spring/context/keg-xbean.xml
    geronimo/xbean/trunk/xbean-spring-v2/src/test/java/org/apache/xbean/spring/context/KegXBeanTest.java
    geronimo/xbean/trunk/xbean-spring-v2/src/test/java/org/apache/xbean/spring/example/KegService.java
    geronimo/xbean/trunk/xbean-spring-v2/src/test/java/org/apache/xbean/spring/example/MilliLittersPropertyEditor.java
    geronimo/xbean/trunk/xbean-spring-v2/src/test/resources/org/apache/xbean/spring/context/keg-xbean.xml
Modified:
    geronimo/xbean/trunk/xbean-spring-common/src/main/java/org/apache/xbean/spring/context/impl/MappingMetaData.java
    geronimo/xbean/trunk/xbean-spring-common/src/main/java/org/apache/xbean/spring/generator/AttributeMapping.java
    geronimo/xbean/trunk/xbean-spring-common/src/main/java/org/apache/xbean/spring/generator/QdoxMappingLoader.java
    geronimo/xbean/trunk/xbean-spring-common/src/main/java/org/apache/xbean/spring/generator/XmlMetadataGenerator.java
    geronimo/xbean/trunk/xbean-spring-v1/src/main/java/org/apache/xbean/spring/context/v1/XBeanXmlBeanDefinitionParser.java
    geronimo/xbean/trunk/xbean-spring-v2/src/main/java/org/apache/xbean/spring/context/v2/XBeanNamespaceHandler.java

Modified: geronimo/xbean/trunk/xbean-spring-common/src/main/java/org/apache/xbean/spring/context/impl/MappingMetaData.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-spring-common/src/main/java/org/apache/xbean/spring/context/impl/MappingMetaData.java?rev=429336&r1=429335&r2=429336&view=diff
==============================================================================
--- geronimo/xbean/trunk/xbean-spring-common/src/main/java/org/apache/xbean/spring/context/impl/MappingMetaData.java (original)
+++ geronimo/xbean/trunk/xbean-spring-common/src/main/java/org/apache/xbean/spring/context/impl/MappingMetaData.java Mon Aug  7 06:25:07 2006
@@ -200,4 +200,10 @@
     public boolean isFlatProperty(String elementName, String property)  {
         return properties.getProperty(elementName + "." + property + ".flat") != null;
     }
+    
+    public String getPropertyEditor(String elementName, String property)
+    {
+        return properties.getProperty(elementName + "." + property + ".propertyEditor");
+    }
+
 }

Modified: geronimo/xbean/trunk/xbean-spring-common/src/main/java/org/apache/xbean/spring/generator/AttributeMapping.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-spring-common/src/main/java/org/apache/xbean/spring/generator/AttributeMapping.java?rev=429336&r1=429335&r2=429336&view=diff
==============================================================================
--- geronimo/xbean/trunk/xbean-spring-common/src/main/java/org/apache/xbean/spring/generator/AttributeMapping.java (original)
+++ geronimo/xbean/trunk/xbean-spring-common/src/main/java/org/apache/xbean/spring/generator/AttributeMapping.java Mon Aug  7 06:25:07 2006
@@ -29,9 +29,11 @@
     private final String value;
     private final boolean fixed;
     private final boolean required;
+	private final String propertyEditor;
 
-    public AttributeMapping(String attributeName, String propertyName, String description, Type type, String value, boolean fixed, boolean required) {
-        if (attributeName == null) throw new NullPointerException("attributeName");
+    public AttributeMapping(String attributeName, String propertyName, String description, Type type, String value, boolean fixed, boolean required, String propertyEditor) {
+        this.propertyEditor = propertyEditor;
+		if (attributeName == null) throw new NullPointerException("attributeName");
         if (propertyName == null) throw new NullPointerException("propertyName");
         if (type == null) throw new NullPointerException("type");
         this.attributeName = attributeName;
@@ -86,4 +88,8 @@
     public int compareTo(Object obj) {
         return attributeName.compareTo(((AttributeMapping) obj).attributeName);
     }
+
+	public String getPropertyEditor() {
+		return propertyEditor;
+	}
 }

Modified: geronimo/xbean/trunk/xbean-spring-common/src/main/java/org/apache/xbean/spring/generator/QdoxMappingLoader.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-spring-common/src/main/java/org/apache/xbean/spring/generator/QdoxMappingLoader.java?rev=429336&r1=429335&r2=429336&view=diff
==============================================================================
--- geronimo/xbean/trunk/xbean-spring-common/src/main/java/org/apache/xbean/spring/generator/QdoxMappingLoader.java (original)
+++ geronimo/xbean/trunk/xbean-spring-common/src/main/java/org/apache/xbean/spring/generator/QdoxMappingLoader.java Mon Aug  7 06:25:07 2006
@@ -306,6 +306,7 @@
         boolean fixed = getBooleanProperty(propertyTag, "fixed");
         boolean required = getBooleanProperty(propertyTag, "required");
         String nestedType = getProperty(propertyTag, "nestedType");
+        String propertyEditor = getProperty(propertyTag, "propertyEditor");
 
         return new AttributeMapping(attribute,
                 beanProperty.getName(),
@@ -313,7 +314,8 @@
                 toMappingType(beanProperty.getType(), nestedType),
                 defaultValue,
                 fixed,
-                required);
+                required,
+                propertyEditor);
     }
 
     private static DocletTag getPropertyTag(BeanProperty beanProperty) {
@@ -383,7 +385,8 @@
                 toMappingType(parameter.getType(), null),
                 null,
                 false,
-                false);
+                false,
+                null);
     }
 
     private String getParameterDescription(JavaParameter parameter) {

Modified: geronimo/xbean/trunk/xbean-spring-common/src/main/java/org/apache/xbean/spring/generator/XmlMetadataGenerator.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-spring-common/src/main/java/org/apache/xbean/spring/generator/XmlMetadataGenerator.java?rev=429336&r1=429335&r2=429336&view=diff
==============================================================================
--- geronimo/xbean/trunk/xbean-spring-common/src/main/java/org/apache/xbean/spring/generator/XmlMetadataGenerator.java (original)
+++ geronimo/xbean/trunk/xbean-spring-common/src/main/java/org/apache/xbean/spring/generator/XmlMetadataGenerator.java Mon Aug  7 06:25:07 2006
@@ -107,6 +107,13 @@
             out.println(element.getElementName() + ".factoryMethod = " + factoryMethod);
         }
         
+        for (Iterator iter = element.getAttributes().iterator(); iter.hasNext();) {
+			AttributeMapping attribute = (AttributeMapping) iter.next();
+			if( attribute.getPropertyEditor() !=null ) {
+	            out.println(element.getElementName() + "."+attribute.getPropertyName()+ ".propertyEditor = " + attribute.getPropertyEditor());
+			}
+		}
+        
         List flatProperties = element.getFlatProperties();
         for (Iterator itr = flatProperties.iterator(); itr.hasNext();) {
             out.println(element.getElementName() + "." + itr.next() + ".flat");

Modified: geronimo/xbean/trunk/xbean-spring-v1/src/main/java/org/apache/xbean/spring/context/v1/XBeanXmlBeanDefinitionParser.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-spring-v1/src/main/java/org/apache/xbean/spring/context/v1/XBeanXmlBeanDefinitionParser.java?rev=429336&r1=429335&r2=429336&view=diff
==============================================================================
--- geronimo/xbean/trunk/xbean-spring-v1/src/main/java/org/apache/xbean/spring/context/v1/XBeanXmlBeanDefinitionParser.java (original)
+++ geronimo/xbean/trunk/xbean-spring-v1/src/main/java/org/apache/xbean/spring/context/v1/XBeanXmlBeanDefinitionParser.java Mon Aug  7 06:25:07 2006
@@ -21,10 +21,10 @@
 import java.beans.IntrospectionException;
 import java.beans.Introspector;
 import java.beans.PropertyDescriptor;
+import java.beans.PropertyEditor;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.ByteArrayOutputStream;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Enumeration;
@@ -286,9 +286,10 @@
             }
             Enumeration enumeration = properties.propertyNames();
             while (enumeration.hasMoreElements()) {
-                name = (String) enumeration.nextElement();
-                Object value = getValue(properties.getProperty(name));
-                definition.getBeanDefinition().getPropertyValues().addPropertyValue(name, value);
+                String propertyName = (String) enumeration.nextElement();
+                String propertyEditor = metadata.getPropertyEditor(getLocalName(element), propertyName);
+                Object value = getValue(properties.getProperty(propertyName), propertyEditor);
+                definition.getBeanDefinition().getPropertyValues().addPropertyValue(propertyName, value);
             }
         }
     }
@@ -306,15 +307,16 @@
     protected void addProperty(BeanDefinitionHolder definition, MappingMetaData metadata, Element element,
             String localName, String value) {
         String propertyName = metadata.getPropertyName(getLocalName(element), localName);
+        String propertyEditor = metadata.getPropertyEditor(getLocalName(element), propertyName);
         if (propertyName != null) {
             QNameHelper.addPropertyValue(
                             definition.getBeanDefinition().getPropertyValues(),
                             propertyName, 
-                            getValue(value));
+                            getValue(value, propertyEditor));
         }
     }
 
-    protected Object getValue(String value) {
+    protected Object getValue(String value, String propertyEditor) {
         if (value == null)  return null;
 
         //
@@ -337,13 +339,32 @@
             }
         }
 
+        if( propertyEditor!=null ) {
+        	PropertyEditor p = createPropertyEditor(propertyEditor);
+        	p.setAsText(value);
+        	return p.getValue();
+        }
+        
         //
         // Neither null nor a reference
         //
         return value;
     }
 
-    protected String getLocalName(Element element) {
+    protected PropertyEditor createPropertyEditor(String propertyEditor) {    	
+    	ClassLoader cl = Thread.currentThread().getContextClassLoader();
+    	if( cl==null ) {
+    		cl = XBeanXmlBeanDefinitionParser.class.getClassLoader();
+    	}
+    	
+    	try {
+    		return (PropertyEditor)cl.loadClass(propertyEditor).newInstance();
+    	} catch (Throwable e){
+    		throw new IllegalArgumentException("Could not load property editor: "+propertyEditor, e);
+    	}
+	}
+
+	protected String getLocalName(Element element) {
         String localName = element.getLocalName();
         if (localName == null) {
             localName = element.getNodeName();
@@ -565,9 +586,9 @@
                     String key = childElement.getAttribute(keyName);
                     if (key == null) throw new RuntimeException("No key defined for map " + entryName);
 
-                    Object keyValue = getValue(key);
+                    Object keyValue = getValue(key, null);
 
-                    Object value = getValue(getElementText(childElement));
+                    Object value = getValue(getElementText(childElement), null);
 
                     map.put(keyValue, value);
                 }

Added: geronimo/xbean/trunk/xbean-spring-v1/src/test/java/org/apache/xbean/spring/context/KegXBeanTest.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-spring-v1/src/test/java/org/apache/xbean/spring/context/KegXBeanTest.java?rev=429336&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-spring-v1/src/test/java/org/apache/xbean/spring/context/KegXBeanTest.java (added)
+++ geronimo/xbean/trunk/xbean-spring-v1/src/test/java/org/apache/xbean/spring/context/KegXBeanTest.java Mon Aug  7 06:25:07 2006
@@ -0,0 +1,51 @@
+/**
+ * 
+ * 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.apache.xbean.spring.example.KegService;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+
+/**
+ * Used to verify that per propety Property Editors work correctly.
+ * 
+ * @author chirino
+ * @version $Id$
+ * @since 2.2
+ */
+public class KegXBeanTest extends SpringTestSupport {
+
+    public void testBeer() throws Exception {
+    	 
+        KegService ml1000 = (KegService) getBean("ml1000");
+        KegService empty = (KegService) getBean("empty");        
+        KegService pints5 = (KegService) getBean("pints5");
+        KegService liter20 = (KegService) getBean("liter20");
+        
+        assertEquals(1000, ml1000.getRemaining());
+        assertEquals(0, empty.getRemaining());
+        assertEquals(8750, pints5.getRemaining());        
+        assertEquals(20000, liter20.getRemaining());
+        
+    }
+
+
+    protected AbstractXmlApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext("org/apache/xbean/spring/context/keg-xbean.xml");
+    }
+
+}

Added: geronimo/xbean/trunk/xbean-spring-v1/src/test/java/org/apache/xbean/spring/example/KegService.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-spring-v1/src/test/java/org/apache/xbean/spring/example/KegService.java?rev=429336&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-spring-v1/src/test/java/org/apache/xbean/spring/example/KegService.java (added)
+++ geronimo/xbean/trunk/xbean-spring-v1/src/test/java/org/apache/xbean/spring/example/KegService.java Mon Aug  7 06:25:07 2006
@@ -0,0 +1,58 @@
+/**
+ * 
+ * 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;
+
+//START SNIPPET: java
+/**
+ * @org.apache.xbean.XBean element="keg" 
+ * 
+ * Used to verify that property PropertyEditors work correctly.
+ * 
+ * @author chirino
+ */
+public class KegService {
+	
+    private long remaining;
+
+	/**
+	 * Gets the amount of beer remaining in the keg (in ml)
+	 * 
+	 * @param remaining
+	 */
+	public long getRemaining() {
+		return remaining;
+	}
+
+	/**
+	 * Sets the amount of beer remaining in the keg (in ml)
+	 * 
+     * @org.apache.xbean.Property propertyEditor="org.apache.xbean.spring.example.MilliLittersPropertyEditor"
+	 * @param remaining
+	 */
+	public void setRemaining(long remaining) {
+		this.remaining = remaining;
+	}
+	
+	public long dispense( long amount ) {
+		this.remaining -= amount;
+		return this.remaining;
+	}
+
+}
+// END SNIPPET: java
+

Added: geronimo/xbean/trunk/xbean-spring-v1/src/test/java/org/apache/xbean/spring/example/MilliLittersPropertyEditor.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-spring-v1/src/test/java/org/apache/xbean/spring/example/MilliLittersPropertyEditor.java?rev=429336&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-spring-v1/src/test/java/org/apache/xbean/spring/example/MilliLittersPropertyEditor.java (added)
+++ geronimo/xbean/trunk/xbean-spring-v1/src/test/java/org/apache/xbean/spring/example/MilliLittersPropertyEditor.java Mon Aug  7 06:25:07 2006
@@ -0,0 +1,65 @@
+/**
+ * 
+ * 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.beans.PropertyEditorSupport;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+//START SNIPPET: java
+/**
+ * 
+ * Used to verify that per property PropertyEditors work correctly.
+ * 
+ * @author chirino
+ */
+public class MilliLittersPropertyEditor extends PropertyEditorSupport {
+
+	public void setAsText(String text) throws IllegalArgumentException {
+
+		Pattern p = Pattern.compile("^(\\d+)\\s*(l(iter)?)?$", Pattern.CASE_INSENSITIVE);
+		Matcher m = p.matcher(text);
+		if( m.matches() ) {
+			setValue(new Long(Long.parseLong(m.group(1))*1000));
+			return;
+		}
+		
+		p = Pattern.compile("^(\\d+)\\s*(ml)?$", Pattern.CASE_INSENSITIVE);
+		m = p.matcher(text);
+		if( m.matches() ) {
+			setValue(new Long(Long.parseLong(m.group(1))));
+			return;
+		}
+
+		p = Pattern.compile("^(\\d+)\\s*pints?$", Pattern.CASE_INSENSITIVE);
+	    m = p.matcher(text);
+		if( m.matches() ) {
+			long pints = Long.parseLong(m.group(1));
+			setValue(new Long( (long)(pints * 1750) ));
+			return;
+		}
+		
+		throw new IllegalArgumentException("Could convert not to long (in ml) for "+ text);		
+	}
+
+	public String getAsText() {
+		Long value = (Long) getValue();
+		return (value != null ? value.toString() : "");
+	}
+}
+//END SNIPPET: java

Added: geronimo/xbean/trunk/xbean-spring-v1/src/test/resources/org/apache/xbean/spring/context/keg-xbean.xml
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-spring-v1/src/test/resources/org/apache/xbean/spring/context/keg-xbean.xml?rev=429336&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-spring-v1/src/test/resources/org/apache/xbean/spring/context/keg-xbean.xml (added)
+++ geronimo/xbean/trunk/xbean-spring-v1/src/test/resources/org/apache/xbean/spring/context/keg-xbean.xml Mon Aug  7 06:25:07 2006
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- START SNIPPET: xml -->
+<beans xmlns:x="http://xbean.apache.org/schemas/pizza">
+
+  <x:keg id="ml1000" remaining="1000 ml"/>
+  <x:keg id="pints5" remaining="5 pints"/>
+  <x:keg id="liter20" remaining="20 liter"/>
+  <x:keg id="empty" remaining="0"/>
+
+</beans>
+<!-- END SNIPPET: xml -->
\ No newline at end of file

Modified: geronimo/xbean/trunk/xbean-spring-v2/src/main/java/org/apache/xbean/spring/context/v2/XBeanNamespaceHandler.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-spring-v2/src/main/java/org/apache/xbean/spring/context/v2/XBeanNamespaceHandler.java?rev=429336&r1=429335&r2=429336&view=diff
==============================================================================
--- geronimo/xbean/trunk/xbean-spring-v2/src/main/java/org/apache/xbean/spring/context/v2/XBeanNamespaceHandler.java (original)
+++ geronimo/xbean/trunk/xbean-spring-v2/src/main/java/org/apache/xbean/spring/context/v2/XBeanNamespaceHandler.java Mon Aug  7 06:25:07 2006
@@ -19,6 +19,7 @@
 
 import java.beans.BeanInfo;
 import java.beans.PropertyDescriptor;
+import java.beans.PropertyEditor;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -362,9 +363,11 @@
             }
             Enumeration enumeration = properties.propertyNames();
             while (enumeration.hasMoreElements()) {
-                name = (String) enumeration.nextElement();
-                Object value = getValue(properties.getProperty(name));
-                definition.getBeanDefinition().getPropertyValues().addPropertyValue(name, value);
+                String propertyName = (String) enumeration.nextElement();
+                String propertyEditor = metadata.getPropertyEditor(getLocalName(element), propertyName);
+                
+                Object value = getValue(properties.getProperty(propertyName), propertyEditor);
+                definition.getBeanDefinition().getPropertyValues().addPropertyValue(propertyName, value);
             }
         }
     }
@@ -382,13 +385,14 @@
     protected void addProperty(BeanDefinitionHolder definition, MappingMetaData metadata, Element element,
             String localName, String value) {
         String propertyName = metadata.getPropertyName(getLocalName(element), localName);
+        String propertyEditor = metadata.getPropertyEditor(getLocalName(element), propertyName);
         if (propertyName != null) {
             definition.getBeanDefinition().getPropertyValues().addPropertyValue(
-                            propertyName, getValue(value));
+                            propertyName, getValue(value,propertyEditor));
         }
     }
 
-    protected Object getValue(String value) {
+    protected Object getValue(String value, String propertyEditor) {
         if (value == null)  return null;
 
         //
@@ -411,12 +415,31 @@
             }
         }
 
+        if( propertyEditor!=null ) {
+        	PropertyEditor p = createPropertyEditor(propertyEditor);
+        	p.setAsText(value);
+        	return p.getValue();
+        }
+        
         //
         // Neither null nor a reference
         //
         return value;
     }
 
+    protected PropertyEditor createPropertyEditor(String propertyEditor) {    	
+    	ClassLoader cl = Thread.currentThread().getContextClassLoader();
+    	if( cl==null ) {
+    		cl = XBeanNamespaceHandler.class.getClassLoader();
+    	}
+    	
+    	try {
+    		return (PropertyEditor)cl.loadClass(propertyEditor).newInstance();
+    	} catch (Throwable e){
+    		throw new IllegalArgumentException("Could not load property editor: "+propertyEditor, e);
+    	}
+	}
+
     protected String getLocalName(Element element) {
         String localName = element.getLocalName();
         if (localName == null) {
@@ -588,9 +611,9 @@
                     String key = childElement.getAttribute(keyName);
                     if (key == null) throw new RuntimeException("No key defined for map " + entryName);
 
-                    Object keyValue = getValue(key);
+                    Object keyValue = getValue(key, null);
 
-                    Object value = getValue(getElementText(childElement));
+                    Object value = getValue(getElementText(childElement), null);
 
                     map.put(keyValue, value);
                 }

Added: geronimo/xbean/trunk/xbean-spring-v2/src/test/java/org/apache/xbean/spring/context/KegXBeanTest.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-spring-v2/src/test/java/org/apache/xbean/spring/context/KegXBeanTest.java?rev=429336&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-spring-v2/src/test/java/org/apache/xbean/spring/context/KegXBeanTest.java (added)
+++ geronimo/xbean/trunk/xbean-spring-v2/src/test/java/org/apache/xbean/spring/context/KegXBeanTest.java Mon Aug  7 06:25:07 2006
@@ -0,0 +1,51 @@
+/**
+ * 
+ * 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.apache.xbean.spring.example.KegService;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+
+/**
+ * Used to verify that per propety Property Editors work correctly.
+ * 
+ * @author chirino
+ * @version $Id$
+ * @since 2.2
+ */
+public class KegXBeanTest extends SpringTestSupport {
+
+    public void testBeer() throws Exception {
+    	 
+        KegService ml1000 = (KegService) getBean("ml1000");
+        KegService empty = (KegService) getBean("empty");        
+        KegService pints5 = (KegService) getBean("pints5");
+        KegService liter20 = (KegService) getBean("liter20");
+        
+        assertEquals(1000, ml1000.getRemaining());
+        assertEquals(0, empty.getRemaining());
+        assertEquals(8750, pints5.getRemaining());        
+        assertEquals(20000, liter20.getRemaining());
+        
+    }
+
+
+    protected AbstractXmlApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext("org/apache/xbean/spring/context/keg-xbean.xml");
+    }
+
+}

Added: geronimo/xbean/trunk/xbean-spring-v2/src/test/java/org/apache/xbean/spring/example/KegService.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-spring-v2/src/test/java/org/apache/xbean/spring/example/KegService.java?rev=429336&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-spring-v2/src/test/java/org/apache/xbean/spring/example/KegService.java (added)
+++ geronimo/xbean/trunk/xbean-spring-v2/src/test/java/org/apache/xbean/spring/example/KegService.java Mon Aug  7 06:25:07 2006
@@ -0,0 +1,58 @@
+/**
+ * 
+ * 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;
+
+//START SNIPPET: java
+/**
+ * @org.apache.xbean.XBean element="keg" 
+ * 
+ * Used to verify that property PropertyEditors work correctly.
+ * 
+ * @author chirino
+ */
+public class KegService {
+	
+    private long remaining;
+
+	/**
+	 * Gets the amount of beer remaining in the keg (in ml)
+	 * 
+	 * @param remaining
+	 */
+	public long getRemaining() {
+		return remaining;
+	}
+
+	/**
+	 * Sets the amount of beer remaining in the keg (in ml)
+	 * 
+     * @org.apache.xbean.Property propertyEditor="org.apache.xbean.spring.example.MilliLittersPropertyEditor"
+	 * @param remaining
+	 */
+	public void setRemaining(long remaining) {
+		this.remaining = remaining;
+	}
+	
+	public long dispense( long amount ) {
+		this.remaining -= amount;
+		return this.remaining;
+	}
+
+}
+// END SNIPPET: java
+

Added: geronimo/xbean/trunk/xbean-spring-v2/src/test/java/org/apache/xbean/spring/example/MilliLittersPropertyEditor.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-spring-v2/src/test/java/org/apache/xbean/spring/example/MilliLittersPropertyEditor.java?rev=429336&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-spring-v2/src/test/java/org/apache/xbean/spring/example/MilliLittersPropertyEditor.java (added)
+++ geronimo/xbean/trunk/xbean-spring-v2/src/test/java/org/apache/xbean/spring/example/MilliLittersPropertyEditor.java Mon Aug  7 06:25:07 2006
@@ -0,0 +1,65 @@
+/**
+ * 
+ * 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.beans.PropertyEditorSupport;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+//START SNIPPET: java
+/**
+ * 
+ * Used to verify that per property PropertyEditors work correctly.
+ * 
+ * @author chirino
+ */
+public class MilliLittersPropertyEditor extends PropertyEditorSupport {
+
+	public void setAsText(String text) throws IllegalArgumentException {
+
+		Pattern p = Pattern.compile("^(\\d+)\\s*(l(iter)?)?$", Pattern.CASE_INSENSITIVE);
+		Matcher m = p.matcher(text);
+		if( m.matches() ) {
+			setValue(new Long(Long.parseLong(m.group(1))*1000));
+			return;
+		}
+		
+		p = Pattern.compile("^(\\d+)\\s*(ml)?$", Pattern.CASE_INSENSITIVE);
+		m = p.matcher(text);
+		if( m.matches() ) {
+			setValue(new Long(Long.parseLong(m.group(1))));
+			return;
+		}
+
+		p = Pattern.compile("^(\\d+)\\s*pints?$", Pattern.CASE_INSENSITIVE);
+	    m = p.matcher(text);
+		if( m.matches() ) {
+			long pints = Long.parseLong(m.group(1));
+			setValue(new Long( (long)(pints * 1750) ));
+			return;
+		}
+		
+		throw new IllegalArgumentException("Could convert not to long (in ml) for "+ text);		
+	}
+
+	public String getAsText() {
+		Long value = (Long) getValue();
+		return (value != null ? value.toString() : "");
+	}
+}
+//END SNIPPET: java

Added: geronimo/xbean/trunk/xbean-spring-v2/src/test/resources/org/apache/xbean/spring/context/keg-xbean.xml
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-spring-v2/src/test/resources/org/apache/xbean/spring/context/keg-xbean.xml?rev=429336&view=auto
==============================================================================
--- geronimo/xbean/trunk/xbean-spring-v2/src/test/resources/org/apache/xbean/spring/context/keg-xbean.xml (added)
+++ geronimo/xbean/trunk/xbean-spring-v2/src/test/resources/org/apache/xbean/spring/context/keg-xbean.xml Mon Aug  7 06:25:07 2006
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- START SNIPPET: xml -->
+<beans xmlns:x="http://xbean.apache.org/schemas/pizza">
+
+  <x:keg id="ml1000" remaining="1000 ml"/>
+  <x:keg id="pints5" remaining="5 pints"/>
+  <x:keg id="liter20" remaining="20 liter"/>
+  <x:keg id="empty" remaining="0"/>
+
+</beans>
+<!-- END SNIPPET: xml -->