package com.bizxcel.team.QlikWebServiceProxy.infusionsoft; import java.net.URL; import java.util.AbstractMap; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Vector; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import org.apache.xmlrpc.client.XmlRpcClient; import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.bizxcel.team.QlikWebServiceProxy.ProxyServiceBase; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; @Path("/DataQuery") public class DataQuery extends ProxyServiceBase{ private final Logger logger = LoggerFactory.getLogger(DataQuery.class); @GET @Path("/") // @Consumes("application/json") public Response createProductInJSON(@Context HttpServletRequest request, @QueryParam("url") String url, @QueryParam("privateKey") String privateKey, @QueryParam("tableName") String tableName, @QueryParam("limit") Integer limit, @QueryParam("page") Integer page, @QueryParam("queryField") List<String> queryField, @QueryParam("returnField") List<String> returnField) { Response ret = null; try { /* * Check the IP whitelist */ checkForAllowClient(request); XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); config.setServerURL(new URL(url)); XmlRpcClient xmlrpc = new XmlRpcClient(); xmlrpc.setConfig(config); Vector params = new Vector(); params.addElement(privateKey); params.addElement(tableName); params.addElement(limit); params.addElement(page); /* * TODO:Fix to take actual filters instead of faking it */ params.addElement(new HashMap()); params.addElement(returnField); logger.debug("DataQuery proxy to " + url); Object result = xmlrpc.execute("DataService.query", params); XStream xstream = new XStream(); xstream.alias("row", Map.class); xstream.registerConverter(new MapEntryConverter()); String xml = xstream.toXML(result); //String xml = XML.toString(result); ret = Response.status(Status.OK).entity(xml).build(); } catch (Exception e) { ret = Response.status(Status.INTERNAL_SERVER_ERROR).entity("") .build(); e.printStackTrace(); } return ret; } public static class MapEntryConverter implements Converter { public boolean canConvert(Class clazz) { return AbstractMap.class.isAssignableFrom(clazz); } public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) { AbstractMap map = (AbstractMap) value; for (Object obj : map.entrySet()) { Entry entry = (Entry) obj; writer.startNode(entry.getKey().toString()); writer.setValue(entry.getValue().toString()); writer.endNode(); } } public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { Map<String, String> map = new HashMap<String, String>(); while(reader.hasMoreChildren()) { reader.moveDown(); map.put(reader.getNodeName(), reader.getValue()); reader.moveUp(); } return map; } } }