1   /*
2    * Copyright 2005 The Apache Software Foundation.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */ 
16  package org.apache.commons.betwixt.strategy;
17  
18  import java.io.StringReader;
19  import java.io.StringWriter;
20  import java.util.Collection;
21  
22  import org.apache.commons.betwixt.AbstractTestCase;
23  import org.apache.commons.betwixt.expression.Context;
24  import org.apache.commons.betwixt.io.BeanReader;
25  import org.apache.commons.betwixt.io.BeanWriter;
26  
27  public class TestConversionFlavour extends AbstractTestCase {
28  
29      public TestConversionFlavour(String testName) {
30          super(testName);
31      }
32  
33      
34      public void testRead() throws Exception {
35          String xml = "<alpha>" +
36          "        <name>BananasSIX</name>" +
37          "        <betaBean>" +
38          "            <name>PeachONE</name>" +
39          "        </betaBean>" +
40          "        <children>" +
41          "            <child>" +
42          "                <name>PeachTWO</name>" +
43          "            </child>" +
44          "        </children>" +
45          "        <mapped>" +
46          "          <entry>" +
47          "            <key>Key</key>" +
48          "            <value>" +
49          "               <name>PeachTHREE</name>" +
50          "            </value>" +
51          "          </entry>" +
52          "        </mapped>" +
53          "        </alpha>";
54          
55          StringReader in = new StringReader(xml);
56          BeanReader reader = new BeanReader();
57          reader.getBindingConfiguration().setMapIDs(false);
58          reader.getBindingConfiguration().setObjectStringConverter(new PrependingConverter());
59          reader.registerBeanClass(AlphaBean.class);
60          AlphaBean bean = (AlphaBean) reader.parse(in);
61          assertNotNull(bean);
62          assertEquals("SIX", bean.getName());
63          BetaBean betaBean = bean.getBetaBean();
64          assertNotNull(betaBean);
65          assertEquals("ONE", betaBean.getName());
66          Collection children = bean.getChildren();
67          assertEquals(1, children.size());
68          BetaBean child = (BetaBean) children.iterator().next();
69          assertEquals("TWO", child.getName());
70      }
71      
72      public void testWrite() throws Exception {
73          AlphaBean alphaBean = new AlphaBean();
74          alphaBean.setName("SIX");
75          BetaBean betaBeanOne = new BetaBean("ONE");
76          alphaBean.setBetaBean(betaBeanOne);
77          BetaBean betaBeanTwo = new BetaBean("TWO");
78          alphaBean.addChild(betaBeanTwo);
79          BetaBean betaBeanThree = new BetaBean("THREE");
80          alphaBean.put("Key", betaBeanThree);
81          
82          StringWriter out = new StringWriter();
83          BeanWriter writer = new BeanWriter(out);
84          writer.getBindingConfiguration().setMapIDs(false);
85          writer.getBindingConfiguration().setObjectStringConverter(new PrependingConverter());
86          writer.write(alphaBean);
87          
88          String xml = "<alpha>" +
89                  "        <name>BananasSIX</name>" +
90                  "        <betaBean>" +
91                  "            <name>PeachONE</name>" +
92                  "        </betaBean>" +
93                  "        <children>" +
94                  "            <child>" +
95                  "                <name>PeachTWO</name>" +
96                  "            </child>" +
97                  "        </children>" +
98                  "        <mapped>" +
99                  "          <entry>" +
100                 "            <key>Key</key>" +
101                 "            <value>" +
102                 "               <name>PeachTHREE</name>" +
103                 "            </value>" +
104                 "          </entry>" +
105                 "        </mapped>" +
106                 "        </alpha>";
107          
108         xmlAssertIsomorphicContent(parseString(xml), parseString(out), true);
109     }
110     
111 
112     public static final class PrependingConverter extends DefaultObjectStringConverter {
113         
114         public String objectToString(Object object, Class type, String flavour,
115                 Context context) {
116             String result = super.objectToString(object, type, flavour, context);
117             if (flavour != null) {
118                 result = flavour + result;
119             }
120             return result;
121         }
122 
123         public Object stringToObject(String value, Class type, String flavour,
124                 Context context) {
125             if (flavour != null) {
126                 value = value.substring(flavour.length());
127             }
128             return super.stringToObject(value, type, flavour, context);
129         }
130 }
131 }