package org.jboss.resteasy.client.core;
import org.jboss.resteasy.core.interception.ReaderInterceptorRegistry;
import org.jboss.resteasy.core.interception.WriterInterceptorRegistry;
import org.jboss.resteasy.resteasy_jaxrs.i18n.Messages;
import org.jboss.resteasy.spi.interception.ClientExecutionInterceptor;
import org.jboss.resteasy.spi.interception.MessageBodyReaderInterceptor;
import org.jboss.resteasy.spi.interception.MessageBodyWriterInterceptor;
import javax.ws.rs.ext.ReaderInterceptor;
import javax.ws.rs.ext.WriterInterceptor;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Map.Entry;
@SuppressWarnings("unchecked")
public class ClientInterceptorRepositoryImpl implements ClientInterceptorRepository
{
private static enum InterceptorType
{
MessageBodyReader(ReaderInterceptor.class),
MessageBodyWriter(
WriterInterceptor.class),
ClientExecution(
ClientExecutionInterceptor.class);
Class<?> clazz;
public static InterceptorType getInterceptorTypeFor(Class<?> type)
{
for (InterceptorType interceptorType : InterceptorType.values())
{
if (type == interceptorType.clazz)
{
return interceptorType;
}
}
return null;
}
InterceptorType(Class<?> clazz)
{
this.clazz = clazz;
}
}
private Map<InterceptorType, LinkedList<?>> interceptorLists = new HashMap<InterceptorType, LinkedList<?>>();
protected ReaderInterceptor[] getReaderInterceptors()
{
return getArray(ReaderInterceptor.class);
}
protected WriterInterceptor[] getWriterInterceptors()
{
return getArray(WriterInterceptor.class);
}
protected ClientExecutionInterceptor[] getExecutionInterceptors()
{
return getArray(ClientExecutionInterceptor.class);
}
private <T> T[] getArray(Class<T> type)
{
LinkedList<T> interceptors = getInterceptors(type);
return (T[]) interceptors.toArray((T[]) Array.newInstance(type,
interceptors.size()));
}
protected void setReaderInterceptors(
ReaderInterceptor[] readerInterceptors)
{
setData(InterceptorType.MessageBodyReader, readerInterceptors);
}
protected void setWriterInterceptors(
WriterInterceptor[] writerInterceptors)
{
setData(InterceptorType.MessageBodyWriter, writerInterceptors);
}
protected void setExecutionInterceptors(
ClientExecutionInterceptor[] executionInterceptors)
{
setData(InterceptorType.ClientExecution, executionInterceptors);
}
protected void setExecutionInterceptors(
Collection<ClientExecutionInterceptor> executionInterceptorList)
{
setData(InterceptorType.ClientExecution, executionInterceptorList);
}
public LinkedList<ReaderInterceptor> getReaderInterceptorList()
{
return getInterceptors(InterceptorType.MessageBodyReader);
}
public LinkedList<WriterInterceptor> getWriterInterceptorList()
{
return getInterceptors(InterceptorType.MessageBodyWriter);
}
public LinkedList<ClientExecutionInterceptor> getExecutionInterceptorList()
{
return getInterceptors(InterceptorType.ClientExecution);
}
protected <T> LinkedList<T> getInterceptors(Class<T> clazz)
{
InterceptorType interceptorType = InterceptorType
.getInterceptorTypeFor(clazz);
if (interceptorType == null)
return null;
return getInterceptors(interceptorType);
}
protected synchronized LinkedList getInterceptors(
InterceptorType interceptorType)
{
LinkedList interceptors = interceptorLists.get(interceptorType);
if (interceptors == null)
{
interceptorLists.put(interceptorType, interceptors = new LinkedList());
}
return interceptors;
}
private void setData(InterceptorType type, Object[] arr)
{
setData(type, Arrays.asList(arr));
}
private void setData(InterceptorType type, Collection newList)
{
LinkedList list = getInterceptors(type);
list.clear();
list.addAll(newList);
}
public void copyClientInterceptorsTo(ClientInterceptorRepositoryImpl copyTo)
{
for (Entry<InterceptorType, LinkedList<?>> entry : interceptorLists
.entrySet())
{
LinkedList copyToInterceptors = copyTo.getInterceptors(entry.getKey());
LinkedList copyFromInterceptors = this.getInterceptors(entry.getKey());
copyToInterceptors.addAll(copyFromInterceptors);
}
}
public void prefixClientInterceptorsTo(ClientInterceptorRepositoryImpl copyTo)
{
for (Entry<InterceptorType, LinkedList<?>> entry : interceptorLists
.entrySet())
{
LinkedList copyToInterceptors = copyTo.getInterceptors(entry.getKey());
LinkedList copyFromInterceptors = this.getInterceptors(entry.getKey());
for (Object interceptor : copyFromInterceptors)
{
copyToInterceptors.addFirst(interceptor);
}
}
}
public void registerInterceptor(Object interceptor)
{
boolean registered = false;
if (interceptor instanceof ClientExecutionInterceptor)
{
getExecutionInterceptorList().add(
(ClientExecutionInterceptor) interceptor);
registered = true;
}
if (interceptor instanceof MessageBodyReaderInterceptor)
{
getReaderInterceptorList().add(
new ReaderInterceptorRegistry.ReaderInterceptorFacade((MessageBodyReaderInterceptor)interceptor));
registered = true;
}
if (interceptor instanceof MessageBodyWriterInterceptor)
{
getWriterInterceptorList().add(
new WriterInterceptorRegistry.WriterInterceptorFacade((MessageBodyWriterInterceptor) interceptor));
registered = true;
}
if (!registered)
{
throw new RuntimeException(Messages.MESSAGES.entityNotOfUnderstoodType());
}
}
}