/* $Id: Substitutor.java,v 1.9 2004/05/10 06:52:50 skitching Exp $
 *
 * Copyright 2003-2004 The Apache Software Foundation.
 * 
 * Licensed 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.digester;

import org.xml.sax.Attributes;

/**
 * <p>(Logical) Interface for substitution strategies.
 * (It happens to be implemented as a Java abstract class to allow
 * future additions to be made without breaking backwards compatibility.)
 * </p>
 * <p>
 * Usage: When {@link Digester#setSubstitutor} is set, <code>Digester</code>
 * calls the methods in this interface to create substitute values which will
 * be passed into the Rule implementations.
 * Of course, it is perfectly acceptable for implementations not to make 
 * substitutions and simply return the inputs.
 * </p>
 * <p>Different strategies are supported for attributes and body text.</p>
 *
 * @since 1.6 
 */
public abstract class Substitutor {
    
    /**
     * <p>Substitutes the attributes (before they are passed to the 
     * <code>Rule</code> implementations's).</p>
     *
     * <p><code>Digester</code> will only call this method a second time 
     * once the original <code>Attributes</code> instance can be safely reused. 
     * The implementation is therefore free to reuse the same <code>Attributes</code> instance
     * for all calls.</p>
     *
     * @param attributes the <code>Attributes</code> passed into <code>Digester</code> by the SAX parser, 
     * not null (but may be empty)
     * @return <code>Attributes</code> to be passed to the <code>Rule</code> implementations. 
     * This method may pass back the Attributes passed in.
     * Not null but possibly empty.
     */
    public abstract Attributes substitute(Attributes attributes);
    
    /**
     * Substitutes for the body text.
     * This method may substitute values into the body text of the
     * elements that Digester parses.
     *
     * @param bodyText the body text (as passed to <code>Digester</code>)
     * @return the body text to be passed to the <code>Rule</code> implementations
     */
    public abstract String substitute(String bodyText);
}
