Skip to content
Snippets Groups Projects
Unverified Commit 8f7f2c1f authored by Juan Ignacio Ubeira's avatar Juan Ignacio Ubeira Committed by GitHub
Browse files

Merge pull request #273 from wmlynar/kinetic

Fix for xmlrpc multicall issue
parents cc8f8061 6e893068
No related branches found
No related tags found
No related merge requests found
......@@ -22,6 +22,8 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
......@@ -197,7 +199,11 @@ public abstract class XmlRpcStreamServer extends XmlRpcServer
try {
istream = getInputStream(pConfig, pConnection);
XmlRpcRequest request = getRequest(pConfig, istream);
if (request.getMethodName().equals("system.multicall")) {
result = executeMulticall(request);
} else {
result = execute(request);
}
istream.close();
istream = null;
error = null;
......@@ -252,6 +258,53 @@ public abstract class XmlRpcStreamServer extends XmlRpcServer
log.debug("execute: <-");
}
private Object[] executeMulticall(final XmlRpcRequest pRequest) {
if (pRequest.getParameterCount() != 1)
return null;
Object[] reqs = (Object[]) pRequest.getParameter(0); // call requests
ArrayList<Object> results = new ArrayList<Object>(); // call results
final XmlRpcRequestConfig pConfig = pRequest.getConfig();
// TODO: make concurrent calls?
for (int i = 0; i < reqs.length; i++) {
Object result = null;
try {
@SuppressWarnings("unchecked")
HashMap<String, Object> req = (HashMap<String, Object>) reqs[i];
final String methodName = (String) req.get("methodName");
final Object[] params = (Object[]) req.get("params");
result = execute(new XmlRpcRequest() {
@Override
public XmlRpcRequestConfig getConfig() {
return pConfig;
}
@Override
public String getMethodName() {
return methodName;
}
@Override
public int getParameterCount() {
return params == null ? 0 : params.length;
}
@Override
public Object getParameter(int pIndex) {
return params[pIndex];
}
});
} catch (Throwable t) {
logError(t);
// TODO: should this return an XmlRpc fault?
result = null;
}
results.add(result);
}
Object[] retobj = new Object[] { results };
return retobj;
}
protected void logError(Throwable t) {
final String msg = t.getMessage() == null ? t.getClass().getName() : t.getMessage();
errorLogger.log(msg, t);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment