package filter.server;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
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 adapters.InterfaceToClass;
import annotations.AllowSubstitution;
import serverLifter.archi.LifterCaller;
import serverLifter.archi.ServerLifterCaller;
@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 :");
// Lifter lifter = new Lifter();
// InputStream input =
// lifter.HTTPAdapter(requestContext.getEntityStream(),info.getResourceMethod());
InputStream input = requestContext.getEntityStream();
Type[] types = info.getResourceMethod().getGenericParameterTypes();
InterfaceToClass adpt;
if (types.length > 0) {
Type expectedType =types[0];
if(expectedType instanceof ParameterizedType){
ParameterizedType typeP=(ParameterizedType) expectedType;
adpt = new InterfaceToClass(((Class<?>)typeP.getActualTypeArguments()[0]).getPackage());
}
else{
if(true){
adpt = new InterfaceToClass(((Class<?>)expectedType).getPackage());
}
}
LifterCaller lifterCaller = new ServerLifterCaller(input, expectedType,
adpt);
InputStream output = lifterCaller.callStream();
requestContext.setEntityStream(output);
}
System.out.println("Fin du filtre de la requête :");
}
}