rdonkin 2003/07/29 14:33:32
Modified: betwixt/src/test/org/apache/commons/betwixt
TestBeanReader.java
betwixt/xdocs overview.xml tasks.xml
Log:
Added unit tests for ConvertUtil string to object conversion in BeanUtils.
Revision Changes Path
1.15 +127 -0
jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/TestBeanReader.java
Index: TestBeanReader.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/TestBeanReader.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- TestBeanReader.java 28 Jun 2003 10:53:15 -0000 1.14
+++ TestBeanReader.java 29 Jul 2003 21:33:31 -0000 1.15
@@ -72,17 +72,26 @@
import java.sql.Time;
import java.sql.Timestamp;
import java.util.List;
+import java.util.Calendar;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
import junit.framework.Test;
import junit.framework.TestSuite;
import junit.textui.TestRunner;
+import org.apache.commons.beanutils.Converter;
import org.apache.commons.beanutils.ConvertUtils;
+import org.apache.commons.beanutils.ConversionException;
+
+import org.apache.commons.betwixt.XMLIntrospector;
import org.apache.commons.betwixt.io.BeanReader;
import org.apache.commons.betwixt.io.BeanWriter;
import org.apache.commons.betwixt.io.BeanRuleSet;
import org.apache.commons.betwixt.digester.XMLIntrospectorHelper;
import org.apache.commons.betwixt.expression.MapEntryAdder;
+import org.apache.commons.betwixt.expression.MethodUpdater;
+import org.apache.commons.betwixt.strategy.HyphenatedNameMapper;
import org.apache.commons.digester.Rule;
import org.apache.commons.digester.ExtendedBaseRules;
@@ -371,6 +380,124 @@
assertEquals("Rule one digester top object", listOfNames ,
ruleOne.getTop());
assertEquals("Rule two digester top object", martinBean , ruleTwo.getTop());
}
+
+ public void testDateReadConversion() throws Exception {
+
+ //SimpleLog log = new SimpleLog("testDateReadConversion:MethodUpdater");
+ //log.setLevel(SimpleLog.LOG_LEVEL_TRACE);
+ //MethodUpdater.setLog(log);
+
+ class ISOToStringConverter implements Converter {
+ final SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
+ public Object convert(Class type, Object value) {
+ if (value == null) {
+ return null;
+ }
+ if (value instanceof java.util.Date) {
+ return formatter.format((java.util.Date)value);
+ }
+ return value.toString();
+ }
+ }
+
+ class ISODateConverter implements Converter {
+ final SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
+ public Object convert(Class type, Object value) {
+
+ if (value == null) {
+ return null;
+ }
+
+ if (value instanceof java.util.Date) {
+
+ return formatter.format((java.util.Date)value);
+ }
+
+ try {
+ return formatter.parse(value.toString());
+ } catch (ParseException ex) {
+ throw new ConversionException(ex);
+ }
+ }
+ }
+
+ ISODateConverter converter = new ISODateConverter();
+ ConvertUtils.register(converter, java.util.Date.class);
+ ISOToStringConverter tsConverter = new ISOToStringConverter();
+ ConvertUtils.register(tsConverter, String.class);
+
+ Converter dateConverter = ConvertUtils.lookup(java.util.Date.class);
+ assertEquals("Date converter successfully registered", dateConverter,
converter);
+ Converter stringConverter = ConvertUtils.lookup(String.class);
+ assertEquals("Date converter successfully registered", tsConverter,
stringConverter);
+
+ java.util.Date conversionResult = (java.util.Date)
+ ConvertUtils.convert("20030101",
java.util.Date.class);
+
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(conversionResult);
+ int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
+ assertEquals("Correct conversion result", dayOfYear, 1);
+
+ calendar.set(2003, 7, 2);
+ java.util.Date date = calendar.getTime();
+
+ PartyBean bean = new PartyBean(
+ "Wedding",
+ date,
+ 1900,
+ new AddressBean("Old White Lion Hotel", "Howarth", "Merry Old
England", "BD22 8EP"));
+
+ StringWriter out = new StringWriter();
+ out.write("<?xml version='1.0'?>");
+
+ BeanWriter writer = new BeanWriter(out);
+ XMLIntrospector introspector = writer.getXMLIntrospector();
+ introspector.setElementNameMapper(new HyphenatedNameMapper());
+ introspector.setAttributesForPrimitives(false);
+
+ writer.write("party", bean);
+
+ String xml = "<?xml version='1.0'?><party>"
+ + "<venue><street>Old White Lion Hotel</street><city>Howarth</city>"
+ + "<code>BD22 8EP</code><country>Merry Old England</country></venue>"
+ + "<date-of-party>20030802</date-of-party><from-hour>1900</from-hour>"
+ + "<excuse>Wedding</excuse>"
+ + "</party>";
+
+ xmlAssertIsomorphic(parseString(xml), parseString(out) , true);
+
+ BeanReader reader = new BeanReader();
+ reader.setXMLIntrospector(introspector);
+ reader.registerBeanClass("party", PartyBean.class);
+ PartyBean readBean = (PartyBean) reader.parse(new StringReader(xml));
+
+ assertEquals("FromHours incorrect property value", readBean.getFromHour(),
bean.getFromHour());
+ assertEquals("Excuse incorrect property value", readBean.getExcuse(),
bean.getExcuse());
+
+ // check address
+ AddressBean readAddress = readBean.getVenue();
+ AddressBean address = bean.getVenue();
+ assertEquals("address.street incorrect property value",
readAddress.getStreet(), address.getStreet());
+ assertEquals("address.city incorrect property value",
readAddress.getCity(), address.getCity());
+ assertEquals("address.code incorrect property value",
readAddress.getCode(), address.getCode());
+ assertEquals("address.country incorrect property value",
readAddress.getCountry(), address.getCountry());
+
+ // check dates
+ calendar.setTime(bean.getDateOfParty());
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
+ dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
+ int year = calendar.get(Calendar.YEAR);
+ calendar.setTime(readBean.getDateOfParty());
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
+ int readDayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
+ int readYear = calendar.get(Calendar.YEAR);
+ assertEquals("date incorrect property value (year)", year, readYear);
+ assertEquals("date incorrect property value (day)", dayOfYear,
readDayOfYear);
+
+ ConvertUtils.deregister();
+ }
+
public void testReadMap() throws Exception {
// we might as well start by writing out
1.19 +9 -0 jakarta-commons/betwixt/xdocs/overview.xml
Index: overview.xml
===================================================================
RCS file: /home/cvs/jakarta-commons/betwixt/xdocs/overview.xml,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- overview.xml 27 Jul 2003 17:50:20 -0000 1.18
+++ overview.xml 29 Jul 2003 21:33:31 -0000 1.19
@@ -471,6 +471,15 @@
</p>
</subsection>
+<subsection name='Using ConvertUtils To Customize Conversion Of Primitives'>
+ <p>
+<code>ConvertUtils</code> is part of <a
href='http://jakarta.apache.org/commons/beanutils.html'>commons-beanutils</a>
+and it can be used to flexibly convert strings to objects and back again. Betwixt
uses ConvertUtils to
+perform these conversions and so standard <code>ConvertUtils</code> methods can be
called to customize these
+conversions.
+ </p>
+</subsection>
+
</section>
<section name='Writing Beans (Advanced)'>
1.19 +10 -0 jakarta-commons/betwixt/xdocs/tasks.xml
Index: tasks.xml
===================================================================
RCS file: /home/cvs/jakarta-commons/betwixt/xdocs/tasks.xml,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- tasks.xml 27 Jul 2003 17:50:20 -0000 1.18
+++ tasks.xml 29 Jul 2003 21:33:31 -0000 1.19
@@ -232,6 +232,10 @@
Basic support for writing DynaBeans has been added. This was
implemented by using an additional
layer of abstraction in the introspector.
</li>
+ <li>
+ <strong>Support for converting output strings</strong>
+ ConvertUtils is now called to convert output strings (as well as input
ones).
+ </li>
</ul>
</subsection>
</section>
@@ -342,6 +346,12 @@
DynaBean's are now mapped using the properties found via the
pseudo-introspection process
defined in BeanUtils. If you don't wish for DynaBeans
implementations to be introspected
in this way then provide a <code>.betwixt</code> file to specify
the mapping.
+ </li>
+ <li>
+ <strong>String To Object Conversions Now Use
<code>ConvertUtils</code></strong>
+ <code>ConvertUtils</code> from commons-beanutils is now called to
performt the object to
+ string conversions. It is possible that in some circumstances, this
change may effect the
+ output.
</li>
</ul>
</subsection>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]