package org.trianacode.http;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.runtime.resource.loader.StringResourceLoader;
import org.apache.velocity.runtime.resource.util.StringResource;
import org.apache.velocity.runtime.resource.util.StringResourceRepository;
import org.thinginitself.streamable.Streamable;
import org.thinginitself.streamable.StreamableData;
import org.trianacode.config.ResourceManagement;
import org.trianacode.config.TrianaProperties;
import java.io.*;
import java.util.Map;
import java.util.Properties;
/**
* @author Andrew Harrison
* @version 1.0.0 Jul 20, 2010
*/
public class Output {
private static StringResourceRepository repository;
private static VelocityEngine engine;
private static boolean defaultRegistered = false;
static {
try {
initVelocityEngine();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void registerTemplate(String name, String path) throws IOException {
StringResource existing = repository.getStringResource(name);
if (existing == null) {
repository.putStringResource(name, getTemplate(path));
}
}
public static void registerTemplate(String name, TrianaProperties properties) throws IOException {
StringResource existing = repository.getStringResource(name);
if (existing == null) {
repository.putStringResource(name, getTemplate(properties.getProperty(name)));
}
}
public static void registerTemplates(TrianaProperties p) throws IOException {
registerDefaults(p);
registerTemplate(TrianaProperties.TOOL_CP_HTML_TEMPLATE_PROPERTY, p);
registerTemplate(TrianaProperties.TOOL_CP_XML_TEMPLATE_PROPERTY, p);
registerTemplate(TrianaProperties.NOHELP_TEMPLATE_PROPERTY, p);
registerTemplate(TrianaProperties.TOOL_DESCRIPTION_TEMPLATE_PROPERTY, p);
registerTemplate(TrianaProperties.TOOL_PARAMETER_WINDOW_TEMPLATE_PROPERTY, p);
registerTemplate(TrianaProperties.CREATE_TOOL_INSTANCE_PROPERTY, p);
registerTemplate(TrianaProperties.TOOL_COMPLETED_TEMPLATE_PROPERTY, p);
registerTemplate(TrianaProperties.TOOL_DESCRIPTION_TEMPLATE_PROPERTY, p);
registerTemplate(TrianaProperties.TOOL_INSTANCE_PROPERTY, p);
registerTemplate(TrianaProperties.TOOLBOX_DESCRIPTION_TEMPLATE_PROPERTY, p);
registerTemplate(TrianaProperties.TOOLBOXES_DESCRIPTION_TEMPLATE_PROPERTY, p);
registerTemplate(TrianaProperties.TRIANA_TEMPLATE_PROPERTY, p);
}
public static synchronized void registerDefaults(TrianaProperties props) throws IOException {
if (!defaultRegistered) {
registerTemplate("header.template", props.getProperty(TrianaProperties.HEADER_TEMPLATE_PROPERTY));
registerTemplate("footer.template", props.getProperty(TrianaProperties.FOOTER_TEMPLATE_PROPERTY));
}
defaultRegistered = true;
}
private static void initVelocityEngine() throws Exception {
Properties p = new Properties();
p.setProperty("resource.loader", "string");
p.setProperty("string.resource.loader.class",
"org.apache.velocity.runtime.resource.loader.StringResourceLoader");
engine = new VelocityEngine();
engine.init(p);
repository = StringResourceLoader.getRepository();
}
/**
* Uses the resource management now to find the file rather than using the classpath ...
*
* @param path
* @return
* @throws IOException
*/
private static String getTemplate(String path) throws IOException {
InputStream inStream = ResourceManagement.getInputStreamFor(path, ResourceManagement.Type.TEMPLATE);
if (inStream != null) {
StringBuilder stringBuilder = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(inStream));
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
return stringBuilder.toString();
}
return null;
}
/**
* @param parameters
* @param templateType
* @return
*/
public static Streamable output(Map<String, Object> parameters, String templateType, String mime) {
parameters = initParameters(parameters);
VelocityContext context = new VelocityContext();
for (String s : parameters.keySet()) {
context.put(s, parameters.get(s));
}
try {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(bout));
Template template = engine.getTemplate(templateType);
template.merge(context, writer);
writer.close();
return new StreamableData(bout.toByteArray(), mime);
}
catch (ResourceNotFoundException rnfe) {
rnfe.printStackTrace();
}
catch (ParseErrorException pee) {
pee.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static Streamable output(Map<String, Object> parameters, String templateType) {
return output(parameters, templateType, "text/html");
}
public static String outputString(Map<String, Object> parameters, String templateType) {
parameters = initParameters(parameters);
VelocityContext context = new VelocityContext();
for (String s : parameters.keySet()) {
context.put(s, parameters.get(s));
}
try {
StringWriter writer = new StringWriter();
Template template = engine.getTemplate(templateType);
template.merge(context, writer);
writer.close();
return writer.toString();
}
catch (ResourceNotFoundException rnfe) {
rnfe.printStackTrace();
}
catch (ParseErrorException pee) {
pee.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static Map<String, Object> initParameters(Map<String, Object> parameters) {
if (parameters.get("pathController") == null || !(parameters.get("pathController") instanceof PathController)) {
parameters.put("pathController", PathController.getInstance());
}
if (parameters.get("title") == null) {
parameters.put("title", "Triana");
}
return parameters;
}
}