Skip to content
Snippets Groups Projects
Commit 6a90988f authored by Wojciech Mlynarczyk's avatar Wojciech Mlynarczyk
Browse files

added fix for xmlrpc multicall issue

parent e92b7b78
Branches
Tags
No related merge requests found
...@@ -22,6 +22,8 @@ import java.io.ByteArrayOutputStream; ...@@ -22,6 +22,8 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.zip.GZIPInputStream; import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream; import java.util.zip.GZIPOutputStream;
...@@ -197,7 +199,12 @@ public abstract class XmlRpcStreamServer extends XmlRpcServer ...@@ -197,7 +199,12 @@ public abstract class XmlRpcStreamServer extends XmlRpcServer
try { try {
istream = getInputStream(pConfig, pConnection); istream = getInputStream(pConfig, pConnection);
XmlRpcRequest request = getRequest(pConfig, istream); XmlRpcRequest request = getRequest(pConfig, istream);
// adding multicall functionality here
if (request.getMethodName().equals("system.multicall")) {
result = executeMulticall(request);
} else {
result = execute(request); result = execute(request);
}
istream.close(); istream.close();
istream = null; istream = null;
error = null; error = null;
...@@ -252,6 +259,53 @@ public abstract class XmlRpcStreamServer extends XmlRpcServer ...@@ -252,6 +259,53 @@ public abstract class XmlRpcStreamServer extends XmlRpcServer
log.debug("execute: <-"); 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) { protected void logError(Throwable t) {
final String msg = t.getMessage() == null ? t.getClass().getName() : t.getMessage(); final String msg = t.getMessage() == null ? t.getClass().getName() : t.getMessage();
errorLogger.log(msg, t); 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