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 org.apache.commons.digester3.binder.CallParamBuilder;
23 import org.apache.commons.digester3.binder.LinkedRuleBuilder;
24 import org.apache.commons.digester3.binder.RulesBinder;
25 import org.xml.sax.Attributes;
26
27
28
29
30 final class CallParamRule
31 extends AbstractXmlRule
32 {
33
34 public CallParamRule( RulesBinder targetRulesBinder, PatternStack patternStack )
35 {
36 super( targetRulesBinder, patternStack );
37 }
38
39
40
41
42 @Override
43 protected void bindRule( LinkedRuleBuilder linkedRuleBuilder, Attributes attributes )
44 throws Exception
45 {
46 int paramIndex = Integer.parseInt( attributes.getValue( "paramnumber" ) );
47 CallParamBuilder builder = linkedRuleBuilder.callParam().ofIndex( paramIndex );
48
49 String attributeName = attributes.getValue( "attrname" );
50 String fromStack = attributes.getValue( "from-stack" );
51 String stackIndex = attributes.getValue( "stack-index" );
52
53 if ( attributeName == null )
54 {
55 if ( stackIndex != null )
56 {
57 builder.withStackIndex( Integer.parseInt( stackIndex ) );
58 }
59 else if ( fromStack != null )
60 {
61 builder.fromStack( Boolean.valueOf( fromStack ).booleanValue() );
62 }
63 }
64 else
65 {
66 if ( fromStack == null )
67 {
68 builder.fromAttribute( attributeName );
69 }
70 else
71 {
72
73 throw new RuntimeException( "Attributes from-stack and attrname cannot both be present." );
74 }
75 }
76 }
77
78 }