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 import org.apache.commons.digester.Digester; 20 import org.apache.commons.digester.RuleSetBase; 21 22 /** 23 * Digester {@code RuleSet} for configuring <em>Chain of 24 * Responsibility</em> command chains, and adding them to an appropriate 25 * {@link org.apache.commons.chain.Catalog}. The following properties 26 * may be configured prior to executing the {@code addRuleInstance()} 27 * method in order to influence the rules that get added, with default 28 * values in square brackets: 29 * <ul> 30 * <li><strong>catalogClass</strong> -- Fully qualified name of the 31 * implementation class used to create new 32 * {@link org.apache.commons.chain.Catalog} instances. 33 * If not specified, the default value is 34 * {@code org.apache.commons.chain.impl.CatalogBase}.</li> 35 * <li><strong>catalogElement</strong> -- Name of the XML element representing 36 * the addition of a {@link org.apache.commons.chain.Catalog}. 37 * Any such catalog that is created will be registered with the 38 * {@link org.apache.commons.chain.CatalogFactory} instance for our 39 * application, under the name specified by the {@code nameAttribute} 40 * attribute (if present), or as the default {@link org.apache.commons.chain.Catalog}. 41 * If not specified, the default value is {@code catalog}.</li> 42 * <li><strong>chainClass</strong> -- Fully qualified name of the implementation 43 * class used to create new {@link org.apache.commons.chain.Chain} instances. 44 * If not specified, the default value is 45 * {@code org.apache.commons.chain.impl.ChainBase}. 46 * </li> 47 * <li><strong>chainElement</strong> -- Name of the XML element representing 48 * the addition of a {@link org.apache.commons.chain.Chain}. A chain 49 * element has the same functionality as a command element, except that 50 * it defaults the implementation class to 51 * {@code org.apache.commons.chain.impl.ChainBase}. [chain]</li> 52 * <li><strong>classAttribute</strong> -- Attribute on a chain (optional) or 53 * command (required) element that specifies the fully qualified class 54 * name of the implementation class that should be instantiated. 55 * [className]</li> 56 * <li><strong>commandElement</strong> -- Name of the XML element 57 * representing the addition of a {@link org.apache.commons.chain.Command}. 58 * An implementation class name must be provided on the attribute named by the 59 * {@code classAttribute} property. [command]</li> 60 * <li><strong>defineElement</strong> -- Name of the XML element 61 * that associates the element specified by the {@code nameAttribute} 62 * attributes with a {@link org.apache.commons.chain.Command} or 63 * {@link org.apache.commons.chain.Chain} implementation class 64 * named by the {@code classAttribute} attribute. [define]</li> 65 * <li><strong>nameAttribute</strong> -- Attribute on an outermost chain or 66 * command element that will be used to register this command with the 67 * associated {@link org.apache.commons.chain.Catalog} instance on the stack. 68 * [name]</li> 69 * <li><strong>namespaceURI</strong> -- The XML namespace URI with which these 70 * rules will be associated, or {@code null} for no namespace. 71 * [null]</li> 72 * </ul> 73 * 74 * @author Craig R. McClanahan 75 * @version $Revision$ $Date$ 76 */ 77 public class ConfigRuleSet extends RuleSetBase { 78 79 // ----------------------------------------------------- Instance Variables 80 81 private String catalogClass = "org.apache.commons.chain.impl.CatalogBase"; 82 private String catalogElement = "catalog"; 83 private String chainClass = "org.apache.commons.chain.impl.ChainBase"; 84 private String chainElement = "chain"; 85 private String classAttribute = "className"; 86 private String commandElement = "command"; 87 private String defineElement = "define"; 88 private String nameAttribute = "name"; 89 90 // ----------------------------------------------------------- Constructors 91 92 /** 93 * The Default-Constructor for this class. 94 */ 95 public ConfigRuleSet() { 96 } 97 98 // ------------------------------------------------------------- Properties 99 100 /** 101 * Return the fully qualified {@link org.apache.commons.chain.Catalog} 102 * implementation class. 103 * 104 * @return The Catalog's class name. 105 */ 106 public String getCatalogClass() { 107 return this.catalogClass; 108 } 109 110 /** 111 * Set the fully qualified {@link org.apache.commons.chain.Catalog} 112 * implementation class. 113 * 114 * @param catalogClass The new {@link org.apache.commons.chain.Catalog} 115 * implementation class 116 */ 117 public void setCatalogClass(String catalogClass) { 118 this.catalogClass = catalogClass; 119 } 120 121 /** 122 * Return the element name of a catalog element. 123 * 124 * @return The element name of a catalog element. 125 */ 126 public String getCatalogElement() { 127 return this.catalogElement; 128 } 129 130 /** 131 * Set the element name of a catalog element. 132 * 133 * @param catalogElement The new element name 134 */ 135 public void setCatalogElement(String catalogElement) { 136 this.catalogElement = catalogElement; 137 } 138 139 /** 140 * Return the fully qualified {@link org.apache.commons.chain.Chain} 141 * implementation class. 142 * 143 * @return The Chain's class name. 144 */ 145 public String getChainClass() { 146 return this.chainClass; 147 } 148 149 /** 150 * Set the fully qualified {@link org.apache.commons.chain.Chain} 151 * implementation class. 152 * 153 * @param chainClass The new {@link org.apache.commons.chain.Chain} 154 * implementation class 155 */ 156 public void setChainClass(String chainClass) { 157 this.chainClass = chainClass; 158 } 159 160 /** 161 * Return the element name of a chain element. 162 * 163 * @return The element name of a catalog element. 164 */ 165 public String getChainElement() { 166 return this.chainElement; 167 } 168 169 /** 170 * Set the element name of a chain element. 171 * 172 * @param chainElement The new element name 173 */ 174 public void setChainElement(String chainElement) { 175 this.chainElement = chainElement; 176 } 177 178 /** 179 * Return the attribute name of a class attribute. 180 * 181 * @return The attribute name of a class attribute. 182 */ 183 public String getClassAttribute() { 184 return this.classAttribute; 185 } 186 187 /** 188 * Set the attribute name of a class attribute. 189 * 190 * @param classAttribute The new attribute name 191 */ 192 public void setClassAttribute(String classAttribute) { 193 this.classAttribute = classAttribute; 194 } 195 196 /** 197 * Return the element name of a command element. 198 * 199 * @return The element name of a command element. 200 */ 201 public String getCommandElement() { 202 return this.commandElement; 203 } 204 205 /** 206 * Set the element name of a command element. 207 * 208 * @param commandElement The new element name 209 */ 210 public void setCommandElement(String commandElement) { 211 this.commandElement = commandElement; 212 } 213 214 /** 215 * Return the element name of a define element. 216 * 217 * @return The element name of a define element. 218 */ 219 public String getDefineElement() { 220 return this.defineElement; 221 } 222 223 /** 224 * Set the element name of a define element. 225 * 226 * @param defineElement The new element name 227 */ 228 public void setDefineElement(String defineElement) { 229 this.defineElement = defineElement; 230 } 231 232 /** 233 * Return the attribute name of a name attribute. 234 * 235 * @return The attribute name of an attribute element. 236 */ 237 public String getNameAttribute() { 238 return this.nameAttribute; 239 } 240 241 /** 242 * Set the attribute name of a name attribute. 243 * 244 * @param nameAttribute The new attribute name 245 */ 246 public void setNameAttribute(String nameAttribute) { 247 this.nameAttribute = nameAttribute; 248 } 249 250 // --------------------------------------------------------- Public Methods 251 252 /** 253 * Add the set of Rule instances defined in this RuleSet to the 254 * specified {@code Digester} instance, associating them with 255 * our namespace URI (if any). This method should only be called 256 * by a Digester instance. 257 * 258 * @param digester Digester instance to which the new Rule instances 259 * should be added. 260 */ 261 @Override 262 public void addRuleInstances(Digester digester) { 263 // Add rules for a catalog element 264 digester.addRule("*/" + getCatalogElement(), 265 new ConfigCatalogRule(nameAttribute, catalogClass)); 266 digester.addSetProperties("*/" + getCatalogElement()); 267 268 // Add rules for a chain element 269 digester.addObjectCreate("*/" + getChainElement(), 270 getChainClass(), 271 getClassAttribute()); 272 digester.addSetProperties("*/" + getChainElement()); 273 digester.addRule("*/" + getChainElement(), 274 new ConfigRegisterRule(nameAttribute)); 275 276 // Add rules for a command element 277 digester.addObjectCreate("*/" + getCommandElement(), 278 null, 279 getClassAttribute()); 280 digester.addSetProperties("*/" + getCommandElement()); 281 digester.addRule("*/" + getCommandElement(), 282 new ConfigRegisterRule(nameAttribute)); 283 284 // Add rules for a define element 285 digester.addRule("*/" + getDefineElement(), 286 new ConfigDefineRule(getNameAttribute(), 287 getClassAttribute())); 288 } 289 }