|
22 | 22 | import java.io.IOException;
|
23 | 23 | import java.io.InputStream;
|
24 | 24 | import java.io.OutputStream;
|
| 25 | +import java.util.ArrayList; |
| 26 | +import java.util.HashMap; |
25 | 27 | import java.util.List;
|
26 | 28 | import java.util.zip.GZIPInputStream;
|
27 | 29 | import java.util.zip.GZIPOutputStream;
|
@@ -197,7 +199,11 @@ public void execute(XmlRpcStreamRequestConfig pConfig,
|
197 | 199 | try {
|
198 | 200 | istream = getInputStream(pConfig, pConnection);
|
199 | 201 | 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 | + } |
201 | 207 | istream.close();
|
202 | 208 | istream = null;
|
203 | 209 | error = null;
|
@@ -251,6 +257,53 @@ public void execute(XmlRpcStreamRequestConfig pConfig,
|
251 | 257 | }
|
252 | 258 | log.debug("execute: <-");
|
253 | 259 | }
|
| 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 | + } |
254 | 307 |
|
255 | 308 | protected void logError(Throwable t) {
|
256 | 309 | final String msg = t.getMessage() == null ? t.getClass().getName() : t.getMessage();
|
|
0 commit comments