| /* $Id: MultiVariableExpander.java,v 1.6 2004/05/10 06:46:30 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.substitution; |
| |
| import java.util.Map; |
| import java.util.ArrayList; |
| |
| /** |
| * <p>Expands variable references from multiple sources.</p> |
| * |
| * @since 1.6 |
| */ |
| |
| public class MultiVariableExpander implements VariableExpander { |
| private int nEntries = 0; |
| private ArrayList markers = new ArrayList(2); |
| private ArrayList sources = new ArrayList(2); |
| |
| public MultiVariableExpander() { |
| } |
| |
| public void addSource(String marker, Map source) { |
| ++nEntries; |
| markers.add(marker); |
| sources.add(source); |
| } |
| |
| /* |
| * Expands any variable declarations using any of the known |
| * variable marker strings. |
| * |
| * @throws IllegalArgumentException if the input param references |
| * a variable which is not known to the specified source. |
| */ |
| public String expand(String param) { |
| for(int i=0; i<nEntries; ++i) { |
| param = expand( |
| param, |
| (String) markers.get(i), |
| (Map) sources.get(i)); |
| } |
| return param; |
| } |
| |
| /** |
| * Replace any occurrences within the string of the form |
| * "marker{key}" with the value from source[key]. |
| * <p> |
| * Commonly, the variable marker is "$", in which case variables |
| * are indicated by ${key} in the string. |
| * <p> |
| * Returns the string after performing all substitutions. |
| * <p> |
| * If no substitutions were made, the input string object is |
| * returned (not a copy). |
| * |
| * @throws IllegalArgumentException if the input param references |
| * a variable which is not known to the specified source. |
| */ |
| public String expand(String str, String marker, Map source) { |
| String startMark = marker + "{"; |
| int markLen = startMark.length(); |
| |
| int index = 0; |
| for(;;) |
| { |
| index = str.indexOf(startMark, index); |
| if (index == -1) |
| { |
| return str; |
| } |
| |
| int startIndex = index + markLen; |
| if (startIndex > str.length()) |
| { |
| throw new IllegalArgumentException( |
| "var expression starts at end of string"); |
| } |
| |
| int endIndex = str.indexOf("}", index + markLen); |
| if (endIndex == -1) |
| { |
| throw new IllegalArgumentException( |
| "var expression starts but does not end"); |
| } |
| |
| String key = str.substring(index+markLen, endIndex); |
| Object value = source.get(key); |
| if (value == null) { |
| throw new IllegalArgumentException( |
| "parameter [" + key + "] is not defined."); |
| } |
| String varValue = value.toString(); |
| |
| str = str.substring(0, index) + varValue + str.substring(endIndex+1); |
| index += varValue.length(); |
| } |
| } |
| |
| } |