001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.commons.chain.config; 018 019 020 import org.apache.commons.digester.Digester; 021 import org.apache.commons.digester.RuleSetBase; 022 023 024 /** 025 * <p>Digester <code>RuleSet</code> for configuring <em>Chain of 026 * Responsibility</em> command chains, and adding them to an appropriate 027 * {@link org.apache.commons.chain.Catalog}. The following properties 028 * may be configured prior to executing the <code>addRuleInstance()</code> 029 * method in order to influence the rules that get added, with default 030 * values in square brackets:</p> 031 * <ul> 032 * <li><strong>catalogClass</strong> -- Fully qualified name of the 033 * implementation class used to create new 034 * {@link org.apache.commons.chain.Catalog} instances. 035 * If not specified, the default value is 036 * <code>org.apache.commons.chain.impl.CatalogBsae</code>.</li> 037 * <li><strong>catalogElement</strong> -- Name of the XML element representing 038 * the addition of a {@link org.apache.commons.chain.Catalog}. 039 * Any such catalog that is created will be registered with the 040 * {@link org.apache.commons.chain.CatalogFactory} instance for our 041 * application, under the name specified by the <code>nameAttribute</code> 042 * attribute (if present), or as the default {@link org.apache.commons.chain.Catalog}. 043 * If not specified, the default value is <code>catalog</code>.</li> 044 * <li><strong>chainClass</strong> -- Fully qualified name of the implementation 045 * class used to create new {@link org.apache.commons.chain.Chain} instances. 046 * If not specified, the default value is 047 * <code>org.apache.commons.chain.impl.ChainBase</code>. 048 * </li> 049 * <li><strong>chainElement</strong> -- Name of the XML element representing 050 * the addition of a {@link org.apache.commons.chain.Chain}. A chain 051 * element has the same functionality as a command element, except that 052 * it defaults the implementation class to 053 * <code>org.apache.commons.chain.impl.ChainBase</code>. [chain]</li> 054 * <li><strong>classAttribute</strong> -- Attribute on a chain (optional) or 055 * command (required) element that specifies the fully qualified class 056 * name of the implementation class that should be instantiated. 057 * [className]</li> 058 * <li><strong>commandElement</strong> -- Name of the XML element 059 * representing the addition of a {@link org.apache.commons.chain.Command}. 060 * An implementation class name must be provided on the attribute named by the 061 * <code>classAttribute</code> property. [command]</li> 062 * <li><strong>defineElement</strong> -- Name of the XML element 063 * that associates the element specified by the <code>nameAttribute</code> 064 * attributes with a {@link org.apache.commons.chain.Command} or 065 * {@link org.apache.commons.chain.Chain} implementation class 066 * named by the <code>classAttribute</code> attribute. [define]</li> 067 * <li><strong>nameAttribute</strong> -- Attribute on an outermost chain or 068 * command element that will be used to register this command with the 069 * associated {@link org.apache.commons.chain.Catalog} instance on the stack. 070 * [name]</li> 071 * <li><strong>namespaceURI</strong> -- The XML namespace URI with which these 072 * rules will be associated, or <code>null</code> for no namespace. 073 * [null]</li> 074 * </ul> 075 * 076 * @author Craig R. McClanahan 077 * @version $Revision: 480477 $ $Date: 2006-11-29 08:34:52 +0000 (Wed, 29 Nov 2006) $ 078 */ 079 080 public class ConfigRuleSet extends RuleSetBase { 081 082 083 // ----------------------------------------------------- Instance Variables 084 085 086 private String catalogClass = "org.apache.commons.chain.impl.CatalogBase"; 087 private String catalogElement = "catalog"; 088 private String chainClass = "org.apache.commons.chain.impl.ChainBase"; 089 private String chainElement = "chain"; 090 private String classAttribute = "className"; 091 private String commandElement = "command"; 092 private String defineElement = "define"; 093 private String nameAttribute = "name"; 094 095 096 // ------------------------------------------------------------- Properties 097 098 099 /** 100 * <p>Return the fully qualified {@link org.apache.commons.chain.Catalog} 101 * implementation class.</p> 102 * @return The Catalog's class name. 103 */ 104 public String getCatalogClass() { 105 return (this.catalogClass); 106 } 107 108 109 /** 110 * <p>Set the fully qualified {@link org.apache.commons.chain.Catalog} 111 * implementation class.</p> 112 * 113 * @param catalogClass The new {@link org.apache.commons.chain.Catalog} 114 * implementation class 115 */ 116 public void setCatalogClass(String catalogClass) { 117 this.catalogClass = catalogClass; 118 } 119 120 121 /** 122 * <p>Return the element name of a catalog element.</p> 123 * @return The element name of a catalog element. 124 */ 125 public String getCatalogElement() { 126 return (this.catalogElement); 127 } 128 129 130 /** 131 * <p>Set the element name of a catalog element.</p> 132 * 133 * @param catalogElement The new element name 134 */ 135 public void setCatalogElement(String catalogElement) { 136 this.catalogElement = catalogElement; 137 } 138 139 140 /** 141 * <p>Return the fully qualified {@link org.apache.commons.chain.Chain} 142 * implementation class.</p> 143 * @return The Chain's class name. 144 */ 145 public String getChainClass() { 146 return (this.chainClass); 147 } 148 149 150 /** 151 * <p>Set the fully qualified {@link org.apache.commons.chain.Chain} 152 * implementation class.</p> 153 * 154 * @param chainClass The new {@link org.apache.commons.chain.Chain} 155 * implementation class 156 */ 157 public void setChainClass(String chainClass) { 158 this.chainClass = chainClass; 159 } 160 161 162 /** 163 * <p>Return the element name of a chain element.</p> 164 * @return The element name of a catalog element. 165 */ 166 public String getChainElement() { 167 return (this.chainElement); 168 } 169 170 171 /** 172 * <p>Set the element name of a chain element.</p> 173 * 174 * @param chainElement The new element name 175 */ 176 public void setChainElement(String chainElement) { 177 this.chainElement = chainElement; 178 } 179 180 181 /** 182 * <p>Return the attribute name of a class attribute.</p> 183 * @return The attribute name of a class attribute. 184 */ 185 public String getClassAttribute() { 186 return (this.classAttribute); 187 } 188 189 190 /** 191 * <p>Set the attribute name of a class attribute.</p> 192 * 193 * @param classAttribute The new attribute name 194 */ 195 public void setClassAttribute(String classAttribute) { 196 this.classAttribute = classAttribute; 197 } 198 199 200 /** 201 * <p>Return the element name of a command element.</p> 202 * @return The element name of a command element. 203 */ 204 public String getCommandElement() { 205 return (this.commandElement); 206 } 207 208 209 /** 210 * <p>Set the element name of a command element.</p> 211 * 212 * @param commandElement The new element name 213 */ 214 public void setCommandElement(String commandElement) { 215 this.commandElement = commandElement; 216 } 217 218 219 /** 220 * <p>Return the element name of a define element.</p> 221 * @return The element name of a define element. 222 */ 223 public String getDefineElement() { 224 return (this.defineElement); 225 } 226 227 228 /** 229 * <p>Set the element name of a define element.</p> 230 * 231 * @param defineElement The new element name 232 */ 233 public void setDefineElement(String defineElement) { 234 this.defineElement = defineElement; 235 } 236 237 238 /** 239 * <p>Return the attribute name of a name attribute.</p> 240 * @return The attribute name of an attribute element. 241 */ 242 public String getNameAttribute() { 243 return (this.nameAttribute); 244 } 245 246 247 /** 248 * <p>Set the attribute name of a name attribute.</p> 249 * 250 * @param nameAttribute The new attribute name 251 */ 252 public void setNameAttribute(String nameAttribute) { 253 this.nameAttribute = nameAttribute; 254 } 255 256 257 // --------------------------------------------------------- Public Methods 258 259 260 /** 261 * <p>Add the set of Rule instances defined in this RuleSet to the 262 * specified <code>Digester</code> instance, associating them with 263 * our namespace URI (if any). This method should only be called 264 * by a Digester instance.</p> 265 * 266 * @param digester Digester instance to which the new Rule instances 267 * should be added. 268 */ 269 public void addRuleInstances(Digester digester) { 270 271 // Add rules for a catalog element 272 digester.addRule("*/" + getCatalogElement(), 273 new ConfigCatalogRule(nameAttribute, catalogClass)); 274 digester.addSetProperties("*/" + getCatalogElement()); 275 276 // Add rules for a chain element 277 digester.addObjectCreate("*/" + getChainElement(), 278 getChainClass(), 279 getClassAttribute()); 280 digester.addSetProperties("*/" + getChainElement()); 281 digester.addRule("*/" + getChainElement(), 282 new ConfigRegisterRule(nameAttribute)); 283 284 // Add rules for a command element 285 digester.addObjectCreate("*/" + getCommandElement(), 286 null, 287 getClassAttribute()); 288 digester.addSetProperties("*/" + getCommandElement()); 289 digester.addRule("*/" + getCommandElement(), 290 new ConfigRegisterRule(nameAttribute)); 291 292 // Add rules for a define element 293 digester.addRule("*/" + getDefineElement(), 294 new ConfigDefineRule(getNameAttribute(), 295 getClassAttribute())); 296 297 } 298 299 300 }