package org.rhq.core.template;
import java.io.Serializable;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TemplateEngine implements Serializable {
private static final long serialVersionUID = -6490715202402123042L;
private final Map<String, String> tokens;
// In English, the open delimiter @@
// zero or more white space characters
// The following pattern at least once:
// one or more word characters followed by an optional period
// zero or more white space characters
// The closing delimiter @@
//
// Thus @@ rhq.system @@ and @@rhq.system@@ are equivalent.
// @@ rhq.platform.ip_address @@ is valid.
// @@ & @@ is not a valid.
private static String tokenRegex = "@@\\s*(\\w+\\.?)+\\s*@@";
private static String keyRegex = "(\\w+\\.?)+";
private static Pattern tokenPattern = Pattern.compile(tokenRegex);
private static Pattern keyPattern = Pattern.compile(keyRegex);
public TemplateEngine(Map<String, String> tokens) {
super();
this.tokens = tokens;
}
public Map<String, String> getTokens() {
return this.tokens;
}
public String replaceTokens(String input) {
StringBuffer buffer = new StringBuffer();
Matcher matcher = tokenPattern.matcher(input);
while (matcher.find()) {
String next = matcher.group();
Matcher keyMatcher = keyPattern.matcher(next);
if (keyMatcher.find()) {
String key = keyMatcher.group();
String value = tokens.get(key);
if (value != null) {
next = value;
}
}
// If we didn't find a replacement for the key, leave the original value unchanged
matcher.appendReplacement(buffer, Matcher.quoteReplacement(next));
}
matcher.appendTail(buffer);
return buffer.toString();
}
}