01: /*
02: * Copyright 1999-2004 The Apache Software Foundation
03: *
04: * Licensed under the Apache License, Version 2.0 (the "License");
05: * you may not use this file except in compliance with the License.
06: * You may obtain a copy of the License at
07: *
08: * http://www.apache.org/licenses/LICENSE-2.0
09: *
10: * Unless required by applicable law or agreed to in writing, software
11: * distributed under the License is distributed on an "AS IS" BASIS,
12: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13: * See the License for the specific language governing permissions and
14: * limitations under the License.
15: */
16: package org.apache.commons.chain.config;
17:
18: import org.apache.commons.digester.Rule;
19: import org.xml.sax.Attributes;
20:
21: /**
22: * <p>Digester rule that will dynamically register a new set of rules
23: * for a specified element name and default implementation class. This
24: * allows "alias" elements to be created for {@link Chain} and {@link Command}
25: * implementation classes that are commonly used. Besides factoring out
26: * the class names to make changes easier, this also makes configuration
27: * files <strong>much</strong> easier to read and write.</p>
28: *
29: * @version $Revision: 155403 $ $Date: 2005-02-26 12:52:46 +0000 (Sat, 26 Feb 2005) $
30: */
31:
32: class ConfigDefineRule extends Rule {
33:
34: // ----------------------------------------------------------- Constructors
35:
36: /**
37: * <p>Construct a new instance of this rule that will in turn
38: * dynamically register appropriate rules for a new alias element.</p>
39: *
40: * @param nameAttribute Name of the attribute containing the name
41: * of the new element for which rules should generated
42: * @param classAttribute Name of the attribute containing the
43: * implementation class for the new chain or command
44: */
45: public ConfigDefineRule(String nameAttribute, String classAttribute) {
46: super ();
47: this .nameAttribute = nameAttribute;
48: this .classAttribute = classAttribute;
49: }
50:
51: // ----------------------------------------------------- Instance Variables
52:
53: /**
54: * <p>The name of the attribute under which we can retrieve the
55: * fully qualified class name of the implementation class for this
56: * new element.</p>
57: */
58: private String classAttribute = null;
59:
60: /**
61: * <p>The name of the attribute under which we can retrieve the name
62: * this element for which rules should be created.</p>
63: */
64: private String nameAttribute = null;
65:
66: // --------------------------------------------------------- Public Methods
67:
68: /**
69: * <p>Register new rules for the specified name and class.</p>
70: *
71: * @param namespace the namespace URI of the matching element, or an
72: * empty string if the parser is not namespace aware or the element has
73: * no namespace
74: * @param name the local name if the parser is namespace aware, or just
75: * the element name otherwise
76: * @param attributes The attribute list of this element
77: */
78: public void begin(String namespace, String name,
79: Attributes attributes) throws Exception {
80:
81: // Extract the actual name and implementation class to use
82: String nameValue = attributes.getValue(nameAttribute);
83: String classValue = attributes.getValue(classAttribute);
84:
85: // Add rules for this new element
86: digester.addObjectCreate("*/" + nameValue, classValue);
87: digester.addSetProperties("*/" + nameValue);
88: digester.addRule("*/" + nameValue, new ConfigRegisterRule(
89: nameAttribute));
90:
91: }
92:
93: }
|