package com.oreilly.jaxrs.velocity;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import javax.ws.rs.ext.Provider;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.velocity.Template;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
import com.sun.jersey.api.view.Viewable;
import com.sun.jersey.spi.template.ViewProcessor;
@Provider
public class VelocityViewProcessor implements ViewProcessor<Template> {
private static Log log = LogFactory.getLog(VelocityViewProcessor.class);
private VelocityEngine ve;
public VelocityViewProcessor() {
ve = new VelocityEngine();
ve.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
"org.apache.velocity.runtime.log.Log4JLogChute");
ve.setProperty("runtime.log.logsystem.log4j.logger",
VelocityViewProcessor.class.getName());
ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "class");
ve.setProperty("class.resource.loader.class",
ClasspathResourceLoader.class.getName());
try {
ve.init();
log.info("Velocity is loaded");
} catch (Exception e) {
log.error("Error when initializing Velocity", e);
}
}
@Override
public Template resolve(String name) {
try {
return ve.getTemplate(name);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void writeTo(Template t, Viewable viewable, OutputStream out)
throws IOException {
OutputStreamWriter writer = new OutputStreamWriter(out);
t.merge((org.apache.velocity.context.Context) viewable.getModel(),
writer);
writer.close();
}
}