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