/**
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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 software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.groovyscript;
import java.io.IOException;
import java.io.Reader;
import java.io.Serializable;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Locale;
import java.util.Map;
import org.gatein.common.logging.Logger;
import org.gatein.common.logging.LoggerFactory;
/**
* A Groovy template.
*
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
*/
public class GroovyTemplate implements Serializable {
private static final long serialVersionUID = -8220112880199970451L;
// todo : move that to {@link org.gatein.common.io.IOTools}
private static String read(Reader reader) throws IOException {
StringBuilder builder = new StringBuilder();
char[] chars = new char[256];
for (int s = reader.read(chars); s != -1; s = reader.read(chars)) {
builder.append(chars, 0, s);
}
return builder.toString();
}
/** The text of the template. */
private final String templateText;
private final String templateId;
private final String templateName;
/** The groovy script. */
private transient GroovyScript script;
public GroovyTemplate(String id, String name, Reader scriptReader) throws IOException, TemplateCompilationException {
this(id, name, read(scriptReader));
}
public GroovyTemplate(Reader scriptReader) throws IOException, TemplateCompilationException {
this(read(scriptReader));
}
public GroovyTemplate(String templateText) throws TemplateCompilationException {
this(null, null, templateText);
}
public GroovyTemplate(String templateId, String templateName, String templateText) throws TemplateCompilationException {
if (templateName == null) {
templateName = "fic";
} else {
templateName = templateName.replaceAll("-", "_");
}
//
GroovyScriptBuilder compiler = new GroovyScriptBuilder(templateId, templateName, templateText);
//
this.script = compiler.build();
this.templateText = templateText;
this.templateId = templateId;
this.templateName = templateName;
}
public String getId() {
return this.templateId;
}
public String getClassName() {
return getScript().getScriptClass().getName();
}
public String getText() {
return templateText;
}
public String getGroovy() {
return getScript().getGroovyText();
}
public void render(Writer writer) throws IOException, TemplateRuntimeException {
render(writer, (Map) null);
}
public void render(Writer writer, Locale locale) throws IOException, TemplateRuntimeException {
render(writer, null, locale);
}
public void render(Writer writer, Map binding, Locale locale) throws IOException, TemplateRuntimeException {
getScript().render(binding, writer, locale);
}
public void render(Writer writer, Map binding) throws IOException, TemplateRuntimeException {
getScript().render(binding, writer, null);
}
public String render() throws IOException, TemplateRuntimeException {
return render((Map) null);
}
public String render(Locale locale) throws IOException, TemplateRuntimeException {
return render((Map) null, locale);
}
public String render(Map binding) throws IOException, TemplateRuntimeException {
return render(binding, null);
}
public String render(Map binding, Locale locale) throws IOException, TemplateRuntimeException {
StringWriter buffer = new StringWriter();
render(buffer, binding, locale);
buffer.close();
return buffer.toString();
}
private GroovyScript getScript() {
if(this.script == null) {
try {
GroovyScriptBuilder compiler = new GroovyScriptBuilder(templateId, templateName, templateText);
this.script = compiler.build();
} catch (TemplateCompilationException ex) {
Logger log = LoggerFactory.getLogger(GroovyTemplate.class);
log.error(ex.getMessage(), ex);
}
}
return this.script;
}
}