package org.jboss.resteasy.core.interception; import org.jboss.resteasy.spi.ResteasyProviderFactory; import org.jboss.resteasy.spi.interception.AcceptedByMethod; import org.jboss.resteasy.spi.interception.MessageBodyWriterContext; import org.jboss.resteasy.spi.interception.MessageBodyWriterInterceptor; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.WriterInterceptor; import javax.ws.rs.ext.WriterInterceptorContext; import java.io.IOException; import java.io.OutputStream; import java.lang.annotation.Annotation; import java.lang.reflect.AccessibleObject; import java.lang.reflect.Method; import java.lang.reflect.Type; /** * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @version $Revision: 1 $ * @deprecated Use org.jboss.resteasy.core.interception.jaxrs.WriterInterceptorRegistry instead. */ @Deprecated public class WriterInterceptorRegistry extends org.jboss.resteasy.core.interception.jaxrs.WriterInterceptorRegistry { protected LegacyPrecedence precedence; public WriterInterceptorRegistry(ResteasyProviderFactory providerFactory, LegacyPrecedence precedence) { super(providerFactory); this.precedence = precedence; } public WriterInterceptorRegistry clone(ResteasyProviderFactory factory) { WriterInterceptorRegistry clone = new WriterInterceptorRegistry(factory, precedence); clone.interceptors.addAll(interceptors); return clone; } private static class MessageBodyWriterContextFacade implements MessageBodyWriterContext { protected final WriterInterceptorContext writerInterceptorContext; private MessageBodyWriterContextFacade(WriterInterceptorContext writerInterceptorContext) { this.writerInterceptorContext = writerInterceptorContext; } @Override public Class getType() { return writerInterceptorContext.getType(); } @Override public void setType(Class type) { writerInterceptorContext.setType(type); } @Override public Type getGenericType() { return writerInterceptorContext.getGenericType(); } @Override public void setGenericType(Type genericType) { writerInterceptorContext.setGenericType(genericType); } @Override public Annotation[] getAnnotations() { return writerInterceptorContext.getAnnotations(); } @Override public void setAnnotations(Annotation[] annotations) { writerInterceptorContext.setAnnotations(annotations); } @Override public MediaType getMediaType() { return writerInterceptorContext.getMediaType(); } @Override public void setMediaType(MediaType mediaType) { writerInterceptorContext.setMediaType(mediaType); } @Override public MultivaluedMap<String, Object> getHeaders() { return writerInterceptorContext.getHeaders(); } @Override public Object getAttribute(String attribute) { return writerInterceptorContext.getProperty(attribute); } @Override public void setAttribute(String name, Object value) { writerInterceptorContext.setProperty(name, value); } @Override public void removeAttribute(String name) { writerInterceptorContext.removeProperty(name); } @Override public Object getEntity() { return writerInterceptorContext.getEntity(); } @Override public void setEntity(Object entity) { writerInterceptorContext.setEntity(entity); } @Override public OutputStream getOutputStream() { return writerInterceptorContext.getOutputStream(); } @Override public void setOutputStream(OutputStream os) { writerInterceptorContext.setOutputStream(os); } @Override public void proceed() throws IOException, WebApplicationException { writerInterceptorContext.proceed(); } } public static class WriterInterceptorFacade implements WriterInterceptor { protected final MessageBodyWriterInterceptor interceptor; public WriterInterceptorFacade(MessageBodyWriterInterceptor interceptor) { this.interceptor = interceptor; } public MessageBodyWriterInterceptor getInterceptor() { return interceptor; } @Override public void aroundWriteTo(WriterInterceptorContext writerInterceptorContext) throws IOException, WebApplicationException { MessageBodyWriterContextFacade facade = new MessageBodyWriterContextFacade(writerInterceptorContext); interceptor.write(facade); } } public abstract class AbstractLegacyInterceptorFactory extends AbstractInterceptorFactory { protected LegacyPrecedence precedence; protected AbstractLegacyInterceptorFactory(Class declaring, LegacyPrecedence precedence) { super(declaring); this.precedence = precedence; } @Override protected void setPrecedence(Class<?> declaring) { order = precedence.calculateOrder(declaring); } @Override public Match preMatch() { return null; } public Object getLegacyMatch(Class declaring, AccessibleObject target) { Object interceptor = getInterceptor(); if (interceptor instanceof AcceptedByMethod) { if (target == null || !(target instanceof Method)) return null; Method method = (Method) target; if (((AcceptedByMethod) interceptor).accept(declaring, method)) { return interceptor; } else { return null; } } return interceptor; } } protected class LegacySingletonInterceptorFactory extends AbstractLegacyInterceptorFactory { protected Object interceptor; public LegacySingletonInterceptorFactory(Class declaring, Object interceptor, LegacyPrecedence precedence) { super(declaring, precedence); this.interceptor = interceptor; setPrecedence(declaring); } @Override protected void initialize() { providerFactory.injectProperties(interceptor); } @Override protected Object getInterceptor() { checkInitialize(); return interceptor; } } protected class LegacyPerMethodInterceptorFactory extends AbstractLegacyInterceptorFactory { public LegacyPerMethodInterceptorFactory(Class declaring, LegacyPrecedence precedence) { super(declaring, precedence); setPrecedence(declaring); } @Override protected void initialize() { } @Override protected Object getInterceptor() { Object interceptor = createInterceptor(); providerFactory.injectProperties(interceptor); return interceptor; } } public void registerLegacy(Class<? extends MessageBodyWriterInterceptor> decl) { register(new LegacyPerMethodInterceptorFactory(decl, precedence) { @Override public Match postMatch(Class declaring, AccessibleObject target) { Object obj = getLegacyMatch(declaring, target); if (obj == null) return null; MessageBodyWriterInterceptor interceptor = (MessageBodyWriterInterceptor)obj; return new Match(new WriterInterceptorFacade(interceptor), order); } }); } public void registerLegacy(MessageBodyWriterInterceptor interceptor) { register(new LegacySingletonInterceptorFactory(interceptor.getClass(), interceptor, precedence) { @Override public Match postMatch(Class declaring, AccessibleObject target) { Object obj = getLegacyMatch(declaring, target); if (obj == null) return null; MessageBodyWriterInterceptor interceptor = (MessageBodyWriterInterceptor)obj; return new Match(new WriterInterceptorFacade(interceptor), order); } }); } }