package xapi.source.write;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
public class MappedTemplate extends Template {
private Map<String, Integer> positions;
public MappedTemplate(String template, Iterable<String> items) {
this(template, StringerMatcher.DEFAULT_TO_STRINGER, toArray(items));
}
public MappedTemplate(String template, String ... replaceables) {
this(template, StringerMatcher.DEFAULT_TO_STRINGER, replaceables);
}
public MappedTemplate(String template, StringerMatcher matcher, Iterable<String> items) {
this(template, matcher, toArray(items));
}
public MappedTemplate(String template, StringerMatcher matcher, String ... replaceables) {
super(template, matcher, replaceables);
positions = new HashMap<String, Integer>();
for (int i = 0, m = replaceables.length; i < m; i++) {
positions.put(replaceables[i], i);
}
}
public String applyMap(Iterable<Entry<String, Object>> map) {
Object[] values = new Object[positions.size()];
for (Entry<String, Object> entry : map) {
String key = entry.getKey();
Integer pos = positions.get(key);
if (pos == null) {
warnMissing(key);
} else {
values[pos] = retrieve(key, entry.getValue());
}
}
return apply(values);
}
/**
* Allow subclasses to perform additional data retrieval logic.
*/
protected Object retrieve(String key, Object object) {
return object;
}
protected void warnMissing(String key) {
// Default does nothing; this is here so you can implement logging as you see fit.
}
public boolean hasKey(String key) {
return positions.containsKey(key);
}
}