View Javadoc

1   /*
2    * Copyright 1999-2004 The Apache Software Foundation
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
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  
19  import org.apache.commons.digester.Rule;
20  import org.xml.sax.Attributes;
21  
22  
23  /***
24   * <p>Digester rule that will dynamically register a new set of rules
25   * for a specified element name and default implementation class.  This
26   * allows "alias" elements to be created for {@link Chain} and {@link Command}
27   * implementation classes that are commonly used.  Besides factoring out
28   * the class names to make changes easier, this also makes configuration
29   * files <strong>much</strong> easier to read and write.</p>
30   *
31   * @version $Revision: 155403 $ $Date: 2005-02-26 12:52:46 +0000 (Sat, 26 Feb 2005) $
32   */
33  
34  class ConfigDefineRule extends Rule {
35  
36  
37      // ----------------------------------------------------------- Constructors
38  
39  
40      /***
41       * <p>Construct a new instance of this rule that will in turn
42       * dynamically register appropriate rules for a new alias element.</p>
43       *
44       * @param nameAttribute Name of the attribute containing the name
45       *  of the new element for which rules should generated
46       * @param classAttribute Name of the attribute containing the
47       *  implementation class for the new chain or command
48       */
49      public ConfigDefineRule(String nameAttribute, String classAttribute) {
50          super();
51          this.nameAttribute = nameAttribute;
52          this.classAttribute = classAttribute;
53      }
54  
55  
56      // ----------------------------------------------------- Instance Variables
57  
58  
59      /***
60       * <p>The name of the attribute under which we can retrieve the
61       * fully qualified class name of the implementation class for this
62       * new element.</p>
63       */
64      private String classAttribute = null;
65  
66  
67      /***
68       * <p>The name of the attribute under which we can retrieve the name
69       * this element for which rules should be created.</p>
70       */
71      private String nameAttribute = null;
72  
73  
74      // --------------------------------------------------------- Public Methods
75  
76  
77      /***
78       * <p>Register new rules for the specified name and class.</p>
79       *
80       * @param namespace the namespace URI of the matching element, or an
81       *   empty string if the parser is not namespace aware or the element has
82       *   no namespace
83       * @param name the local name if the parser is namespace aware, or just
84       *   the element name otherwise
85       * @param attributes The attribute list of this element
86       */
87      public void begin(String namespace, String name, Attributes attributes)
88          throws Exception {
89  
90          // Extract the actual name and implementation class to use
91          String nameValue = attributes.getValue(nameAttribute);
92          String classValue = attributes.getValue(classAttribute);
93  
94          // Add rules for this new element
95          digester.addObjectCreate("*/" + nameValue, classValue);
96          digester.addSetProperties("*/" + nameValue);
97          digester.addRule("*/" + nameValue,
98                           new ConfigRegisterRule(nameAttribute));
99  
100     }
101 
102 
103 }