Author: simoneg
Date: Fri Dec 11 15:09:55 2009
New Revision: 889647

URL: http://svn.apache.org/viewvc?rev=889647&view=rev
Log:
LABS-235 : generic magma bean converter

Added:
    
labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/conversion/string/MagmaBeanConverter.java
    
labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/string/DummyMagmaBean.java
    
labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/string/TestMagmaBeanConverterFromStringCorrect.java
    
labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/string/TestMagmaBeanConverterFromStringIncorrect.java
    
labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/string/TestMagmaBeanConverterToStringCorrect.java
Modified:
    
labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/conversion/string/BaseConverter.java
    
labs/magma/trunk/foundation-beans/src/main/resources/META-INF/magma.default.properties

Modified: 
labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/conversion/string/BaseConverter.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/conversion/string/BaseConverter.java?rev=889647&r1=889646&r2=889647&view=diff
==============================================================================
--- 
labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/conversion/string/BaseConverter.java
 (original)
+++ 
labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/conversion/string/BaseConverter.java
 Fri Dec 11 15:09:55 2009
@@ -36,12 +36,12 @@
        /**
         * The type this converter converts from and to String.
         */
-       private Class<T> myclass = null;
+       protected Class<? extends T> myclass = null;
        
        /**
         * @param myclass The type this converter converts from and to String.
         */
