blob: 6ebc99c0e99e862408a818c59810c58e0ccef439 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.chain2.config.xml;
import org.apache.commons.digester3.Rule;
import org.xml.sax.Attributes;
/**
* <p>Digester rule that will dynamically register a new set of rules
* for a specified element name and default implementation class. This
* allows "alias" elements to be created for {@link org.apache.commons.chain2.Chain}
* and {@link org.apache.commons.chain2.Command}
* implementation classes that are commonly used. Besides factoring out
* the class names to make changes easier, this also makes configuration
* files <strong>much</strong> easier to read and write.</p>
*
*/
class ConfigDefineRule extends Rule {
// ----------------------------------------------------------- Constructors
/**
* <p>Construct a new instance of this rule that will in turn
* dynamically register appropriate rules for a new alias element.</p>
*
* @param nameAttribute Name of the attribute containing the name
* of the new element for which rules should generated
* @param classAttribute Name of the attribute containing the
* implementation class for the new chain or command
*/
public ConfigDefineRule(String nameAttribute, String classAttribute) {
this.nameAttribute = nameAttribute;
this.classAttribute = classAttribute;
}
// ----------------------------------------------------- Instance Variables
/**
* <p>The name of the attribute under which we can retrieve the
* fully qualified class name of the implementation class for this
* new element.</p>
*/
private final String classAttribute;
/**
* <p>The name of the attribute under which we can retrieve the name
* this element for which rules should be created.</p>
*/
private final String nameAttribute;
// --------------------------------------------------------- Public Methods
/**
* <p>Register new rules for the specified name and class.</p>
*
* @param namespace the namespace URI of the matching element, or an
* empty string if the parser is not namespace aware or the element has
* no namespace
* @param name the local name if the parser is namespace aware, or just
* the element name otherwise
* @param attributes The attribute list of this element
*/
public void begin(String namespace, String name, Attributes attributes) throws Exception {
// Extract the actual name and implementation class to use
String nameValue = attributes.getValue(nameAttribute);
String classValue = attributes.getValue(classAttribute);
// Add rules for this new element
getDigester().addObjectCreate("*/" + nameValue, classValue);
getDigester().addSetProperties("*/" + nameValue);
getDigester().addRule("*/" + nameValue, new ConfigRegisterRule(nameAttribute));
}
}