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.chain.Catalog; 21 import org.apache.commons.chain.CatalogFactory; 22 import org.apache.commons.digester.Rule; 23 import org.xml.sax.Attributes; 24 25 26 /** 27 * <p>Digester rule that will cause the top-most element on the Digester 28 * stack (if it is a {@link Catalog} to be registered with the 29 * {@link CatalogFactory} instance for our application. If the attribute 30 * specified to our constructor has a value, that will be used as the name 31 * under which to register this {@link Catalog}. Otherwise, this will 32 * become the default {@link Catalog} for this application.</p> 33 * 34 * @author Craig R. McClanahan 35 * @version $Revision: 480477 $ $Date: 2006-11-29 08:34:52 +0000 (Wed, 29 Nov 2006) $ 36 */ 37 class ConfigCatalogRule extends Rule { 38 39 40 // ----------------------------------------------------------- Constructors 41 42 43 /** 44 * <p>Construct a new instance of this rule that looks for an attribute 45 * with the specified name.</p> 46 * 47 * @param nameAttribute Name of the attribute containing the name under 48 * which this command should be registered 49 * @param catalogClass Name of the implementation class for newly 50 * created {@link Catalog} instances 51 */ 52 public ConfigCatalogRule(String nameAttribute, String catalogClass) { 53 super(); 54 this.nameAttribute = nameAttribute; 55 this.catalogClass = catalogClass; 56 } 57 58 59 // ----------------------------------------------------- Instance Variables 60 61 62 /** 63 * <p>The fully qualified class name of a {@link Catalog} class to use for 64 * instantiating new instances.</p> 65 */ 66 private String catalogClass = null; 67 68 69 /** 70 * <p>The name of the attribute under which we can retrieve the name 71 * this catalog should be registered with (if any).</p> 72 */ 73 private String nameAttribute = null; 74 75 76 // --------------------------------------------------------- Public Methods 77 78 79 /** 80 * <p>Retrieve or create a {@link Catalog} with the name specified by 81 * the <code>nameAttribute</code> attribute, or the default {@link Catalog} 82 * if there is no such attribute defined. Push it onto the top of the 83 * stack.</p> 84 * 85 * @param namespace the namespace URI of the matching element, or an 86 * empty string if the parser is not namespace aware or the element has 87 * no namespace 88 * @param name the local name if the parser is namespace aware, or just 89 * the element name otherwise 90 * @param attributes The attribute list of this element 91 */ 92 public void begin(String namespace, String name, Attributes attributes) 93 throws Exception { 94 95 // Retrieve any current Catalog with the specified name 96 Catalog catalog = null; 97 CatalogFactory factory = CatalogFactory.getInstance(); 98 String nameValue = attributes.getValue(nameAttribute); 99 if (nameValue == null) { 100 catalog = factory.getCatalog(); 101 } else { 102 catalog = factory.getCatalog(nameValue); 103 } 104 105 // Create and register a new Catalog instance if necessary 106 if (catalog == null) { 107 Class clazz = digester.getClassLoader().loadClass(catalogClass); 108 catalog = (Catalog) clazz.newInstance(); 109 if (nameValue == null) { 110 factory.setCatalog(catalog); 111 } else { 112 factory.addCatalog(nameValue, catalog); 113 } 114 } 115 116 // Push this Catalog onto the top of the stack 117 digester.push(catalog); 118 119 } 120 121 122 }