package com.github.agiledon.sisyphus.composer; import com.google.common.base.Joiner; import java.util.List; import java.util.Map; import static com.github.agiledon.sisyphus.util.ResourceLoader.loadResourceAsLines; import static com.google.common.collect.Maps.newHashMap; public abstract class AbstractComposer implements Composer { protected String resourceName; private Map<String, Object> results = newHashMap(); public void setResourceName(String resourceName) { this.resourceName = resourceName; } @SuppressWarnings("unchecked") public <T> T to(Class<T> tClass) { T result = (T)results.get(resourceName); if (result == null) { String resource = evaluate(loadResourceAsLines(resourceName)); result = deserialize(tClass, resource); results.put(resourceName, result); } return result; } protected String evaluate(List<String> resource) { return Joiner.on("\n").join(resource); } protected abstract <T> T deserialize(Class<T> tClass, String resource); @Override public MultiSectionsComposer withTemplate(String templateFileName) { return new MultiSectionsComposer(new StringTemplateComposer(this, templateFileName)); } }