001package org.apache.commons.digester3.substitution;
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
022import org.apache.commons.digester3.Substitutor;
023
024import org.xml.sax.Attributes;
025
026/**
027 * Substitutor implementation that support variable replacement for both attributes and body text. The actual expansion
028 * of variables into text is delegated to {@link VariableExpander} implementations. Supports setting an expander just
029 * for body text or just for attributes. Also supported is setting no expanders for body text and for attributes.
030 * 
031 * @since 1.6
032 */
033public class VariableSubstitutor
034    extends Substitutor
035{
036
037    /**
038     * The expander to be used to expand variables in the attributes. Null when no expansion should be performed.
039     */
040    private final VariableExpander attributesExpander;
041
042    /**
043     * Attributes implementation that (lazily) performs variable substitution. Will be lazily created when needed then
044     * reused.
045     */
046    private final VariableAttributes variableAttributes;
047
048    /**
049     * The expander to be used to expand variables in the body text. Null when no expansion should be performed.
050     */
051    private final VariableExpander bodyTextExpander;
052
053    /**
054     * Constructs a Substitutor which uses the same VariableExpander for both body text and attibutes.
055     * 
056     * @param expander VariableExpander implementation, null if no substitutions are to be performed
057     */
058    public VariableSubstitutor( VariableExpander expander )
059    {
060        this( expander, expander );
061    }
062
063    /**
064     * Constructs a Substitutor.
065     * 
066     * @param attributesExpander VariableExpander implementation to be used for attributes, null if no attribute
067     *            substitutions are to be performed
068     * @param bodyTextExpander VariableExpander implementation to be used for bodyTextExpander, null if no attribute
069     *            substitutions are to be performed
070     */
071    public VariableSubstitutor( VariableExpander attributesExpander, VariableExpander bodyTextExpander )
072    {
073        this.attributesExpander = attributesExpander;
074        this.bodyTextExpander = bodyTextExpander;
075        variableAttributes = new VariableAttributes();
076    }
077
078    /**
079     * {@inheritDoc}
080     */
081    @Override
082    public Attributes substitute( Attributes attributes )
083    {
084        Attributes results = attributes;
085        if ( attributesExpander != null )
086        {
087            variableAttributes.init( attributes, attributesExpander );
088            results = variableAttributes;
089        }
090        return results;
091    }
092
093    /**
094     * {@inheritDoc}
095     */
096    @Override
097    public String substitute( String bodyText )
098    {
099        String result = bodyText;
100        if ( bodyTextExpander != null )
101        {
102            result = bodyTextExpander.expand( bodyText );
103        }
104        return result;
105    }
106
107}