package org.jboss.seam.rest.templating.freemarker; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.lang.annotation.Annotation; 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 freemarker.template.Configuration; import freemarker.template.DefaultObjectWrapper; import freemarker.template.Template; import freemarker.template.TemplateException; 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; /** * Converts the response object to a rendered FreeMarker template. * * @author <a href="http://community.jboss.org/people/jharting">Jozef Hartinger</a> */ @ApplicationScoped public class FreeMarkerProvider implements TemplatingProvider { private Configuration configuration; @Inject private TemplatingModel model; @Inject private BeanManager manager; public void init(ServletContext servletContext) { configuration = new Configuration(); configuration.setObjectWrapper(new DefaultObjectWrapper()); configuration.setServletContextForTemplateLoading(servletContext, "/"); } public void writeTo(Object o, ResponseTemplate annotation, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream os) throws IOException { Template template = configuration.getTemplate(annotation.value()); model.getData().put(annotation.responseName(), o); try { OutputStreamWriter writer = new OutputStreamWriter(os); template.process(new ModelWrapper(model.getData(), manager), writer); writer.flush(); } catch (TemplateException e) { throw new RuntimeException("Unable to write FreeMarker response.", e); } } @Override public String toString() { return getClass().getName(); } }