package org.lodder.subtools.sublibrary.data; import java.net.URL; import java.util.Map; import java.util.Map.Entry; import java.util.NoSuchElementException; import java.util.Scanner; import java.util.Vector; import org.apache.xmlrpc.XmlRpcException; import org.apache.xmlrpc.client.XmlRpcClient; import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; public class XmlRPC { private final String apiServer; private String userAgent; private String token; public XmlRPC(String userAgent, String apiServer) { this.apiServer = apiServer; this.userAgent = userAgent; } protected Map<?, ?> invoke(String method, Object[] arguments) throws Exception { XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); config.setServerURL(new URL(getApiServer())); XmlRpcClient client = new XmlRpcClient(); client.setConfig(config); Map<?, ?> response = (Map<?, ?>) client.execute(method, arguments); checkResponse(response); return response; } protected Map<?, ?> invoke(String method, Vector<Object> arguments) throws Exception { XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); config.setServerURL(new URL(getApiServer())); XmlRpcClient client = new XmlRpcClient(); client.setConfig(config); Map<?, ?> response = (Map<?, ?>) client.execute(method, arguments); checkResponse(response); return response; } /** * Check whether status is OK or not status code and message (e.g. 200 OK, 401 Unauthorized, ...) * * @param response * @throws XmlRpcFault thrown if status code is not OK */ protected void checkResponse(Map<?, ?> response) throws Exception { String status = response.get("status").toString(); if ((status == null) || (status.equals("200 OK")) || (status.equals("200"))) { return; } try { Scanner scanner = new Scanner(status); int nextInt = scanner.nextInt(); scanner.close(); throw new Exception(nextInt + " : " + status); } catch (NoSuchElementException e) {} throw new XmlRpcException("Illegal status code: " + status); } public String getApiServer() { return apiServer; } public String generateXmlRpc(String procname, String s[]) { StringBuilder str = new StringBuilder(); str.append("<?xml version=\"1.0\" encoding=\"utf-8\"?><methodCall><methodName>"); str.append(procname).append("</methodName><params>"); for (String value : s) { str.append("<param><value><string>").append(value).append("</string></value></param>"); } str.append("</params></methodCall>"); return str.toString(); } public String generateXmlRpc(final String method, final Map<String, Object> arguments) { StringBuilder sb = new StringBuilder(); sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?><methodCall><methodName>"); sb.append(method); sb.append("</methodName><params><param><value><string>"); sb.append(getToken()); sb.append("</string></value></param><param><value><struct>"); sb.append("<member><value><struct>"); for (Entry<String, Object> e : arguments.entrySet()){ sb.append(addMapElement(e.getKey(), e.getValue().toString())); } sb.append("</struct></value></member>"); sb.append("</struct></value></param></params></methodCall>"); return sb.toString(); } private static String addMapElement(final String name, final String value) { return "<member><name>" + name + "</name><value><string>" + elementEncoding(value) + "</string></value></member>"; } private static String elementEncoding(String a) { a = a.replace("&", "&"); a = a.replace("<", "<"); a = a.replace(">", ">"); a = a.replace("'", "'"); a = a.replace("\"", """); return a; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } public String getUserAgent() { return userAgent; } public void setUserAgent(String userAgent) { this.userAgent = userAgent; } }