package org.genedb.crawl.dao.proxy; import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.codehaus.jackson.JsonParseException; import org.codehaus.jackson.JsonParser; import org.codehaus.jackson.JsonToken; import org.codehaus.jackson.type.JavaType; import org.codehaus.jackson.type.TypeReference; import org.genedb.crawl.client.CrawlClient; import org.genedb.crawl.dao.FeatureDAO; import org.genedb.crawl.json.JsonIzer; import org.genedb.crawl.model.Argument; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ValueConstants; import org.codehaus.jackson.map.type.TypeFactory; public class ProxyFeatureMapper { private String[] urls; private JsonIzer jsonIzer = new JsonIzer(); public void proxy () { Proxy.newProxyInstance( ProxyFeatureMapper.class.getClassLoader(), new Class[] {FeatureDAO.class}, new InvocationHandler() { @Override public Object invoke(Object obj, Method method, Object[] arguments) throws Throwable { String mapperName = "features"; String methodName = method.getName(); Class returnType = method.getReturnType(); Annotation[][] methodAnnotations = method.getParameterAnnotations(); List<String> argNames = new ArrayList<String>(); for (Annotation[] paramAnnotations : methodAnnotations) { for (Annotation paramAnnotation : paramAnnotations) { if (paramAnnotation instanceof RequestParam) { RequestParam requestParamAnnotation = (RequestParam)paramAnnotation; String argName = requestParamAnnotation.value(); argNames.add(argName); } } } assert (argNames.size() == arguments.length); Map<String,String[]> parameters = new HashMap<String,String[]>(); for (int i = 0; i < argNames.size(); i++) { String argName = argNames.get(i); Object value = arguments[i]; List<String> valueStrings = new ArrayList<String>(); Object[] valueArray = (Object[]) value; for (Object v : valueArray) { String vString = v.toString(); valueStrings.add(vString); } parameters.put(argName, valueStrings.toArray(new String[valueStrings.size()])); } for (String url : urls) { CrawlClient client = new CrawlClient(url); String result = client.result(mapperName, methodName, parameters); TypeReference tr = new TypeReference<List>() {}; JsonParser parser = jsonIzer.getParser(result); // jsonIzer.getMapper().readValue( // result.toString(), // TypeFactory.collectionType(ArrayList.class, Object.class)); // // // TypeFactory.fromCanonical("org.genedb.crawl.model.Feature"); // // JavaType jt = TypeFactory.collectionType(ArrayList.class, returnType); //TypeFactory. //jsonIzer.getMapper(). } // TODO Auto-generated method stub return null; } }); } private void parseJson(JsonParser jp) throws JsonParseException, IOException { if (jp.nextToken() != JsonToken.START_OBJECT) { throw new IOException("Expected data to start with an Object"); } while (jp.nextToken() != JsonToken.END_OBJECT) { String fieldName = jp.getCurrentName(); jp.nextToken(); } jp.close(); } }