package org.jboss.seam.rest.templating.velocity;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.lang.annotation.Annotation;
import java.util.Properties;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.spi.BeanManager;
import javax.inject.Inject;
import javax.servlet.ServletContext;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.jboss.seam.rest.templating.ModelWrapper;
import org.jboss.seam.rest.templating.ResponseTemplate;
import org.jboss.seam.rest.templating.TemplatingModel;
import org.jboss.seam.rest.templating.TemplatingProvider;
/**
* Renders response using Apache Velocity.
*
* @author <a href="http://community.jboss.org/people/jharting">Jozef Hartinger</a>
*/
@ApplicationScoped
public class VelocityProvider implements TemplatingProvider {
@Inject
private TemplatingModel model;
@Inject
private BeanManager manager;
// Instance is only needed because of a bug in GF
public void init(ServletContext servletContext) {
Properties properties = new Properties();
properties.setProperty("resource.loader", "servlet");
properties.setProperty("servlet.resource.loader.class", "org.apache.velocity.tools.view.WebappResourceLoader");
Velocity.setApplicationAttribute("javax.servlet.ServletContext", servletContext);
Velocity.init(properties);
}
public void writeTo(Object o, ResponseTemplate annotation, Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders, OutputStream os) throws IOException {
ModelWrapper model = new ModelWrapper(this.model.getData(), manager);
model.put(annotation.responseName(), o);
Template template = null;
template = Velocity.getTemplate(annotation.value());
OutputStreamWriter writer = new OutputStreamWriter(os);
template.merge(new VelocityContext(model), writer);
writer.flush();
}
@Override
public String toString() {
return getClass().getName();
}
}