1 24 package org.ofbiz.minilang.method.callops; 25 26 import java.util.HashMap ; 27 import java.util.Iterator ; 28 import java.util.LinkedList ; 29 import java.util.List ; 30 import java.util.Locale ; 31 import java.util.Map ; 32 33 import org.ofbiz.base.util.Debug; 34 import org.ofbiz.base.util.UtilValidate; 35 import org.ofbiz.base.util.UtilXml; 36 import org.ofbiz.base.util.collections.FlexibleServletAccessor; 37 import org.ofbiz.entity.GenericValue; 38 import org.ofbiz.minilang.SimpleMethod; 39 import org.ofbiz.minilang.method.ContextAccessor; 40 import org.ofbiz.minilang.method.MethodContext; 41 import org.ofbiz.minilang.method.MethodOperation; 42 import org.ofbiz.service.GenericServiceException; 43 import org.ofbiz.service.ModelService; 44 import org.ofbiz.service.ServiceUtil; 45 import org.w3c.dom.Element ; 46 47 55 public class CallService extends MethodOperation { 56 57 public static final String module = CallService.class.getName(); 58 59 String serviceName; 60 ContextAccessor inMapAcsr; 61 String includeUserLoginStr; 62 String breakOnErrorStr; 63 String errorCode; 64 String successCode; 65 66 FlexibleMessage errorPrefix; 67 FlexibleMessage errorSuffix; 68 FlexibleMessage successPrefix; 69 FlexibleMessage successSuffix; 70 FlexibleMessage messagePrefix; 71 FlexibleMessage messageSuffix; 72 FlexibleMessage defaultMessage; 73 74 75 List resultsToMap = new LinkedList (); 76 77 78 List resultToField = new LinkedList (); 79 80 81 Map resultToRequest = new HashMap (); 82 83 84 Map resultToSession = new HashMap (); 85 86 87 Map resultToResult = new HashMap (); 88 89 public CallService(Element element, SimpleMethod simpleMethod) { 90 super(element, simpleMethod); 91 serviceName = element.getAttribute("service-name"); 92 inMapAcsr = new ContextAccessor(element.getAttribute("in-map-name")); 93 includeUserLoginStr = element.getAttribute("include-user-login"); 94 breakOnErrorStr = element.getAttribute("break-on-error"); 95 errorCode = element.getAttribute("error-code"); 96 if (errorCode == null || errorCode.length() == 0) errorCode = "error"; 97 98 successCode = element.getAttribute("success-code"); 99 if (successCode == null || successCode.length() == 0) successCode = "success"; 100 101 errorPrefix = new FlexibleMessage(UtilXml.firstChildElement(element, "error-prefix"), "service.error.prefix"); 102 errorSuffix = new FlexibleMessage(UtilXml.firstChildElement(element, "error-suffix"), "service.error.suffix"); 103 successPrefix = new FlexibleMessage(UtilXml.firstChildElement(element, "success-prefix"), "service.success.prefix"); 104 successSuffix = new FlexibleMessage(UtilXml.firstChildElement(element, "success-suffix"), "service.success.suffix"); 105 messagePrefix = new FlexibleMessage(UtilXml.firstChildElement(element, "message-prefix"), "service.message.prefix"); 106 messageSuffix = new FlexibleMessage(UtilXml.firstChildElement(element, "message-suffix"), "service.message.suffix"); 107 defaultMessage = new FlexibleMessage(UtilXml.firstChildElement(element, "default-message"), "service.default.message"); 108 109 List resultsToMapElements = UtilXml.childElementList(element, "results-to-map"); 110 if (resultsToMapElements != null && resultsToMapElements.size() > 0) { 111 Iterator iter = resultsToMapElements.iterator(); 112 while (iter.hasNext()) { 113 Element resultsToMapElement = (Element ) iter.next(); 114 115 resultsToMap.add(resultsToMapElement.getAttribute("map-name")); 116 } 117 } 118 119 List resultToFieldElements = UtilXml.childElementList(element, "result-to-field"); 120 if (resultToFieldElements != null && resultToFieldElements.size() > 0) { 121 Iterator iter = resultToFieldElements.iterator(); 122 while (iter.hasNext()) { 123 Element resultToFieldElement = (Element ) iter.next(); 124 ResultToFieldDef rtfDef = new ResultToFieldDef(); 125 126 rtfDef.resultName = resultToFieldElement.getAttribute("result-name"); 127 rtfDef.mapAcsr = new ContextAccessor(resultToFieldElement.getAttribute("map-name")); 128 rtfDef.fieldAcsr = new ContextAccessor(resultToFieldElement.getAttribute("field-name"), rtfDef.resultName); 129 130 resultToField.add(rtfDef); 131 } 132 } 133 134 List resultToRequestElements = UtilXml.childElementList(element, "result-to-request"); 136 if (resultToRequestElements != null && resultToRequestElements.size() > 0) { 137 Iterator iter = resultToRequestElements.iterator(); 138 while (iter.hasNext()) { 139 Element resultToRequestElement = (Element ) iter.next(); 140 FlexibleServletAccessor reqAcsr = new FlexibleServletAccessor(resultToRequestElement.getAttribute("request-name"), resultToRequestElement.getAttribute("result-name")); 141 ContextAccessor resultAcsr = new ContextAccessor(resultToRequestElement.getAttribute("result-name")); 142 resultToRequest.put(reqAcsr, resultAcsr); 143 } 144 } 145 146 List resultToSessionElements = UtilXml.childElementList(element, "result-to-session"); 147 if (resultToSessionElements != null && resultToSessionElements.size() > 0) { 148 Iterator iter = resultToSessionElements.iterator(); 149 while (iter.hasNext()) { 150 Element resultToSessionElement = (Element ) iter.next(); 151 FlexibleServletAccessor sesAcsr = new FlexibleServletAccessor(resultToSessionElement.getAttribute("session-name"), resultToSessionElement.getAttribute("result-name")); 152 ContextAccessor resultAcsr = new ContextAccessor(resultToSessionElement.getAttribute("result-name")); 153 resultToSession.put(sesAcsr, resultAcsr); 154 } 155 } 156 157 List resultToResultElements = UtilXml.childElementList(element, "result-to-result"); 158 if (resultToResultElements != null && resultToResultElements.size() > 0) { 159 Iterator iter = resultToResultElements.iterator(); 160 while (iter.hasNext()) { 161 Element resultToResultElement = (Element ) iter.next(); 162 ContextAccessor serResAcsr = new ContextAccessor(resultToResultElement.getAttribute("service-result-name"), resultToResultElement.getAttribute("result-name")); 163 ContextAccessor resultAcsr = new ContextAccessor(resultToResultElement.getAttribute("result-name")); 164 resultToResult.put(serResAcsr, resultAcsr); 165 } 166 } 167 } 168 169 public boolean exec(MethodContext methodContext) { 170 boolean includeUserLogin = !"false".equals(methodContext.expandString(includeUserLoginStr)); 171 boolean breakOnError = !"false".equals(methodContext.expandString(breakOnErrorStr)); 172 173 String serviceName = methodContext.expandString(this.serviceName); 174 String errorCode = methodContext.expandString(this.errorCode); 175 String successCode = methodContext.expandString(this.successCode); 176 177 Map inMap = null; 178 if (inMapAcsr.isEmpty()) { 179 inMap = new HashMap (); 180 } else { 181 inMap = (Map ) inMapAcsr.get(methodContext); 182 if (inMap == null) { 183 inMap = new HashMap (); 184 inMapAcsr.put(methodContext, inMap); 185 } 186 } 187 188 if (methodContext.getMethodType() == MethodContext.EVENT) { 190 methodContext.removeEnv(simpleMethod.getEventErrorMessageName()); 191 methodContext.removeEnv(simpleMethod.getEventEventMessageName()); 192 methodContext.removeEnv(simpleMethod.getEventResponseCodeName()); 193 } else if (methodContext.getMethodType() == MethodContext.SERVICE) { 194 methodContext.removeEnv(simpleMethod.getServiceErrorMessageName()); 195 methodContext.removeEnv(simpleMethod.getServiceSuccessMessageName()); 196 methodContext.removeEnv(simpleMethod.getServiceResponseMessageName()); 197 } 198 199 Map result = null; 201 202 if (includeUserLogin) { 204 GenericValue userLogin = methodContext.getUserLogin(); 205 206 if (userLogin != null) { 207 inMap.put("userLogin", userLogin); 208 } 209 } 210 211 Locale locale = methodContext.getLocale(); 213 if (locale != null) { 214 inMap.put("locale", locale); 215 } 216 217 try { 218 result = methodContext.getDispatcher().runSync(serviceName, inMap); 219 } catch (GenericServiceException e) { 220 Debug.logError(e, module); 221 String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process [problem invoking the [" + serviceName + "] service with the map named [" + inMapAcsr + "] containing [" + inMap + "]: " + e.getMessage() + "]"; 222 if (methodContext.getMethodType() == MethodContext.EVENT) { 223 methodContext.putEnv(simpleMethod.getEventErrorMessageName(), errMsg); 224 methodContext.putEnv(simpleMethod.getEventResponseCodeName(), errorCode); 225 } else if (methodContext.getMethodType() == MethodContext.SERVICE) { 226 methodContext.putEnv(simpleMethod.getServiceErrorMessageName(), errMsg); 227 methodContext.putEnv(simpleMethod.getServiceResponseMessageName(), errorCode); 228 } 229 return false; 230 } 231 232 if (resultsToMap.size() > 0) { 233 Iterator iter = resultsToMap.iterator(); 234 while (iter.hasNext()) { 235 String mapName = (String ) iter.next(); 236 methodContext.putEnv(mapName, new HashMap (result)); 237 } 238 } 239 240 if (resultToField.size() > 0) { 241 Iterator iter = resultToField.iterator(); 242 while (iter.hasNext()) { 243 ResultToFieldDef rtfDef = (ResultToFieldDef) iter.next(); 244 if (!rtfDef.mapAcsr.isEmpty()) { 245 Map tempMap = (Map ) rtfDef.mapAcsr.get(methodContext); 246 if (tempMap == null) { 247 tempMap = new HashMap (); 248 rtfDef.mapAcsr.put(methodContext, tempMap); 249 } 250 rtfDef.fieldAcsr.put(tempMap, result.get(rtfDef.resultName), methodContext); 251 } else { 252 rtfDef.fieldAcsr.put(methodContext, result.get(rtfDef.resultName)); 253 } 254 } 255 } 256 257 if (methodContext.getMethodType() == MethodContext.EVENT) { 259 if (resultToRequest.size() > 0) { 260 Iterator iter = resultToRequest.entrySet().iterator(); 261 while (iter.hasNext()) { 262 Map.Entry entry = (Map.Entry ) iter.next(); 263 FlexibleServletAccessor requestAcsr = (FlexibleServletAccessor) entry.getKey(); 264 ContextAccessor resultAcsr = (ContextAccessor) entry.getValue(); 265 requestAcsr.put(methodContext.getRequest(), resultAcsr.get(result, methodContext), methodContext.getEnvMap()); 266 } 267 } 268 269 if (resultToSession.size() > 0) { 270 Iterator iter = resultToSession.entrySet().iterator(); 271 while (iter.hasNext()) { 272 Map.Entry entry = (Map.Entry ) iter.next(); 273 FlexibleServletAccessor sessionAcsr = (FlexibleServletAccessor) entry.getKey(); 274 ContextAccessor resultAcsr = (ContextAccessor) entry.getValue(); 275 sessionAcsr.put(methodContext.getRequest().getSession(), resultAcsr.get(result, methodContext), methodContext.getEnvMap()); 276 } 277 } 278 } 279 280 if (methodContext.getMethodType() == MethodContext.SERVICE) { 282 if (resultToResult.size() > 0) { 283 Iterator iter = resultToResult.entrySet().iterator(); 284 while (iter.hasNext()) { 285 Map.Entry entry = (Map.Entry ) iter.next(); 286 ContextAccessor targetResultAcsr = (ContextAccessor) entry.getKey(); 287 ContextAccessor resultAcsr = (ContextAccessor) entry.getValue(); 288 targetResultAcsr.put(methodContext.getResults(), resultAcsr.get(result, methodContext), methodContext); 289 } 290 } 291 } 292 293 String errorPrefixStr = errorPrefix.getMessage(methodContext.getLoader(), methodContext); 294 String errorSuffixStr = errorSuffix.getMessage(methodContext.getLoader(), methodContext); 295 String successPrefixStr = successPrefix.getMessage(methodContext.getLoader(), methodContext); 296 String successSuffixStr = successSuffix.getMessage(methodContext.getLoader(), methodContext); 297 String messagePrefixStr = messagePrefix.getMessage(methodContext.getLoader(), methodContext); 298 String messageSuffixStr = messageSuffix.getMessage(methodContext.getLoader(), methodContext); 299 300 String errorMessage = ServiceUtil.makeErrorMessage(result, messagePrefixStr, messageSuffixStr, errorPrefixStr, errorSuffixStr); 301 if (UtilValidate.isNotEmpty(errorMessage)) { 302 errorMessage += " calling service " + serviceName + " in " + simpleMethod.getMethodName(); 303 if (methodContext.getMethodType() == MethodContext.EVENT) { 304 methodContext.putEnv(simpleMethod.getEventErrorMessageName(), errorMessage); 305 } else if (methodContext.getMethodType() == MethodContext.SERVICE) { 306 methodContext.putEnv(simpleMethod.getServiceErrorMessageName(), errorMessage); 307 } 308 } 309 310 String successMessage = ServiceUtil.makeSuccessMessage(result, messagePrefixStr, messageSuffixStr, successPrefixStr, successSuffixStr); 311 if (UtilValidate.isNotEmpty(successMessage)) { 312 if (methodContext.getMethodType() == MethodContext.EVENT) { 313 methodContext.putEnv(simpleMethod.getEventEventMessageName(), successMessage); 314 } else if (methodContext.getMethodType() == MethodContext.SERVICE) { 315 methodContext.putEnv(simpleMethod.getServiceSuccessMessageName(), successMessage); 316 } 317 } 318 319 String defaultMessageStr = defaultMessage.getMessage(methodContext.getLoader(), methodContext); 320 if (UtilValidate.isEmpty(errorMessage) && UtilValidate.isEmpty(successMessage) && UtilValidate.isNotEmpty(defaultMessageStr)) { 321 if (methodContext.getMethodType() == MethodContext.EVENT) { 322 methodContext.putEnv(simpleMethod.getEventEventMessageName(), defaultMessageStr); 323 } else if (methodContext.getMethodType() == MethodContext.SERVICE) { 324 methodContext.putEnv(simpleMethod.getServiceSuccessMessageName(), defaultMessageStr); 325 } 326 } 327 328 String responseCode = result.containsKey(ModelService.RESPONSE_MESSAGE) ? (String ) result.get(ModelService.RESPONSE_MESSAGE) : successCode; 330 if (methodContext.getMethodType() == MethodContext.EVENT) { 331 methodContext.putEnv(simpleMethod.getEventResponseCodeName(), responseCode); 332 } else if (methodContext.getMethodType() == MethodContext.SERVICE) { 333 methodContext.putEnv(simpleMethod.getServiceResponseMessageName(), responseCode); 334 } 335 336 if (errorCode.equals(responseCode) && breakOnError) { 337 return false; 338 } else { 339 return true; 340 } 341 } 342 343 public String rawString() { 344 return "<call-service/>"; 346 } 347 public String expandedString(MethodContext methodContext) { 348 return this.rawString(); 350 } 351 352 public static class ResultToFieldDef { 353 public String resultName; 354 public ContextAccessor mapAcsr; 355 public ContextAccessor fieldAcsr; 356 } 357 } 358 | Popular Tags |