/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 2007.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.console;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author Arjohn Kampman
*/
class ConfigTemplate {
/*-----------*
* Constants *
*-----------*/
private static final Pattern TOKEN_PATTERN = Pattern.compile("\\{%[\\p{Print}&&[^\\}]]+%\\}");
/*-----------*
* Variables *
*-----------*/
private String template;
private Map<String, List<String>> variableMap = new LinkedHashMap<String, List<String>>();
/*--------------*
* Constructors *
*--------------*/
public ConfigTemplate(String template) {
setTemplate(template);
}
/*---------*
* Methods *
*---------*/
public String getTemplate() {
return template;
}
public void setTemplate(String template) {
if (template == null) {
throw new IllegalArgumentException("template must not be null");
}
this.template = template;
parseTemplate();
}
private void parseTemplate() {
Matcher matcher = TOKEN_PATTERN.matcher(template);
while (matcher.find()) {
String group = matcher.group();
String[] tokensArray = group.substring(2, group.length() - 2).split("\\|");
List<String> tokens = Arrays.asList(tokensArray);
String var = tokens.get(0).trim();
List<String> values = tokens.subList(1, tokens.size());
if (var.length() == 0) {
throw new IllegalArgumentException("Illegal template token: " + matcher.group());
}
if (!variableMap.containsKey(var)) {
variableMap.put(var, values);
}
}
}
public Map<String, List<String>> getVariableMap() {
return Collections.unmodifiableMap(variableMap);
}
public String render(Map<String, String> valueMap) {
StringBuffer result = new StringBuffer(template.length());
Matcher matcher = TOKEN_PATTERN.matcher(template);
while (matcher.find()) {
String group = matcher.group();
String[] tokensArray = group.substring(2, group.length() - 2).split("\\|");
String var = tokensArray[0].trim();
String value = valueMap.get(var);
if (value == null) {
List<String> values = variableMap.get(var);
if (!values.isEmpty()) {
value = values.get(0);
}
else {
value = "";
}
}
// if (value == null) {
// throw new IllegalArgumentException("No value specified for variable " + var);
// }
matcher.appendReplacement(result, value);
}
matcher.appendTail(result);
return result.toString();
}
}