/* $Id$
 *
 * 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.digester3.rules;

import org.apache.commons.digester3.Digester;
import org.apache.commons.digester3.Rule;
import org.apache.commons.digester3.spi.Rules;

/**
 * {@code AbstractRuleImpl} provides basic services for {@code Rules} implementations.
 *
 * Extending this class should make it easier to create a {@codeRules} implementation.
 * 
 * {@code AbstractRuleImpl} manages the {@code Digester}
 * If the subclass overrides {@link #registerRule} (rather than {@link #add}),
 * then the <code>Digester</code> and <code>namespaceURI</code> of the <code>Rule</code>
 * will be set correctly before it is passed to <code>registerRule</code>.
 * The subclass can then perform whatever it needs to do to register the rule.</p>
 */
abstract class AbstractRulesImpl implements Rules {

    /**
     * Digester using this {@code Rules} implementation.
     */
    private Digester digester;

    /**
     * {@inheritDoc}
     */
    public void add(String pattern, Rule rule) {
        if (this.digester != null && rule != null) {
            rule.setDigester(this.digester);
        }
        this.registerRule(pattern, rule);
    }

    /** 
     * Register rule at given pattern.
     * The the Digester and namespaceURI properties of the given <code>Rule</code>
     * can be assumed to have been set properly before this method is called.
     *
     * @param pattern Nesting pattern to be matched for this Rule
     * @param rule Rule instance to be registered
     */ 
    protected abstract void registerRule(String pattern, Rule rule);

    /**
     * {@inheritDoc}
     */
    public void setDigester(Digester digester) {
        this.digester = digester;
        for (Rule rule : this.rules()) {
            rule.setDigester(digester);
        }
    }

}

/* $Id$
 *
 * 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.digester3.rules;

import org.apache.commons.digester3.Digester;
import org.apache.commons.digester3.Rule;
import org.apache.commons.digester3.spi.Rules;

/**
 * {@code AbstractRuleImpl} provides basic services for {@code Rules} implementations.
 *
 * Extending this class should make it easier to create a {@codeRules} implementation.
 * 
 * {@code AbstractRuleImpl} manages the {@code Digester}
 * If the subclass overrides {@link #registerRule} (rather than {@link #add}),
 * then the <code>Digester</code> and <code>namespaceURI</code> of the <code>Rule</code>
 * will be set correctly before it is passed to <code>registerRule</code>.
 * The subclass can then perform whatever it needs to do to register the rule.</p>
 */
abstract class AbstractRulesImpl implements Rules {

    /**
     * Digester using this {@code Rules} implementation.
     */
    private Digester digester;

    /**
     * {@inheritDoc}
     */
    public final void add(String pattern, Rule rule) {
        if (this.digester != null && rule != null) {
            rule.setDigester(this.digester);
        }
        this.registerRule(pattern, rule);
    }

    /** 
     * Register rule at given pattern.
     * The the Digester and namespaceURI properties of the given <code>Rule</code>
     * can be assumed to have been set properly before this method is called.
     *
     * @param pattern Nesting pattern to be matched for this Rule
     * @param rule Rule instance to be registered
     */ 
    protected abstract void registerRule(String pattern, Rule rule);

    /**
     * {@inheritDoc}
     */
    public void setDigester(Digester digester) {
        this.digester = digester;
        for (Rule rule : this.rules()) {
            rule.setDigester(digester);
        }
    }

}

add method made final