001: /* $Id: VariableSubstitutor.java 471661 2006-11-06 08:09:25Z skitching $
002: *
003: * Licensed to the Apache Software Foundation (ASF) under one or more
004: * contributor license agreements. See the NOTICE file distributed with
005: * this work for additional information regarding copyright ownership.
006: * The ASF licenses this file to You under the Apache License, Version 2.0
007: * (the "License"); you may not use this file except in compliance with
008: * the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS,
014: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: * See the License for the specific language governing permissions and
016: * limitations under the License.
017: */
018:
019: package org.apache.commons.digester.substitution;
020:
021: import org.apache.commons.digester.Substitutor;
022:
023: import org.xml.sax.Attributes;
024:
025: /**
026: * Substitutor implementation that support variable replacement
027: * for both attributes and body text.
028: * The actual expansion of variables into text is delegated to {@link VariableExpander}
029: * implementations.
030: * Supports setting an expander just for body text or just for attributes.
031: * Also supported is setting no expanders for body text and for attributes.
032: *
033: * @since 1.6
034: */
035: public class VariableSubstitutor extends Substitutor {
036:
037: /**
038: * The expander to be used to expand variables in the attributes.
039: * Null when no expansion should be performed.
040: */
041: private VariableExpander attributesExpander;
042:
043: /**
044: * Attributes implementation that (lazily) performs variable substitution.
045: * Will be lazily created when needed then reused.
046: */
047: private VariableAttributes variableAttributes;
048:
049: /**
050: * The expander to be used to expand variables in the body text.
051: * Null when no expansion should be performed.
052: */
053: private VariableExpander bodyTextExpander;
054:
055: /**
056: * Constructs a Substitutor which uses the same VariableExpander for both
057: * body text and attibutes.
058: * @param expander VariableExpander implementation,
059: * null if no substitutions are to be performed
060: */
061: public VariableSubstitutor(VariableExpander expander) {
062: this (expander, expander);
063: }
064:
065: /**
066: * Constructs a Substitutor.
067: * @param attributesExpander VariableExpander implementation to be used for attributes,
068: * null if no attribute substitutions are to be performed
069: * @param bodyTextExpander VariableExpander implementation to be used for bodyTextExpander,
070: * null if no attribute substitutions are to be performed
071: */
072: public VariableSubstitutor(VariableExpander attributesExpander,
073: VariableExpander bodyTextExpander) {
074: this .attributesExpander = attributesExpander;
075: this .bodyTextExpander = bodyTextExpander;
076: variableAttributes = new VariableAttributes();
077: }
078:
079: /**
080: * Substitutes the attributes (before they are passed to the
081: * <code>Rule</code> implementations's)
082: */
083: public Attributes substitute(Attributes attributes) {
084: Attributes results = attributes;
085: if (attributesExpander != null) {
086: variableAttributes.init(attributes, attributesExpander);
087: results = variableAttributes;
088: }
089: return results;
090: }
091:
092: /**
093: * Substitutes for the body text.
094: * This method may substitute values into the body text of the
095: * elements that Digester parses.
096: *
097: * @param bodyText the body text (as passed to <code>Digester</code>)
098: * @return the body text to be passed to the <code>Rule</code> implementations
099: */
100: public String substitute(String bodyText) {
101: String result = bodyText;
102: if (bodyTextExpander != null) {
103: result = bodyTextExpander.expand(bodyText);
104: }
105: return result;
106: }
107: }
|