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(); 
 
 
}