/*
* $Id$
*
* License Agreement.
*
* Rich Faces - Natural Ajax for Java Server Faces (JSF)
*
* Copyright (C) 2007 Exadel, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.richfaces.cdk.generate.freemarker;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Map;
import org.richfaces.cdk.Logger;
import com.google.inject.Inject;
import freemarker.template.Configuration;
import freemarker.template.ObjectWrapper;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModelException;
/**
* <p class="changed_added_4_0">
* </p>
*
* @author asmirnov@exadel.com
*/
public class CdkConfiguration extends Configuration implements FreeMarkerRenderer {
private static final String TEMPLATES = "/META-INF/templates";
private String templatesFolder = TEMPLATES;
private Logger log;
@Inject
public CdkConfiguration(ObjectWrapper wrapper, Logger log, FreeMakerUtils utils) {
super();
this.log = log;
// load templates from plugin classloader.
setClassForTemplateLoading(this.getClass(), getTemplatesFolder());
setTemplateUpdateDelay(10000);// Forever...
setSharedVariable("utils", utils);
setObjectWrapper(wrapper);
// Add context variables
// this.setSharedVariable("context", new BeanModel(context, new BeansWrapper()));
}
@Inject(optional = true)
public void setSharedVariables(@ContextVariables Map<String, Object> variables) {
// template method for subclasses.
for (Map.Entry<String, Object> entry : variables.entrySet()) {
try {
setSharedVariable(entry.getKey(), entry.getValue());
} catch (TemplateModelException e) {
log.error("Error to set shared variable " + entry.getKey(), e);
}
}
}
@Inject(optional = true)
public synchronized void setImports(@DefaultImports Map<String, String> map) {
super.setAutoImports(map);
}
@Override
public void writeTemplate(String templateName, Object object, Writer writer) throws IOException, TemplateException {
getTemplate(templateName).process(object, writer);
}
/*
* (non-Javadoc)
*
* @see org.richfaces.cdk.templatecompiler.FreeMarkerRenderer#renderSnippet(java.lang.String, java.lang.Object)
*/
@Override
public String renderTemplate(String templateName, Object object) {
StringWriter writer = new StringWriter();
try {
writeTemplate(templateName, object, writer);
return writer.toString();
} catch (IOException e) {
log.error("Error rendering template", e);
return e.getMessage();
} catch (TemplateException e) {
log.error("Error rendering template", e);
return e.getMessage();
}
}
/**
* <p class="changed_added_4_0">
* </p>
*
* @param templatesFolder the templatesFolder to set
*/
@Inject(optional = true)
public void setTemplatesFolder(@TemplatesFolder String templatesFolder) {
setClassForTemplateLoading(this.getClass(), templatesFolder);
this.templatesFolder = templatesFolder;
}
/**
* <p class="changed_added_4_0">
* </p>
*
* @return the templates
*/
public String getTemplatesFolder() {
return templatesFolder;
}
}