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]