View Javadoc

1   package org.apache.commons.digester3;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import static org.apache.commons.digester3.binder.DigesterLoader.newLoader;
23  import static org.junit.Assert.assertEquals;
24  import static org.junit.Assert.assertFalse;
25  import static org.junit.Assert.assertTrue;
26  
27  import org.apache.commons.digester3.annotations.FromAnnotationsRuleModule;
28  import org.apache.commons.digester3.binder.AbstractRulesModule;
29  import org.apache.commons.digester3.binder.RulesModule;
30  import org.apache.commons.digester3.xmlrules.FromXmlRulesModule;
31  import org.junit.Test;
32  import org.xml.sax.SAXParseException;
33  
34  /**
35   * DIGESTER-153
36   */
37  public final class Digester153TestCase
38  {
39  
40      @Test
41      public void basicConstructor()
42          throws Exception
43      {
44          ObjectCreateRule createRule = new ObjectCreateRule( TestBean.class );
45          createRule.setConstructorArgumentTypes( boolean.class, double.class );
46  
47          Digester digester = new Digester();
48          digester.addRule( "toplevel/bean", createRule );
49          digester.addCallParam( "toplevel/bean", 0, "boolean" );
50          digester.addCallParam( "toplevel/bean", 1, "double" );
51  
52          TestBean bean = digester.parse( getClass().getResourceAsStream( "BasicConstructor.xml" ) );
53  
54          assertTrue( bean.getBooleanProperty() );
55          assertEquals( 9.99D, bean.getDoubleProperty(), 0 );
56  
57          // do it again to exercise the cglib Factory:
58          bean = digester.parse( getClass().getResourceAsStream( "BasicConstructor.xml" ) );
59  
60          assertTrue( bean.getBooleanProperty() );
61          assertEquals( 9.99D, bean.getDoubleProperty(), 0 );
62      }
63  
64      @Test
65      public void constructorWithAttributeAndElement()
66          throws Exception
67      {
68          ObjectCreateRule createRule = new ObjectCreateRule( TestBean.class );
69          createRule.setConstructorArgumentTypes( boolean.class, double.class );
70  
71          Digester digester = new Digester();
72          digester.addRule( "toplevel/bean", createRule );
73          digester.addCallParam( "toplevel/bean", 0, "boolean" );
74          digester.addCallParam( "toplevel/bean/double", 1 );
75          digester.addBeanPropertySetter("toplevel/bean/float", "floatProperty");
76  
77          TestBean bean = digester.parse( getClass().getResourceAsStream( "ConstructorWithAttributeAndElement.xml" ) );
78  
79          assertTrue( bean.getBooleanProperty() );
80          assertEquals( 9.99D, bean.getDoubleProperty(), 0 );
81          assertEquals( Float.valueOf( 5.5f ), Float.valueOf( bean.getFloatProperty() ) );
82  
83          // do it again to exercise the cglib Factory:
84          bean = digester.parse( getClass().getResourceAsStream( "ConstructorWithAttributeAndElement.xml" ) );
85  
86          assertTrue( bean.getBooleanProperty() );
87          assertEquals( 9.99D, bean.getDoubleProperty(), 0 );
88          assertEquals( Float.valueOf( 5.5f ), Float.valueOf( bean.getFloatProperty() ) );
89      }
90  
91      @Test
92      public void basicConstructorViaBinder()
93          throws Exception
94      {
95          succesfullConstructor( new AbstractRulesModule()
96          {
97  
98              @Override
99              protected void configure()
100             {
101                 forPattern( "toplevel/bean" )
102                     .createObject().ofType( TestBean.class ).usingConstructor( boolean.class, double.class )
103                     .then()
104                     .callParam().fromAttribute( "boolean" ).ofIndex( 0 )
105                     .then()
106                     .callParam().fromAttribute( "double" ).ofIndex( 1 );
107             }
108 
109         } );
110     }
111 
112     @Test
113     public void basicConstructorViaAnnotations()
114         throws Exception
115     {
116         succesfullConstructor( new FromAnnotationsRuleModule()
117         {
118 
119             @Override
120             protected void configureRules()
121             {
122                 bindRulesFrom( TestBean.class );
123             }
124 
125         } );
126     }
127 
128     @Test
129     public void basicConstructorViaXML()
130         throws Exception
131     {
132         succesfullConstructor( new FromXmlRulesModule()
133         {
134 
135             @Override
136             protected void loadRules()
137             {
138                 loadXMLRules( getClass().getResourceAsStream( "xmlrules/constructor-testrules.xml" ) );
139             }
140 
141         } );
142     }
143 
144     private void succesfullConstructor( RulesModule rulesModule )
145         throws Exception
146     {
147         TestBean bean = newLoader( rulesModule )
148                             .newDigester()
149                             .parse( getClass().getResourceAsStream( "BasicConstructor.xml" ) );
150 
151         assertTrue( bean.getBooleanProperty() );
152         assertEquals( 9.99D, bean.getDoubleProperty(), 0 );
153     }
154 
155     @Test
156     public void basicConstructorWithValuesNotFound()
157         throws Exception
158     {
159         ObjectCreateRule createRule = new ObjectCreateRule( TestBean.class );
160         createRule.setConstructorArgumentTypes( boolean.class, double.class );
161 
162         Digester digester = new Digester();
163         digester.addRule( "toplevel/bean", createRule );
164         digester.addCallParam( "toplevel/bean", 0, "notFound1" );
165         digester.addCallParam( "toplevel/bean", 1, "notFound2" );
166 
167         TestBean bean = digester.parse( getClass().getResourceAsStream( "BasicConstructor.xml" ) );
168 
169         assertFalse( bean.getBooleanProperty() );
170         assertEquals( 0D, bean.getDoubleProperty(), 0 );
171     }
172 
173     @Test( expected = SAXParseException.class )
174     public void basicConstructorWithWrongParameters()
175         throws Exception
176     {
177         ObjectCreateRule createRule = new ObjectCreateRule( TestBean.class );
178         createRule.setConstructorArgumentTypes( boolean.class );
179 
180         Digester digester = new Digester();
181         digester.addRule( "toplevel/bean", createRule );
182 
183         digester.parse( getClass().getResourceAsStream( "BasicConstructor.xml" ) );
184     }
185 
186     @Test
187     public void constructorWithClassDefinedInAttribute()
188         throws Exception
189     {
190         ObjectCreateRule createRule = new ObjectCreateRule( null, "type" );
191         createRule.setConstructorArgumentTypes( boolean.class, double.class );
192 
193         Digester digester = new Digester();
194         digester.addRule( "toplevel/bean", createRule );
195         digester.addCallParam( "toplevel/bean", 0, "boolean" );
196         digester.addCallParam( "toplevel/bean", 1, "double" );
197 
198         TestBean bean = digester.parse( getClass().getResourceAsStream( "AttributeDefinedConstructor.xml" ) );
199 
200         assertTrue( bean.getBooleanProperty() );
201         assertEquals( 9.99D, bean.getDoubleProperty(), 0 );
202     }
203 
204 }