package filter.server; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Arrays; import javax.ws.rs.BindingPriority; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestFilter; import javax.ws.rs.container.ResourceInfo; import javax.ws.rs.core.Context; import javax.ws.rs.ext.Provider; import serverLifter.archi.LifterCaller; import serverLifter.archi.ServerLifterCaller; import serverLifter.archi.list.ServerLifterCallerList; import tools.UniformementRepresentable; import adapters.InterfaceToClass; import annotations.AllowSubstitution; @Provider @AllowSubstitution @BindingPriority(BindingPriority.ENTITY_CODER) public class ClientRequestFilter implements ContainerRequestFilter { @Context ResourceInfo info; public void filter(ContainerRequestContext requestContext) throws IOException { System.out.println("Debut du filtre de la requête :"); InputStream input = requestContext.getEntityStream(); Type[] classes = info.getResourceMethod().getGenericParameterTypes(); if (classes.length > 0) { if (classes[0] instanceof Class<?>) { System.out.println("Filter : treating General case"); if (UniformementRepresentable.isWrapperType((Class)classes[0])){ System.out.println("General type!"); requestContext.setEntityStream(input); } else{ InterfaceToClass adpt = new InterfaceToClass(info .getResourceMethod().getDeclaringClass().getPackage()); Class<?>[] toClassTab = Tools.toClassTab(classes); LifterCaller lifterCaller = new ServerLifterCaller(input, toClassTab, adpt); InputStream output = lifterCaller.callStream(); requestContext.setEntityStream(output); } } else { if (classes[0] instanceof ParameterizedType) { System.out.println("Filter : treating a List"); ParameterizedType expectedType = (ParameterizedType) classes[0]; Class<?> genericType = (Class<?>) (expectedType .getActualTypeArguments()[0]); InterfaceToClass adpt = new InterfaceToClass( genericType.getPackage()); LifterCaller lifterCaller = new ServerLifterCallerList( input, expectedType, adpt); InputStream output = lifterCaller.callStream(); requestContext.setEntityStream(output); } } } System.out.println("Fin du filtre de la requête :"); } }