/*
 * 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>
 *
 * @version $Id: ConfigDefineRule.java 1363305 2012-07-19 11:42:53Z simonetripodi $
 */
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) {
        super();
        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));
    }

}
