private Map<String, Object> serviceInvoker(ModelService modelService, Map<String, Object> context) throws GenericServiceException {
if (modelService.location == null || modelService.invoke == null)
throw new GenericServiceException("Cannot locate service to invoke");
Service service = null;
Call call = null;
try {
service = new Service();
call = (Call) service.createCall();
} catch (javax.xml.rpc.JAXRPCException e) {
throw new GenericServiceException("RPC service error", e);
} catch (ServiceException e) {//Add by Andy.Chen 2003.01.15
throw new GenericServiceException("RPC service error", e);
}
URL endPoint = null;
try {
endPoint = new URL(this.getLocation(modelService));
} catch (MalformedURLException e) {
throw new GenericServiceException("Location not a valid URL", e);
}
List<ModelParam> inModelParamList = modelService.getInModelParamList();
if (Debug.infoOn()) Debug.logInfo("[SOAPClientEngine.invoke] : Parameter length - " + inModelParamList.size(), module);
call.setTargetEndpointAddress(endPoint);
if (UtilValidate.isNotEmpty(modelService.nameSpace)) {
call.setOperationName(new QName(modelService.nameSpace, modelService.invoke));
} else {
call.setOperationName(modelService.invoke);
}
int i = 0;
call.setOperation(call.getOperationName().getLocalPart());
List<Object> vParams = new ArrayList<Object>();
for (ModelParam p: inModelParamList) {
if (Debug.infoOn()) Debug.logInfo("[SOAPClientEngine.invoke} : Parameter: " + p.name + " (" + p.mode + ") - " + i, module);
// exclude params that ModelServiceReader insert into (internal params)
if (!p.internal) {
QName qName = call.getParameterTypeByName(p.name); //.getTypeMapping().getTypeQName((Class) ObjectType.classNameClassMap.get(p.type));
call.addParameter(p.name, qName, getMode(p.mode));
vParams.add(context.get(p.name));
}
i++;
}
call.setReturnType(XMLType.XSD_ANYTYPE);
Object[] params=vParams.toArray(new Object[vParams.size()]);
Object result = null;
try {
Debug.logInfo("[SOAPClientEngine.invoke] : Sending Call To SOAP Server", module);
result = call.invoke(params);
} catch (java.rmi.RemoteException e) {
throw new GenericServiceException("RPC error", e);
}
if (Debug.verboseOn()) {
Debug.log("SOAP Service Result - " + result, module);
}
return getResponseParams(call.getMessageContext().getResponseMessage());
}