001: /*
002: * Copyright 1999,2004 The Apache Software Foundation.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.apache.catalina.util;
018:
019: import org.apache.commons.digester.Digester;
020:
021: import org.xml.sax.Attributes;
022: import org.xml.sax.helpers.AttributesImpl;
023: import org.xml.sax.SAXException;
024:
025: import org.apache.tomcat.util.IntrospectionUtils;
026:
027: /**
028: * This extended digester filters out ${...} tokens to replace them with
029: * matching system properties.
030: *
031: * @author Simon Kitching
032: * @author Remy Maucherat
033: */
034: public class CatalinaDigester extends Digester {
035:
036: // ---------------------------------------------------------- Static Fields
037:
038: private static class SystemPropertySource implements
039: IntrospectionUtils.PropertySource {
040: public String getProperty(String key) {
041: return System.getProperty(key);
042: }
043: }
044:
045: protected static IntrospectionUtils.PropertySource source[] = new IntrospectionUtils.PropertySource[] { new SystemPropertySource() };
046:
047: // ---------------------------------------------------------------- Methods
048:
049: /**
050: * Invoke inherited implementation after applying variable
051: * substitution to any attribute values containing variable
052: * references.
053: */
054: public void startElement(String namespaceURI, String localName,
055: String qName, Attributes list) throws SAXException {
056: list = updateAttributes(list);
057: super .startElement(namespaceURI, localName, qName, list);
058: }
059:
060: /**
061: * Invoke inherited implementation after applying variable substitution
062: * to the character data contained in the current element.
063: */
064: public void endElement(String namespaceURI, String localName,
065: String qName) throws SAXException {
066: bodyText = updateBodyText(bodyText);
067: super .endElement(namespaceURI, localName, qName);
068: }
069:
070: /**
071: * Returns an attributes list which contains all the attributes
072: * passed in, with any text of form "${xxx}" in an attribute value
073: * replaced by the appropriate value from the system property.
074: */
075: private Attributes updateAttributes(Attributes list) {
076:
077: if (list.getLength() == 0) {
078: return list;
079: }
080:
081: AttributesImpl newAttrs = new AttributesImpl(list);
082: int nAttributes = newAttrs.getLength();
083: for (int i = 0; i < nAttributes; ++i) {
084: String value = newAttrs.getValue(i);
085: try {
086: String newValue = IntrospectionUtils.replaceProperties(
087: value, null, source);
088: if (value != newValue) {
089: newAttrs.setValue(i, newValue);
090: }
091: } catch (Exception e) {
092: // ignore - let the attribute have its original value
093: }
094: }
095:
096: return newAttrs;
097:
098: }
099:
100: /**
101: * Return a new StringBuffer containing the same contents as the
102: * input buffer, except that data of form ${varname} have been
103: * replaced by the value of that var as defined in the system property.
104: */
105: private StringBuffer updateBodyText(StringBuffer bodyText) {
106: String in = bodyText.toString();
107: String out;
108: try {
109: out = IntrospectionUtils
110: .replaceProperties(in, null, source);
111: } catch (Exception e) {
112: return bodyText; // return unchanged data
113: }
114:
115: if (out == in) {
116: // No substitutions required. Don't waste memory creating
117: // a new buffer
118: return bodyText;
119: } else {
120: return new StringBuffer(out);
121: }
122: }
123:
124: }
|