blob: 7163720c81558b52929e43a9ee94ea36be4a79d0 [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.openjpa.lib.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.security.AccessController;
import java.util.HashMap;
import java.util.Map;
/**
* A template that allows parameter substitutions. Parameters should be
* placed in the template in the form ${param-name}. Use the
* {@link #setParameter} method to set the parameter values, which will be
* substituted into the template on calls to {@link #write} and
* {@link #toString}. If a parameter is encountered that hasn't been set, then
* the parameter key is used to lookup the corresponding System property.
*
* @author Abe White
*/
public class ParameterTemplate {
private static final String SEP = J2DoPrivHelper.getLineSeparator();
private final StringBuffer _buf = new StringBuffer();
private final Map _params = new HashMap();
/**
* Add the given value to the internal template.
*/
public ParameterTemplate append(String value) {
_buf.append(value);
return this;
}
/**
* Add the given value to the internal template.
*/
public ParameterTemplate append(boolean value) {
_buf.append(value);
return this;
}
/**
* Add the given value to the internal template.
*/
public ParameterTemplate append(char value) {
_buf.append(value);
return this;
}
/**
* Add the given value to the internal template.
*/
public ParameterTemplate append(double value) {
_buf.append(value);
return this;
}
/**
* Add the given value to the internal template.
*/
public ParameterTemplate append(float value) {
_buf.append(value);
return this;
}
/**
* Add the given value to the internal template.
*/
public ParameterTemplate append(int value) {
_buf.append(value);
return this;
}
/**
* Add the given value to the internal template.
*/
public ParameterTemplate append(long value) {
_buf.append(value);
return this;
}
/**
* Add the given value to the internal template.
*/
public ParameterTemplate append(short value) {
_buf.append(value);
return this;
}
/**
* Add the given value to the internal template.
*/
public ParameterTemplate append(Object value) {
_buf.append(value);
return this;
}
/**
* Add the given value to the internal template.
*/
public ParameterTemplate append(InputStream in) throws IOException {
return append(new InputStreamReader(in));
}
/**
* Add the given value to the internal template.
*/
public ParameterTemplate append(Reader reader) throws IOException {
BufferedReader buf = new BufferedReader(reader);
String line;
while ((line = buf.readLine()) != null)
_buf.append(line).append(SEP);
return this;
}
/**
* Add the given value to the internal template.
*/
public ParameterTemplate append(File file) throws IOException {
FileReader reader = new FileReader(file);
try {
return append(reader);
} finally {
try {
reader.close();
} catch (IOException ioe) {
}
}
}
/**
* Return true if the given parameter has been given a value.
*/
public boolean hasParameter(String name) {
return _params.containsKey(name);
}
/**
* Return the value set for the given parameter.
*/
public Object getParameter(String name) {
return _params.get(name);
}
/**
* Set the value for the given parameter.
*/
public Object setParameter(String name, Object val) {
return _params.put(name, val);
}
/**
* Set the values for all the parameters in the given map.
*/
public void setParameters(Map params) {
_params.putAll(params);
}
/**
* Clear the recorded parameter values.
*/
public void clearParameters() {
_params.clear();
}
/**
* Return a copy of the internal value template with all parameters
* substituted with their current values.
*/
@Override
public String toString() {
if (_buf.length() == 0 || _params.isEmpty())
return _buf.toString();
StringBuilder copy = new StringBuilder();
StringBuilder param = null;
char ch, last = 0;
for (int i = 0; i < _buf.length(); i++) {
ch = _buf.charAt(i);
if (last == '$' && ch == '{') {
copy.deleteCharAt(copy.length() - 1);
param = new StringBuilder();
} else if (ch == '}' && param != null) {
if (_params.containsKey(param.toString()))
copy.append(_params.get(param.toString()));
else
copy.append(AccessController.doPrivileged(
J2DoPrivHelper.getPropertyAction(param.toString())));
param = null;
} else if (param != null)
param.append(ch);
else
copy.append(ch);
last = ch;
}
return copy.toString();
}
/**
* Write the internal value template with all parameters
* substituted with their current values.
*/
public void write(OutputStream out) throws IOException {
write(new OutputStreamWriter(out));
}
/**
* Write the internal value template with all parameters
* substituted with their current values.
*/
public void write(Writer writer) throws IOException {
writer.write(toString());
writer.flush();
}
/**
* Write the internal value template with all parameters
* substituted with their current values.
*/
public void write(File file) throws IOException {
FileWriter writer = new FileWriter(file);
try {
write(writer);
} finally {
try {
writer.close();
} catch (IOException ioe) {
}
}
}
}