001package org.apache.commons.digester3;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 *   http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022
023/**
024 * <p>
025 * <code>AbstractRuleImpl</code> provides basic services for <code>Rules</code> implementations. Extending this class
026 * should make it easier to create a <code>Rules</code> implementation.
027 * </p>
028 * <p>
029 * <code>AbstractRuleImpl</code> manages the <code>Digester</code> and <code>namespaceUri</code> properties. If the
030 * subclass overrides {@link #registerRule} (rather than {@link #add}), then the <code>Digester</code> and
031 * <code>namespaceURI</code> of the <code>Rule</code> will be set correctly before it is passed to
032 * <code>registerRule</code>. The subclass can then perform whatever it needs to do to register the rule.
033 * </p>
034 * 
035 * @since 1.5
036 */
037public abstract class AbstractRulesImpl
038    implements Rules
039{
040
041    // ------------------------------------------------------------- Fields
042
043    /** Digester using this <code>Rules</code> implementation */
044    private Digester digester;
045
046    /** Namespace uri to assoicate with subsequent <code>Rule</code>'s */
047    private String namespaceURI;
048
049    // ------------------------------------------------------------- Properties
050
051    /**
052     * {@inheritDoc}
053     */
054    public Digester getDigester()
055    {
056        return digester;
057    }
058
059    /**
060     * {@inheritDoc}
061     */
062    public void setDigester( Digester digester )
063    {
064        this.digester = digester;
065    }
066
067    /**
068     * {@inheritDoc}
069     */
070    public String getNamespaceURI()
071    {
072        return namespaceURI;
073    }
074
075    /**
076     * {@inheritDoc}
077     */
078    public void setNamespaceURI( String namespaceURI )
079    {
080        this.namespaceURI = namespaceURI;
081    }
082
083    // --------------------------------------------------------- Public Methods
084
085    /**
086     * {@inheritDoc}
087     */
088    public final void add( String pattern, Rule rule )
089    {
090        // set up rule
091        if ( this.digester != null )
092        {
093            rule.setDigester( this.digester );
094        }
095
096        if ( this.namespaceURI != null )
097        {
098            rule.setNamespaceURI( this.namespaceURI );
099        }
100
101        registerRule( pattern, rule );
102    }
103
104    /**
105     * Register rule at given pattern. The the Digester and namespaceURI properties of the given <code>Rule</code> can
106     * be assumed to have been set properly before this method is called.
107     * 
108     * @param pattern Nesting pattern to be matched for this Rule
109     * @param rule Rule instance to be registered
110     */
111    protected abstract void registerRule( String pattern, Rule rule );
112
113}