Skip to content
This repository was archived by the owner on Aug 11, 2023. It is now read-only.

Commit 8f7f2c1

Browse files
author
Juan Ignacio Ubeira
authored
Merge pull request #273 from wmlynar/kinetic
Fix for xmlrpc multicall issue
2 parents cc8f806 + 6e89306 commit 8f7f2c1

File tree

1 file changed

+54
-1
lines changed

1 file changed

+54
-1
lines changed

apache_xmlrpc_server/src/main/java/org/apache/xmlrpc/server/XmlRpcStreamServer.java

+54-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import java.io.IOException;
2323
import java.io.InputStream;
2424
import java.io.OutputStream;
25+
import java.util.ArrayList;
26+
import java.util.HashMap;
2527
import java.util.List;
2628
import java.util.zip.GZIPInputStream;
2729
import java.util.zip.GZIPOutputStream;
@@ -197,7 +199,11 @@ public void execute(XmlRpcStreamRequestConfig pConfig,
197199
try {
198200
istream = getInputStream(pConfig, pConnection);
199201
XmlRpcRequest request = getRequest(pConfig, istream);
200-
result = execute(request);
202+
if (request.getMethodName().equals("system.multicall")) {
203+
result = executeMulticall(request);
204+
} else {
205+
result = execute(request);
206+
}
201207
istream.close();
202208
istream = null;
203209
error = null;
@@ -251,6 +257,53 @@ public void execute(XmlRpcStreamRequestConfig pConfig,
251257
}
252258
log.debug("execute: <-");
253259
}
260+
261+
private Object[] executeMulticall(final XmlRpcRequest pRequest) {
262+
if (pRequest.getParameterCount() != 1)
263+
return null;
264+
265+
Object[] reqs = (Object[]) pRequest.getParameter(0); // call requests
266+
ArrayList<Object> results = new ArrayList<Object>(); // call results
267+
final XmlRpcRequestConfig pConfig = pRequest.getConfig();
268+
// TODO: make concurrent calls?
269+
for (int i = 0; i < reqs.length; i++) {
270+
Object result = null;
271+
try {
272+
@SuppressWarnings("unchecked")
273+
HashMap<String, Object> req = (HashMap<String, Object>) reqs[i];
274+
final String methodName = (String) req.get("methodName");
275+
final Object[] params = (Object[]) req.get("params");
276+
result = execute(new XmlRpcRequest() {
277+
@Override
278+
public XmlRpcRequestConfig getConfig() {
279+
return pConfig;
280+
}
281+
282+
@Override
283+
public String getMethodName() {
284+
return methodName;
285+
}
286+
287+
@Override
288+
public int getParameterCount() {
289+
return params == null ? 0 : params.length;
290+
}
291+
292+
@Override
293+
public Object getParameter(int pIndex) {
294+
return params[pIndex];
295+
}
296+
});
297+
} catch (Throwable t) {
298+
logError(t);
299+
// TODO: should this return an XmlRpc fault?
300+
result = null;
301+
}
302+
results.add(result);
303+
}
304+
Object[] retobj = new Object[] { results };
305+
return retobj;
306+
}
254307

255308
protected void logError(Throwable t) {
256309
final String msg = t.getMessage() == null ? t.getClass().getName() : t.getMessage();

0 commit comments

Comments
 (0)