1 package org.apache.commons.digester3.plugins.strategies;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import static org.apache.commons.beanutils.MethodUtils.getAccessibleMethod;
23
24 import java.lang.reflect.Method;
25
26 import org.apache.commons.digester3.Digester;
27 import org.apache.commons.digester3.plugins.PluginException;
28 import org.apache.commons.digester3.plugins.RuleLoader;
29 import org.apache.commons.logging.Log;
30
31
32
33
34
35
36
37 public class LoaderFromClass
38 extends RuleLoader
39 {
40
41 private final Class<?> rulesClass;
42
43 private final Method rulesMethod;
44
45
46
47
48
49
50
51 public LoaderFromClass( Class<?> rulesClass, Method rulesMethod )
52 {
53 this.rulesClass = rulesClass;
54 this.rulesMethod = rulesMethod;
55 }
56
57
58
59
60
61
62
63
64 public LoaderFromClass( Class<?> rulesClass, String methodName )
65 throws PluginException
66 {
67
68 Method method = locateMethod( rulesClass, methodName );
69
70 if ( method == null )
71 {
72 throw new PluginException( "rule class " + rulesClass.getName() + " does not have method " + methodName
73 + " or that method has an invalid signature." );
74 }
75
76 this.rulesClass = rulesClass;
77 this.rulesMethod = method;
78 }
79
80
81
82
83 @Override
84 public void addRules( Digester d, String path )
85 throws PluginException
86 {
87 Log log = d.getLogger();
88 boolean debug = log.isDebugEnabled();
89 if ( debug )
90 {
91 log.debug( "LoaderFromClass loading rules for plugin at path [" + path + "]" );
92 }
93
94 try
95 {
96 Object[] params = { d, path };
97 rulesMethod.invoke( null, params );
98 }
99 catch ( Exception e )
100 {
101 throw new PluginException(
102 "Unable to invoke rules method " + rulesMethod + " on rules class " + rulesClass,
103 e );
104 }
105 }
106
107
108
109
110
111
112
113
114
115
116 public static Method locateMethod( Class<?> rulesClass, String methodName )
117 throws PluginException
118 {
119 Class<?>[] paramSpec = { Digester.class, String.class };
120 Method rulesMethod = getAccessibleMethod( rulesClass, methodName, paramSpec );
121
122 return rulesMethod;
123 }
124
125 }