01: /* $Id: FinderFromDfltClass.java 471661 2006-11-06 08:09:25Z skitching $
02: *
03: * Licensed to the Apache Software Foundation (ASF) under one or more
04: * contributor license agreements. See the NOTICE file distributed with
05: * this work for additional information regarding copyright ownership.
06: * The ASF licenses this file to You under the Apache License, Version 2.0
07: * (the "License"); you may not use this file except in compliance with
08: * the License. You may obtain a copy of the License at
09: *
10: * http://www.apache.org/licenses/LICENSE-2.0
11: *
12: * Unless required by applicable law or agreed to in writing, software
13: * distributed under the License is distributed on an "AS IS" BASIS,
14: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15: * See the License for the specific language governing permissions and
16: * limitations under the License.
17: */
18:
19: package org.apache.commons.digester.plugins.strategies;
20:
21: import java.util.Properties;
22: import org.apache.commons.digester.Digester;
23: import org.apache.commons.digester.plugins.RuleFinder;
24: import org.apache.commons.digester.plugins.RuleLoader;
25: import org.apache.commons.digester.plugins.PluginException;
26:
27: /**
28: * A rule-finding algorithm which looks for a method with a specific name
29: * on a class whose name is derived from the plugin class name.
30: *
31: * @since 1.6
32: */
33:
34: public class FinderFromDfltClass extends RuleFinder {
35: public static String DFLT_RULECLASS_SUFFIX = "RuleInfo";
36: public static String DFLT_METHOD_NAME = "addRules";
37:
38: private String rulesClassSuffix;
39: private String methodName;
40:
41: /** See {@link #findLoader}. */
42: public FinderFromDfltClass() {
43: this (DFLT_RULECLASS_SUFFIX, DFLT_METHOD_NAME);
44: }
45:
46: /**
47: * Create a rule-finder which invokes a method on a class whenever
48: * dynamic rules for a plugin need to be loaded. See the findRules
49: * method for more info.
50: *
51: * @param rulesClassSuffix must be non-null.
52: * @param methodName may be null.
53: */
54: public FinderFromDfltClass(String rulesClassSuffix,
55: String methodName) {
56: this .rulesClassSuffix = rulesClassSuffix;
57: this .methodName = methodName;
58: }
59:
60: /**
61: * If there exists a class whose name is the plugin class name + the
62: * suffix specified to the constructor, then load that class, locate
63: * the appropriate rules-adding method on that class, and return an
64: * object encapsulating that info.
65: * <p>
66: * If there is no such class, then just return null.
67: * <p>
68: * The returned object (when non-null) will invoke the target method
69: * on the selected class whenever its addRules method is invoked. The
70: * target method is expected to have the following prototype:
71: * <code> public static void xxxxx(Digester d, String patternPrefix); </code>
72: */
73: public RuleLoader findLoader(Digester digester, Class pluginClass,
74: Properties p) throws PluginException {
75:
76: String rulesClassName = pluginClass.getName()
77: + rulesClassSuffix;
78:
79: Class rulesClass = null;
80: try {
81: rulesClass = digester.getClassLoader().loadClass(
82: rulesClassName);
83: } catch (ClassNotFoundException cnfe) {
84: // ok, ignore
85: }
86:
87: if (rulesClass == null) {
88: // nope, no rule-info class in the classpath
89: return null;
90: }
91:
92: if (methodName == null) {
93: methodName = DFLT_METHOD_NAME;
94: }
95:
96: return new LoaderFromClass(rulesClass, methodName);
97: }
98: }
|