in framework/minilang/src/main/java/org/apache/ofbiz/minilang/method/callops/CallService.java [171:378]
public boolean exec(MethodContext methodContext) throws MiniLangException {
SimpleMethod simpleMethod = getSimpleMethod();
if (methodContext.isTraceOn()) {
outputTraceMessage(methodContext, "Begin call-service.");
}
String serviceName = serviceNameFse.expandString(methodContext.getEnvMap());
String errorCode = this.errorCode;
if (errorCode.isEmpty()) {
errorCode = simpleMethod.getDefaultErrorCode();
}
String successCode = this.successCode;
if (successCode.isEmpty()) {
successCode = simpleMethod.getDefaultSuccessCode();
}
Map<String, Object> inMap = inMapFma.get(methodContext.getEnvMap());
if (inMap == null) {
inMap = new HashMap<>();
}
// before invoking the service, clear messages
if (methodContext.getMethodType() == MethodContext.EVENT) {
methodContext.removeEnv(simpleMethod.getEventErrorMessageName());
methodContext.removeEnv(simpleMethod.getEventEventMessageName());
methodContext.removeEnv(simpleMethod.getEventResponseCodeName());
} else {
methodContext.removeEnv(simpleMethod.getServiceErrorMessageName());
methodContext.removeEnv(simpleMethod.getServiceSuccessMessageName());
methodContext.removeEnv(simpleMethod.getServiceResponseMessageName());
}
// add UserLogin to context if expected
if (includeUserLogin) {
GenericValue userLogin = methodContext.getUserLogin();
if (userLogin != null && inMap.get("userLogin") == null) {
inMap.put("userLogin", userLogin);
}
}
// always add Locale to context unless null
Locale locale = methodContext.getLocale();
if (locale != null) {
inMap.put("locale", locale);
}
// invoke the service
Map<String, Object> result = null;
try {
ModelService modelService = methodContext.getDispatcher().getDispatchContext().getModelService(serviceName);
int timeout = modelService.getTransactionTimeout();
if (this.transactionTimeout >= 0) {
timeout = this.transactionTimeout;
}
if (methodContext.isTraceOn()) {
outputTraceMessage(methodContext, "Invoking service \"" + serviceName + "\", require-new-transaction = " + requireNewTransaction
+ ", transaction-timeout = " + timeout + ", IN attributes:", inMap.toString());
}
result = methodContext.getDispatcher().runSync(serviceName, inMap, timeout, requireNewTransaction);
} catch (GenericServiceException e) {
if (methodContext.isTraceOn()) {
outputTraceMessage(methodContext, "Service engine threw an exception: " + e.getMessage());
}
String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process [problem invoking the [" + serviceName
+ "] service with the map named [" + inMapFma + "] containing [" + inMap + "]: " + e.getMessage() + "]";
Debug.logError(e, errMsg, MODULE);
if (breakOnError) {
if (methodContext.getMethodType() == MethodContext.EVENT) {
methodContext.putEnv(simpleMethod.getEventErrorMessageName(), errMsg);
methodContext.putEnv(simpleMethod.getEventResponseCodeName(), errorCode);
} else {
methodContext.putEnv(simpleMethod.getServiceErrorMessageName(), errMsg);
methodContext.putEnv(simpleMethod.getServiceResponseMessageName(), errorCode);
}
if (methodContext.isTraceOn()) {
outputTraceMessage(methodContext, "break-on-error set to \"true\", halting script execution. End call-service.");
}
return false;
} else {
if (methodContext.isTraceOn()) {
outputTraceMessage(methodContext, "End call-service.");
}
return true;
}
}
if (resultsToMapList != null) {
if (methodContext.isTraceOn()) {
outputTraceMessage(methodContext, "Processing " + resultsToMapList.size() + " <results-to-map> elements.");
}
for (String mapName : resultsToMapList) {
methodContext.putEnv(mapName, UtilMisc.makeMapWritable(result));
}
}
if (resultToFieldList != null) {
if (methodContext.isTraceOn()) {
outputTraceMessage(methodContext, "Processing " + resultToFieldList.size() + " <result-to-field> elements.");
}
for (ResultToField rtfDef : resultToFieldList) {
rtfDef.exec(methodContext, result);
}
}
if (resultToResultList != null) {
if (methodContext.isTraceOn()) {
outputTraceMessage(methodContext, "Processing " + resultToResultList.size() + " <result-to-result> elements.");
}
for (ResultToResult rtrDef : resultToResultList) {
rtrDef.exec(methodContext, result);
}
}
if (methodContext.getMethodType() == MethodContext.EVENT) {
if (resultToRequestList != null) {
if (methodContext.isTraceOn()) {
outputTraceMessage(methodContext, "Processing " + resultToRequestList.size() + " <result-to-request> elements.");
}
for (ResultToRequest rtrDef : resultToRequestList) {
rtrDef.exec(methodContext, result);
}
}
if (resultToSessionList != null) {
if (methodContext.isTraceOn()) {
outputTraceMessage(methodContext, "Processing " + resultToSessionList.size() + " <result-to-session> elements.");
}
for (ResultToSession rtsDef : resultToSessionList) {
rtsDef.exec(methodContext, result);
}
}
}
String errorPrefixStr = errorPrefix.getMessage(methodContext.getLoader(), methodContext);
String errorSuffixStr = errorSuffix.getMessage(methodContext.getLoader(), methodContext);
String successPrefixStr = successPrefix.getMessage(methodContext.getLoader(), methodContext);
String successSuffixStr = successSuffix.getMessage(methodContext.getLoader(), methodContext);
String messagePrefixStr = messagePrefix.getMessage(methodContext.getLoader(), methodContext);
String messageSuffixStr = messageSuffix.getMessage(methodContext.getLoader(), methodContext);
String errorMessage = null;
List<String> errorMessageList = null;
// See if there is a single message
if (result.containsKey(ModelService.ERROR_MESSAGE)) {
errorMessage = ServiceUtil.makeErrorMessage(result, messagePrefixStr, messageSuffixStr, errorPrefixStr, errorSuffixStr);
} else if (result.containsKey(ModelService.ERROR_MESSAGE_LIST)) {
errorMessageList = UtilGenerics.cast(result.get(ModelService.ERROR_MESSAGE_LIST));
}
if ((UtilValidate.isNotEmpty(errorMessage) || UtilValidate.isNotEmpty(errorMessageList)) && breakOnError) {
if (methodContext.getMethodType() == MethodContext.EVENT) {
if (UtilValidate.isNotEmpty(errorMessage)) {
if (Debug.verboseOn()) {
errorMessage += UtilProperties.getMessage(RESOURCE, "simpleMethod.error_show_service_name",
UtilMisc.toMap("serviceName", serviceName, "methodName", simpleMethod.getMethodName()), locale);
}
methodContext.putEnv(simpleMethod.getEventErrorMessageName(), errorMessage);
} else {
if (Debug.verboseOn()) {
errorMessageList.add(UtilProperties.getMessage(RESOURCE, "simpleMethod.error_show_service_name",
UtilMisc.toMap("serviceName", serviceName, "methodName", simpleMethod.getMethodName()), locale));
}
methodContext.putEnv(simpleMethod.getEventErrorMessageListName(), errorMessageList);
}
} else {
ServiceUtil.addErrors(UtilMisc.<String, String>getListFromMap(methodContext.getEnvMap(),
this.getSimpleMethod().getServiceErrorMessageListName()),
UtilMisc.<String, String, Object>getMapFromMap(methodContext.getEnvMap(), this.getSimpleMethod()
.getServiceErrorMessageMapName()), result);
Debug.logError(new Exception(errorMessage), MODULE);
}
}
String successMessage = ServiceUtil.makeSuccessMessage(result, messagePrefixStr, messageSuffixStr, successPrefixStr, successSuffixStr);
if (UtilValidate.isNotEmpty(successMessage)) {
if (methodContext.getMethodType() == MethodContext.EVENT) {
methodContext.putEnv(simpleMethod.getEventEventMessageName(), successMessage);
} else {
methodContext.putEnv(simpleMethod.getServiceSuccessMessageName(), successMessage);
}
}
String defaultMessageStr = defaultMessage.getMessage(methodContext.getLoader(), methodContext);
if (UtilValidate.isEmpty(errorMessage) && UtilValidate.isEmpty(errorMessageList) && UtilValidate.isEmpty(successMessage)
&& UtilValidate.isNotEmpty(defaultMessageStr)) {
if (methodContext.getMethodType() == MethodContext.EVENT) {
methodContext.putEnv(simpleMethod.getEventEventMessageName(), defaultMessageStr);
} else {
methodContext.putEnv(simpleMethod.getServiceSuccessMessageName(), defaultMessageStr);
}
}
String responseCode = result.containsKey(ModelService.RESPONSE_MESSAGE) ? (String) result.get(ModelService.RESPONSE_MESSAGE) : successCode;
if (errorCode.equals(responseCode)) {
if (methodContext.isTraceOn()) {
outputTraceMessage(methodContext, "Service returned an error.");
}
if (breakOnError) {
if (methodContext.getMethodType() == MethodContext.EVENT) {
methodContext.putEnv(simpleMethod.getEventResponseCodeName(), responseCode);
} else {
methodContext.putEnv(simpleMethod.getServiceResponseMessageName(), responseCode);
}
if (methodContext.isTraceOn()) {
outputTraceMessage(methodContext, "break-on-error set to \"true\", halting script execution. End call-service.");
}
return false;
} else {
if (methodContext.isTraceOn()) {
outputTraceMessage(methodContext, "End call-service.");
}
return true;
}
} else {
if (methodContext.isTraceOn()) {
outputTraceMessage(methodContext, "Service ran successfully. End call-service.");
}
if (methodContext.getMethodType() == MethodContext.EVENT) {
methodContext.putEnv(simpleMethod.getEventResponseCodeName(), responseCode);
} else {
methodContext.putEnv(simpleMethod.getServiceResponseMessageName(), responseCode);
}
return true;
}
}