-       protected BaseConverter(Class<T> myclass) {
+       protected BaseConverter(Class<? extends T> myclass) {
                this.myclass = myclass;
        }
        

Added: 
labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/conversion/string/MagmaBeanConverter.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/conversion/string/MagmaBeanConverter.java?rev=889647&view=auto
==============================================================================
--- 
labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/conversion/string/MagmaBeanConverter.java
 (added)
+++ 
labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/conversion/string/MagmaBeanConverter.java
 Fri Dec 11 15:09:55 2009
@@ -0,0 +1,114 @@
+package org.apache.magma.conversion.string;
+
+import java.util.Set;
+
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.magma.basics.MagmaException;
+import org.apache.magma.beans.BeanData;
+import org.apache.magma.beans.BeanHandler;
+import org.apache.magma.beans.MagmaBeanSupport;
+import org.apache.magma.beans.PropertyInfo;
+import org.apache.magma.conversion.ConversionException;
+import org.apache.magma.conversion.Converter;
+
+public class MagmaBeanConverter extends BaseConverter<MagmaBeanSupport> {
+
+       public MagmaBeanConverter() {
+               super(MagmaBeanSupport.class);
+       }
+       
+       protected MagmaBeanConverter(Class<? extends MagmaBeanSupport> myclass) 
{
+               super(myclass);
+       }
+       @Override
+       public Converter<MagmaBeanSupport> build(Class<? extends 
MagmaBeanSupport> clazz) {
+               return new MagmaBeanConverter(clazz);
+       }
+       public String to(MagmaBeanSupport value) {
+               if (value == null) return null;
+               StringBuilder sb = new StringBuilder();
+               BeanData beanData = value.beanData();
+               BeanHandler handler = value.handler();
+               Set<String> propertyNames = beanData.getPropertyNames();
+               for (String prop : propertyNames) {
+                       PropertyInfo property = beanData.getProperty(prop);
+                       if (!property.isReadable() || !property.isWriteable()) 
continue;
+                       Converter conv = property.getConverter();
+                       if (conv != null && 
!conv.getClass().equals(MagmaBeanConverter.class)) {
+                               Object objval = handler.getValue(prop);
+                               if (objval == null) continue;
+                               sb.append(prop);
+                               sb.append("=");
+                               String val = property.toString(objval);
+                               sb.append(StringEscapeUtils.escapeCsv(val));
+                               sb.append(",");
+                       }
+               }
+               return sb.toString();
+       }
+       
+       public MagmaBeanSupport from(String value) {
+               if (value == null || value.length() == 0) return null;
+               MagmaBeanSupport ret = null;
+               try {
+                       ret = this.myclass.newInstance();
+               } catch (Exception e) {
+                       throw new ConversionException(e, "Cannot instantiate a 
{0} to decode {1}", this.myclass, value);
+               }
+               BeanData beanData = ret.beanData();
+               BeanHandler handler = ret.handler();
+               int pos = 0;
+               while (true) {
+                       if (pos >= value.length()) break;
+                       // Find the next "="
+                       int eqpos = value.indexOf('=', pos);
+                       if (eqpos == -1) throw new 
ConversionException("Malformed encoded bean '{0}'", value);
+                       String propname = value.substring(pos, eqpos);
+                       if (propname.indexOf(',') != -1 || 
propname.indexOf('=') != -1) throw new ConversionException("Error decoding bean 
from string '{0}': invalid property name", value);
+                       propname = propname.trim();
+                       if (propname.length() == 0) throw new 
ConversionException("Error decoding bean from string '{0}': empty property 
name", value);
+                       PropertyInfo property = beanData.getProperty(propname);
+                       // Check the length of the value
+                       int endpos = -1;
+                       if (value.charAt(eqpos + 1) == '"') {
+                               endpos = eqpos + 2;
+                               while (true) {
+                                       endpos = value.indexOf('"', endpos);
+                                       if (endpos == -1) throw new 
ConversionException("Error decoding bean from string '{0}': not found trailing 
quote", value);
+                                       if (value.charAt(endpos + 1) == ',') {
+                                               endpos++;
+                                               break;
+                                       } else if (value.charAt(endpos + 1) != 
'"') {
+                                               throw new 
ConversionException("Error decoding bean from string '{0}': misplaced quote", 
value);
+                                       }
+                                       endpos+=2;
+                                       if (endpos >= value.length()) throw new 
ConversionException("Error decoding bean from string '{0}': not found trailing 
quote", value);
+                               }
+                       } else {
+                               endpos = value.indexOf(',', eqpos);
+                       }
+                       if (endpos == -1) throw new ConversionException("Error 
decoding bean from string '{0}': not found trailing comma", value);
+                       pos = endpos + 1;
+                       
+                       if (property == null) continue;
+                       Converter conv = property.getConverter();
+                       if (conv == null) throw new ConversionException("Cannot 
find a converter for property {0},{1} while decoding bean", this.myclass, 
propname);
+                       
+                       String val = value.substring(eqpos + 1, endpos);
+                       val = StringEscapeUtils.unescapeCsv(val);
+                       if (val.length() >= 2 && val.charAt(0) == '"') {
+                               val = val.substring(1, val.length() - 1);
+                       }
+                       Object convval = conv.from(val);
+                       handler.setValue(propname, convval);
+                       if (pos >= value.length()) break;
+               }
+               handler.commit();
+               return ret;
+       }
+       
+       public int getMaximumStringSize() {
+               return -1;
+       }
+
+}

Modified: 
labs/magma/trunk/foundation-beans/src/main/resources/META-INF/magma.default.properties
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-beans/src/main/resources/META-INF/magma.default.properties?rev=889647&r1=889646&r2=889647&view=diff
==============================================================================
--- 
labs/magma/trunk/foundation-beans/src/main/resources/META-INF/magma.default.properties
 (original)
+++ 
labs/magma/trunk/foundation-beans/src/main/resources/META-INF/magma.default.properties
 Fri Dec 11 15:09:55 2009
@@ -25,3 +25,4 @@
 
org.apache.magma.conversion.Converter.long=org.apache.magma.conversion.string.LongConverter
 
org.apache.magma.conversion.Converter.short=org.apache.magma.conversion.string.ShortConverter
 
org.apache.magma.conversion.Converter.string=org.apache.magma.conversion.string.StringConverter
+org.apache.magma.conversion.Converter.~magmabean=org.apache.magma.conversion.string.MagmaBeanConverter

Added: 
labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/string/DummyMagmaBean.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/string/DummyMagmaBean.java?rev=889647&view=auto
==============================================================================
--- 
labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/string/DummyMagmaBean.java
 (added)
+++ 
labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/string/DummyMagmaBean.java
 Fri Dec 11 15:09:55 2009
@@ -0,0 +1,59 @@
+package org.apache.magma.conversion.string;
+
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.magma.beans.MagmaBean;
+
+...@magmabean
+public class DummyMagmaBean {
+
+       private String name;
+       private String surname;
+       private DummyMagmaBean friend;
+       
+       public DummyMagmaBean() {}
+       
+       public DummyMagmaBean(String name, String surname, DummyMagmaBean 
friend) {
+               this.name = name;
+               this.surname = surname;
+               this.friend = friend;
+       }
+       
+       public String getName() {
+               return name;
+       }
+       public void setName(String name) {
+               this.name = name;
+       }
+       public String getSurname() {
+               return surname;
+       }
+       public void setSurname(String surname) {
+               this.surname = surname;
+       }
+       public DummyMagmaBean getFriend() {
+               return friend;
+       }
+       public void setFriend(DummyMagmaBean friend) {
+               this.friend = friend;
+       }
+       
+       public boolean equals(Object othobj) {
+               if (!(othobj instanceof DummyMagmaBean)) return false;
+               DummyMagmaBean other = (DummyMagmaBean) othobj;
+               return new EqualsBuilder()
+                       .append(this.name, other.name)
+                       .append(this.surname, other.surname)
+                       .append(this.friend, other.friend)
+                       .isEquals();
+       }
+       
+       @Override
+       public String toString() {
+               return new ToStringBuilder(this)
+                       .append("name", this.name)
+                       .append("surname", this.surname)
+                       .append("friend", this.friend)
+                       .toString();
+       }
+}

Added: 
labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/string/TestMagmaBeanConverterFromStringCorrect.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/string/TestMagmaBeanConverterFromStringCorrect.java?rev=889647&view=auto
==============================================================================
--- 
labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/string/TestMagmaBeanConverterFromStringCorrect.java
 (added)
+++ 
labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/string/TestMagmaBeanConverterFromStringCorrect.java
 Fri Dec 11 15:09:55 2009
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.magma.conversion.string;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.magma.conversion.ConversionTestBean;
+import org.apache.magma.conversion.ConversionTestBean.TestEnum;
+import org.apache.magma.conversion.string.EnumConverter;
+
+import org.junit.Before;
+import org.junit.experimental.theories.DataPoint;
+import org.junit.experimental.theories.Theories;
+import org.junit.experimental.theories.Theory;
+import org.junit.experimental.theories.internal.ParameterizedAssertionError;
+import org.junit.runner.RunWith;
+
+...@runwith(Theories.class)
+public class TestMagmaBeanConverterFromStringCorrect {
+       public MagmaBeanConverter converter;
+
+       @Before
+       public void initConverter() {
+               converter = new MagmaBeanConverter(DummyMagmaBean.class);
+       }
+                       
+       @DataPoint public static Object[]
+       set1 = {"name=Foo,", new DummyMagmaBean("Foo", null, null)},
+       set2 = {"name=\"Foo\",surname=\"Bar\",", new DummyMagmaBean("Foo", 
"Bar", null)},
+       set3 = {"name=\"Foo \"\"The foo\"\"\",surname=\"Bar\",", new 
DummyMagmaBean("Foo \"The foo\"", "Bar", null)},
+       set4 = {"name=Foo,surname=Bar,", new DummyMagmaBean("Foo", "Bar", 
null)},
+       set5 = {"name=\"Foo, yes him\",surname=\"Bar\",", new 
DummyMagmaBean("Foo, yes him", "Bar", null)},
+       set6 = {"name=Foo,happiness=5,", new DummyMagmaBean("Foo", null, null)},
+       set7 = {"hapiness=5,name=Foo,", new DummyMagmaBean("Foo", null, null)},
+       set8 = {"name=Foo,hapiness=5,surname=Bar,", new DummyMagmaBean("Foo", 
"Bar", null)},
+       set9 = {"name=,surname=Bar,", new DummyMagmaBean("", "Bar", null)};
+       
+       @Theory public void convert(Object[] vals) throws Exception {
+               assertEquals("Choked on " + vals[0], vals[1], 
converter.from((String)vals[0]));
+       }
+       
+}

Added: 
labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/string/TestMagmaBeanConverterFromStringIncorrect.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/string/TestMagmaBeanConverterFromStringIncorrect.java?rev=889647&view=auto
==============================================================================
--- 
labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/string/TestMagmaBeanConverterFromStringIncorrect.java
 (added)
+++ 
labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/string/TestMagmaBeanConverterFromStringIncorrect.java
 Fri Dec 11 15:09:55 2009
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.magma.conversion.string;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.magma.conversion.ConversionException;
+import org.apache.magma.conversion.ConversionTestBean;
+import org.apache.magma.conversion.ConversionTestBean.TestEnum;
+import org.apache.magma.conversion.string.EnumConverter;
+
+import org.junit.Before;
+import org.junit.experimental.theories.DataPoint;
+import org.junit.experimental.theories.Theories;
+import org.junit.experimental.theories.Theory;
+import org.junit.experimental.theories.internal.ParameterizedAssertionError;
+import org.junit.runner.RunWith;
+import static junit.framework.Assert.fail;
+
+...@runwith(Theories.class)
+public class TestMagmaBeanConverterFromStringIncorrect {
+       public MagmaBeanConverter converter;
+
+       @Before
+       public void initConverter() {
+               converter = new MagmaBeanConverter(DummyMagmaBean.class);
+       }
+                       
+       @DataPoint public static String
+       set1 = "name=Foo",
+       set2 = "name=\"Foo\"surname=\"Bar\",", 
+       set3 = "name=\"Foo \"The foo\"\"\",surname=\"Bar\",", 
+       set4 = "=Foo,surname=Bar,", 
+       set5 = "name=\"Foo, yes him\",surname=Bar, yes it,";
+       //set6 = "name=Foo \"the foo\",happiness=5,", 
+       
+       @Theory public void convert(String vals) throws Exception {
+               try {
+                       converter.from(vals);
+                       fail("Should throw error on " + vals);
+               } catch (ConversionException e) {
+                       return;
+               }
+       }
+       
+}

Added: 
labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/string/TestMagmaBeanConverterToStringCorrect.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/string/TestMagmaBeanConverterToStringCorrect.java?rev=889647&view=auto
==============================================================================
--- 
labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/string/TestMagmaBeanConverterToStringCorrect.java
 (added)
+++ 
labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/string/TestMagmaBeanConverterToStringCorrect.java
 Fri Dec 11 15:09:55 2009
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.magma.conversion.string;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.magma.beans.MagmaBeanSupport;
+import org.apache.magma.conversion.ConversionTestBean;
+import org.apache.magma.conversion.ConversionTestBean.TestEnum;
+import org.apache.magma.conversion.string.EnumConverter;
+
+import org.junit.Before;
+import org.junit.experimental.theories.DataPoint;
+import org.junit.experimental.theories.Theories;
+import org.junit.experimental.theories.Theory;
+import org.junit.experimental.theories.internal.ParameterizedAssertionError;
+import org.junit.runner.RunWith;
+
+...@runwith(Theories.class)
+public class TestMagmaBeanConverterToStringCorrect {
+       public MagmaBeanConverter converter;
+
+       @Before
+       public void initConverter() {
+               converter = new MagmaBeanConverter(DummyMagmaBean.class);
+       }
+                       
+       @DataPoint public static Object[]
+       set1 = {"name=Foo,", new DummyMagmaBean("Foo", null, null)},
+       set3 = {"name=\"Foo \"\"The foo\"\"\",surname=Bar,", new 
DummyMagmaBean("Foo \"The foo\"", "Bar", null)},
+       set4 = {"name=Foo,surname=Bar,", new DummyMagmaBean("Foo", "Bar", 
null)},
+       set5 = {"name=\"Foo, yes him\",surname=Bar,", new DummyMagmaBean("Foo, 
yes him", "Bar", null)},
+       set9 = {"name=,surname=Bar,", new DummyMagmaBean("", "Bar", null)};
+       
+       @Theory public void convert(Object[] vals) throws Exception {
+               assertEquals("Choked on " + vals[0], vals[0], 
converter.to((MagmaBeanSupport) vals[1]));
+       }
+       
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to