// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved.
// Released under the terms of the CPL Common Public License version 1.0.
package fitnesse.responders;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Properties;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.runtime.RuntimeInstance;
import fitnesse.FitNesseContext;
import fitnesse.responders.templateUtilities.HtmlPage;
import fitnesse.responders.templateUtilities.TraverseDirective;
public class PageFactory {
private static VelocityEngine velocityEngine = null;
private FitNesseContext context;
public PageFactory(FitNesseContext context) {
super();
this.context = context;
}
public HtmlPage newPage() {
return new HtmlPage(getVelocityEngine(), "skeleton.vm", context.pageTheme);
}
public String render(VelocityContext context, String templateName) {
Writer writer = new StringWriter();
Template template = getVelocityEngine().getTemplate(templateName);
template.merge(context, writer);
return writer.toString();
}
public String toString() {
return getClass().getName();
}
public VelocityEngine getVelocityEngine() {
if (velocityEngine == null) {
Properties properties = new Properties();
String templatePath = getTemplatePath();
properties.setProperty(VelocityEngine.RESOURCE_LOADER, "file,classpath");
properties.setProperty(VelocityEngine.FILE_RESOURCE_LOADER_PATH, templatePath);
properties.setProperty("classpath." + VelocityEngine.RESOURCE_LOADER + ".class",
fitnesse.responders.templateUtilities.ClasspathResourceLoader.class.getName());
properties.setProperty("classpath." + VelocityEngine.RESOURCE_LOADER + ".base",
"/fitnesse/resources/templates");
velocityEngine = new VelocityEngine();
velocityEngine.init(properties);
// TODO: Add traverse directive
velocityEngine.loadDirective(TraverseDirective.class.getName());
}
return velocityEngine;
}
public String getTemplatePath() {
return String.format("%s/%s/files/fitnesse/templates", context.rootPath, context.rootDirectoryName);
}
}