package org.jboss.resteasy.core.interception.jaxrs; import org.jboss.resteasy.resteasy_jaxrs.i18n.*; import org.jboss.resteasy.spi.ResteasyProviderFactory; import javax.ws.rs.NotSupportedException; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.MessageBodyReader; import javax.ws.rs.ext.ReaderInterceptor; import javax.ws.rs.ext.ReaderInterceptorContext; import java.io.IOException; import java.io.InputStream; import java.lang.annotation.Annotation; import java.lang.reflect.Type; /** * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @version $Revision: 1 $ */ public abstract class AbstractReaderInterceptorContext implements ReaderInterceptorContext { protected ReaderInterceptor[] interceptors; protected ResteasyProviderFactory providerFactory; protected Class type; protected Type genericType; protected Annotation[] annotations; protected MediaType mediaType; protected MultivaluedMap<String, String> headers; protected InputStream inputStream; protected int index = 0; public AbstractReaderInterceptorContext(MediaType mediaType, ResteasyProviderFactory providerFactory, Annotation[] annotations, ReaderInterceptor[] interceptors, MultivaluedMap<String, String> headers, Type genericType, Class type, InputStream inputStream) { this.mediaType = mediaType; this.annotations = annotations; this.interceptors = interceptors; this.headers = headers; this.genericType = genericType; this.type = type; this.inputStream = inputStream; this.providerFactory = providerFactory; } @Override public Object proceed() throws IOException { LogMessages.LOGGER.debugf("Interceptor Context: %s, Method : proceed", getClass().getName()); if (interceptors == null || index >= interceptors.length) { MessageBodyReader reader = getReader(); if (reader!=null) LogMessages.LOGGER.debugf("MessageBodyReader: %s", reader.getClass().getName()); return readFrom(reader); } LogMessages.LOGGER.debugf("ReaderInterceptor: %s", interceptors[index].getClass().getName()); return interceptors[index++].aroundReadFrom(this); // index--; we used to pop the index, but the TCK does not like this } @SuppressWarnings(value = "unchecked") protected Object readFrom(MessageBodyReader reader) throws IOException { return reader.readFrom(type, genericType, annotations, mediaType, headers, inputStream); } protected MessageBodyReader getReader() { MediaType mediaType = this.mediaType; // spec says set to octet stream if (getHeaders() != null && getHeaders().getFirst(HttpHeaders.CONTENT_TYPE) == null && mediaType.isWildcardType()) { mediaType = MediaType.APPLICATION_OCTET_STREAM_TYPE; } MessageBodyReader reader = resolveReader(mediaType); if (reader == null) { throwReaderNotFound(); } return reader; } protected abstract MessageBodyReader resolveReader(MediaType mediaType); abstract protected void throwReaderNotFound(); @Override public InputStream getInputStream() { return inputStream; } @Override public void setInputStream(InputStream is) { this.inputStream = is; } @Override public MultivaluedMap<String, String> getHeaders() { return headers; } @Override public Annotation[] getAnnotations() { return annotations; } @Override public void setAnnotations(Annotation[] annotations) { if (annotations == null) throw new NullPointerException(Messages.MESSAGES.annotationsParamNull()); this.annotations = annotations; } @Override public Class getType() { return type; } @Override public void setType(Class type) { this.type = type; } @Override public Type getGenericType() { return genericType; } @Override public void setGenericType(Type genericType) { this.genericType = genericType; } @Override public MediaType getMediaType() { return mediaType; } @Override public void setMediaType(MediaType mediaType) { this.mediaType = mediaType; } }