package ameba.mvc.template.internal; import org.glassfish.jersey.server.mvc.Template; import org.glassfish.jersey.server.mvc.Viewable; import javax.annotation.Priority; import javax.inject.Provider; import javax.inject.Singleton; import javax.ws.rs.Priorities; import javax.ws.rs.WebApplicationException; import javax.ws.rs.container.ResourceInfo; import javax.ws.rs.core.Context; import javax.ws.rs.ext.WriterInterceptor; import javax.ws.rs.ext.WriterInterceptorContext; import java.io.IOException; /** * Intercepts resource methods that are annotated by {@link Template template annotation} and does not return {@link Viewable} * instances. * * @author Michal Gajdos (michal.gajdos at oracle.com) * @author icode * @see org.glassfish.jersey.server.mvc.spi.ResolvedViewable * @see org.glassfish.jersey.server.mvc.internal.ViewableMessageBodyWriter */ @Singleton @Priority(Priorities.ENTITY_CODER) class TemplateMethodInterceptor implements WriterInterceptor { @Context private Provider<ResourceInfo> resourceInfoProvider; /** * {@inheritDoc} */ @Override public void aroundWriteTo(final WriterInterceptorContext context) throws IOException, WebApplicationException { final Object entity = context.getEntity(); if (!(entity instanceof Viewable) && resourceInfoProvider.get().getResourceMethod() != null) { final Template template = TemplateHelper.getTemplateAnnotation(context.getAnnotations()); if (template != null) { context.setType(Viewable.class); context.setEntity(new Viewable(template.name(), entity)); } } context.proceed(); } }