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]

Reply via email to