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]