package de.neuland.jade4j;
import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap;
import de.neuland.jade4j.Jade4J.Mode;
import de.neuland.jade4j.exceptions.JadeCompilerException;
import de.neuland.jade4j.exceptions.JadeException;
import de.neuland.jade4j.expression.ExpressionHandler;
import de.neuland.jade4j.expression.JexlExpressionHandler;
import de.neuland.jade4j.filter.*;
import de.neuland.jade4j.model.JadeModel;
import de.neuland.jade4j.parser.Parser;
import de.neuland.jade4j.parser.node.Node;
import de.neuland.jade4j.template.FileTemplateLoader;
import de.neuland.jade4j.template.JadeTemplate;
import de.neuland.jade4j.template.TemplateLoader;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
public class JadeConfiguration {
private static final String FILTER_CDATA = "cdata";
private static final String FILTER_STYLE = "css";
private static final String FILTER_SCRIPT = "js";
private boolean prettyPrint = false;
private String basePath = "";
private boolean caching = true;
private Mode mode = Jade4J.Mode.HTML;
private Map<String, Filter> filters = new HashMap<String, Filter>();
private Map<String, Object> sharedVariables = new HashMap<String, Object>();
private TemplateLoader templateLoader = new FileTemplateLoader("", "UTF-8");
private ExpressionHandler expressionHandler = new JexlExpressionHandler();
protected static final int MAX_ENTRIES = 1000;
public JadeConfiguration() {
setFilter(FILTER_CDATA, new CDATAFilter());
setFilter(FILTER_SCRIPT, new JsFilter());
setFilter(FILTER_STYLE, new CssFilter());
}
private Map<String, JadeTemplate> cache = new ConcurrentLinkedHashMap.Builder<String, JadeTemplate>().maximumWeightedCapacity(
MAX_ENTRIES + 1).build();
public JadeTemplate getTemplate(String name) throws IOException, JadeException {
if (caching) {
long lastModified = templateLoader.getLastModified(name);
String key = name + "-" + lastModified;
JadeTemplate template = cache.get(key);
if (template != null) {
return template;
} else {
JadeTemplate newTemplate = createTemplate(name);
cache.put(key, newTemplate);
return newTemplate;
}
}
return createTemplate(name);
}
public void renderTemplate(JadeTemplate template, Map<String, Object> model, Writer writer) throws JadeCompilerException {
JadeModel jadeModel = new JadeModel(sharedVariables);
for (String filterName : filters.keySet()) {
jadeModel.addFilter(filterName, filters.get(filterName));
}
jadeModel.putAll(model);
template.process(jadeModel, writer);
}
public String renderTemplate(JadeTemplate template, Map<String, Object> model) throws JadeCompilerException {
StringWriter writer = new StringWriter();
renderTemplate(template, model, writer);
return writer.toString();
}
private JadeTemplate createTemplate(String name) throws JadeException, IOException {
JadeTemplate template = new JadeTemplate();
Parser parser = new Parser(name, basePath, templateLoader, expressionHandler);
Node root = parser.parse();
template.setTemplateLoader(templateLoader);
template.setExpressionHandler(expressionHandler);
template.setRootNode(root);
template.setPrettyPrint(prettyPrint);
template.setMode(getMode());
return template;
}
public boolean isPrettyPrint() {
return prettyPrint;
}
public void setPrettyPrint(boolean prettyPrint) {
this.prettyPrint = prettyPrint;
}
public void setFilter(String name, Filter filter) {
filters.put(name, filter);
}
public void removeFilter(String name) {
filters.remove(name);
}
public Map<String, Filter> getFilters() {
return filters;
}
public void setFilters(Map<String, Filter> filters) {
this.filters = filters;
}
public Map<String, Object> getSharedVariables() {
return sharedVariables;
}
public void setSharedVariables(Map<String, Object> sharedVariables) {
this.sharedVariables = sharedVariables;
}
public TemplateLoader getTemplateLoader() {
return templateLoader;
}
public void setTemplateLoader(TemplateLoader templateLoader) {
this.templateLoader = templateLoader;
}
public void setExpressionHandler(ExpressionHandler expressionHandler) {
this.expressionHandler = expressionHandler;
}
public ExpressionHandler getExpressionHandler() {
return expressionHandler;
}
public Mode getMode() {
return mode;
}
public void setMode(Mode mode) {
this.mode = mode;
}
public boolean templateExists(String url) {
try {
return templateLoader.getReader(url) != null;
} catch (IOException e) {
return false;
}
}
public boolean isCaching() {
return caching;
}
public void setCaching(boolean cache) {
if (cache != this.caching) {
expressionHandler.setCache(cache);
this.caching = cache;
}
}
public void clearCache() {
expressionHandler.clearCache();
cache.clear();
}
public String getBasePath() {
return basePath;
}
public void setBasePath(String basePath) {
this.basePath = basePath;
}
}