blob: 8c8741bbcff4bc659c6f133824214d65ae440d3b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.forrest.conf;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.StringTokenizer;
import org.apache.commons.lang.StringUtils;
/**
* Class for accessing properties in a properties file roughly compatible with
* Ant property files, where ${name} is replaced with the value of the property
* if declared beforehand.
*/
public class AntProperties extends Properties
{
public AntProperties() {
super();
}
public AntProperties(Properties arg0) {
super(arg0);
putAllProperties(arg0);
}
public synchronized void load(InputStream arg0) throws IOException {
super.load(arg0);
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(arg0));
String currentLine, name, value;
int splitIndex;
while ((currentLine = in.readLine()) != null) {
// # == comment
if (!currentLine.startsWith("#")
&& !(currentLine.trim().length() == 0)) {
splitIndex = currentLine.indexOf('=');
name = currentLine.substring(0, splitIndex).trim();
value = currentLine.substring(splitIndex + 1).trim();
this.put(name, value);
}
}
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {}
}
}
}
public synchronized Object put(Object name, Object value) {
//if the property is already there don't overwrite, as in Ant
//properties defined first take precedence
if (!super.containsKey(name)) {
String[] names = StringUtils.substringsBetween(value.toString(), "${", "}");
if ( names != null ){
for ( int i = 0; i < names.length; i++ ) {
String currentName = names[i];
String valueToSearchFor = "${" + currentName + "}";
String valueToReplaceWith = (String) super.get(currentName);
value = StringUtils.replace(value.toString(), valueToSearchFor,
valueToReplaceWith);
}
}
return super.put(name, value);
}
return null;
}
public synchronized void putAllProperties(Map arg0) {
Iterator i = arg0.entrySet().iterator();
while (i.hasNext()) {
Map.Entry me = (Map.Entry)i.next();
this.put(me.getKey(), me.getValue());
}
}
public synchronized Object setProperty(String name, String value) {
return this.put(name, value);
}
public String filter(String stringToFilter) {
StringBuffer resultStringBuffer = new StringBuffer();
StringTokenizer st = new StringTokenizer(stringToFilter, "@", true);
STATE state;
if (stringToFilter.startsWith("@")) {
state = new STATE(STATE.START_TOKEN);
} else {
state = new STATE(STATE.STRING_NOT_TO_FILTER);
}
for (String currentToken; st.hasMoreTokens(); state.increment()) {
currentToken = st.nextToken();
if (state.isStringToFilter()) {
resultStringBuffer.append(getProperty(currentToken, "@"
+ currentToken + "@"));
} else if (state.isStringNOTToFilter()) {
resultStringBuffer.append(currentToken);
}
}
return resultStringBuffer.toString();
}
private static class STATE
{
final static int STRING_NOT_TO_FILTER = 0;
final static int START_TOKEN = 1;
final static int STRING_TO_FILTER = 2;
final static int END_TOKEN = 3;
private int currentState;
STATE(int startState) {
this.currentState = startState;
}
void increment() {
currentState++;
if (currentState > 3) {
currentState = 0;
}
}
boolean isStringToFilter() {
return (currentState == STRING_TO_FILTER);
}
boolean isStringNOTToFilter() {
return (currentState == STRING_NOT_TO_FILTER);
}
}
}