1 package org.apache.commons.digester3.xmlrules;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.StringTokenizer;
23
24 import org.apache.commons.digester3.binder.LinkedRuleBuilder;
25 import org.apache.commons.digester3.binder.ObjectCreateBuilder;
26 import org.apache.commons.digester3.binder.RulesBinder;
27 import org.xml.sax.Attributes;
28
29
30
31
32 final class ObjectCreateRule
33 extends AbstractXmlRule
34 {
35
36 public ObjectCreateRule( RulesBinder targetRulesBinder, PatternStack patternStack )
37 {
38 super( targetRulesBinder, patternStack );
39 }
40
41
42
43
44 @Override
45 protected void bindRule( LinkedRuleBuilder linkedRuleBuilder, Attributes attributes )
46 throws Exception
47 {
48 ObjectCreateBuilder builder = linkedRuleBuilder.createObject()
49 .ofType( attributes.getValue( "classname" ) )
50 .ofTypeSpecifiedByAttribute( attributes.getValue( "attrname" ) );
51
52 String paramTypesStr = attributes.getValue( "paramtypes" );
53 if ( paramTypesStr != null && paramTypesStr.length() > 0 )
54 {
55 StringTokenizer tokens = new StringTokenizer( paramTypesStr, " \t\n\r," );
56 String[] paramTypeNames = new String[tokens.countTokens()];
57 int counter = 0;
58 while ( tokens.hasMoreTokens() )
59 {
60 paramTypeNames[counter++] = tokens.nextToken();
61 }
62 builder.usingConstructor( paramTypeNames );
63 }
64 String paramsStr = attributes.getValue( "params" );
65 if ( paramsStr != null && paramsStr.length() > 0 )
66 {
67 StringTokenizer tokens = new StringTokenizer( paramTypesStr, " \t\n\r," );
68 Object[] params = new Object[tokens.countTokens()];
69 int counter = 0;
70 while ( tokens.hasMoreTokens() )
71 {
72 params[counter++] = tokens.nextToken();
73 }
74 builder.usingDefaultConstructorArguments( params );
75 }
76 }
77
78 }