You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ad...@apache.org on 2012/05/15 18:56:18 UTC
svn commit: r1338792 -
/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallService.java
Author: adrianc
Date: Tue May 15 16:56:17 2012
New Revision: 1338792
URL: http://svn.apache.org/viewvc?rev=1338792&view=rev
Log:
Overhauled Mini-language <call-service> element, second pass.
Modified:
ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallService.java
Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallService.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallService.java?rev=1338792&r1=1338791&r2=1338792&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallService.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallService.java Tue May 15 16:56:17 2012
@@ -20,7 +20,6 @@ package org.ofbiz.minilang.method.callop
import java.util.ArrayList;
import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -33,11 +32,11 @@ import org.ofbiz.base.util.UtilMisc;
import org.ofbiz.base.util.UtilProperties;
import org.ofbiz.base.util.UtilValidate;
import org.ofbiz.base.util.UtilXml;
+import org.ofbiz.base.util.collections.FlexibleMapAccessor;
import org.ofbiz.base.util.collections.FlexibleServletAccessor;
import org.ofbiz.entity.GenericValue;
import org.ofbiz.minilang.MiniLangException;
import org.ofbiz.minilang.SimpleMethod;
-import org.ofbiz.minilang.method.ContextAccessor;
import org.ofbiz.minilang.method.MethodContext;
import org.ofbiz.minilang.method.MethodOperation;
import org.ofbiz.service.GenericServiceException;
@@ -59,32 +58,25 @@ public final class CallService extends M
private final FlexibleMessage errorPrefix;
private final FlexibleMessage errorSuffix;
private final boolean includeUserLogin;
- private final ContextAccessor<Map<String, Object>> inMapAcsr;
+ private final FlexibleMapAccessor<Map<String, Object>> inMapFma;
private final FlexibleMessage messagePrefix;
private final FlexibleMessage messageSuffix;
- /** Require a new transaction for this service */
private final boolean requireNewTransaction;
- /** A list of strings with names of new maps to create */
private final List<String> resultsToMapList;
- /** A list of ResultToFieldDef objects */
- private final List<ResultToFieldDef> resultToFieldList;
- /** the key is the request attribute name, the value is the result name to get */
- private final Map<FlexibleServletAccessor<Object>, ContextAccessor<Object>> resultToRequestMap;
- /** the key is the result entry name, the value is the result name to get */
- private final Map<ContextAccessor<Object>, ContextAccessor<Object>> resultToResultMap;
- /** the key is the session attribute name, the value is the result name to get */
- private final Map<FlexibleServletAccessor<Object>, ContextAccessor<Object>> resultToSessionMap;
+ private final List<ResultToField> resultToFieldList;
+ private final List<ResultToRequest> resultToRequestList;
+ private final List<ResultToResult> resultToResultList;
+ private final List<ResultToSession> resultToSessionList;
private final String serviceName;
private final String successCode;
private final FlexibleMessage successPrefix;
private final FlexibleMessage successSuffix;
- /** Override the default transaction timeout, only works if we start the transaction */
private final int transactionTimeout;
public CallService(Element element, SimpleMethod simpleMethod) throws MiniLangException {
super(element, simpleMethod);
serviceName = element.getAttribute("service-name");
- inMapAcsr = new ContextAccessor<Map<String, Object>>(element.getAttribute("in-map-name"));
+ inMapFma = FlexibleMapAccessor.getInstance(element.getAttribute("in-map-name"));
includeUserLogin = !"false".equals(element.getAttribute("include-user-login"));
breakOnError = !"false".equals(element.getAttribute("break-on-error"));
errorCode = element.getAttribute("error-code");
@@ -120,17 +112,9 @@ public final class CallService extends M
}
List<? extends Element> resultToFieldElements = UtilXml.childElementList(element, "result-to-field");
if (UtilValidate.isNotEmpty(resultToFieldElements)) {
- List<ResultToFieldDef> resultToFieldList = new ArrayList<ResultToFieldDef>(resultToFieldElements.size());
+ List<ResultToField> resultToFieldList = new ArrayList<ResultToField>(resultToFieldElements.size());
for (Element resultToFieldElement : resultToFieldElements) {
- // TODO: Clean this up.
- ResultToFieldDef rtfDef = new ResultToFieldDef();
- rtfDef.resultName = resultToFieldElement.getAttribute("result-name");
- rtfDef.mapAcsr = new ContextAccessor<Map<String, Object>>(resultToFieldElement.getAttribute("map-name"));
- String field = resultToFieldElement.getAttribute("field");
- if (UtilValidate.isEmpty(field))
- field = resultToFieldElement.getAttribute("field-name");
- rtfDef.fieldAcsr = new ContextAccessor<Object>(field, rtfDef.resultName);
- resultToFieldList.add(rtfDef);
+ resultToFieldList.add(new ResultToField(resultToFieldElement));
}
this.resultToFieldList = Collections.unmodifiableList(resultToFieldList);
} else {
@@ -138,39 +122,33 @@ public final class CallService extends M
}
List<? extends Element> resultToRequestElements = UtilXml.childElementList(element, "result-to-request");
if (UtilValidate.isNotEmpty(resultToRequestElements)) {
- Map<FlexibleServletAccessor<Object>, ContextAccessor<Object>> resultToRequestMap = new HashMap<FlexibleServletAccessor<Object>, ContextAccessor<Object>>(resultToRequestElements.size());
+ List<ResultToRequest> resultToRequestList = new ArrayList<ResultToRequest>(resultToRequestElements.size());
for (Element resultToRequestElement : resultToRequestElements) {
- FlexibleServletAccessor<Object> reqAcsr = new FlexibleServletAccessor<Object>(resultToRequestElement.getAttribute("request-name"), resultToRequestElement.getAttribute("result-name"));
- ContextAccessor<Object> resultAcsr = new ContextAccessor<Object>(resultToRequestElement.getAttribute("result-name"));
- resultToRequestMap.put(reqAcsr, resultAcsr);
+ resultToRequestList.add(new ResultToRequest(resultToRequestElement));
}
- this.resultToRequestMap = Collections.unmodifiableMap(resultToRequestMap);
+ this.resultToRequestList = Collections.unmodifiableList(resultToRequestList);
} else {
- this.resultToRequestMap = null;
+ this.resultToRequestList = null;
}
List<? extends Element> resultToSessionElements = UtilXml.childElementList(element, "result-to-session");
if (UtilValidate.isNotEmpty(resultToSessionElements)) {
- Map<FlexibleServletAccessor<Object>, ContextAccessor<Object>> resultToSessionMap = new HashMap<FlexibleServletAccessor<Object>, ContextAccessor<Object>>(resultToSessionElements.size());
+ List<ResultToSession> resultToSessionList = new ArrayList<ResultToSession>(resultToSessionElements.size());
for (Element resultToSessionElement : resultToSessionElements) {
- FlexibleServletAccessor<Object> sesAcsr = new FlexibleServletAccessor<Object>(resultToSessionElement.getAttribute("session-name"), resultToSessionElement.getAttribute("result-name"));
- ContextAccessor<Object> resultAcsr = new ContextAccessor<Object>(resultToSessionElement.getAttribute("result-name"));
- resultToSessionMap.put(sesAcsr, resultAcsr);
+ resultToSessionList.add(new ResultToSession(resultToSessionElement));
}
- this.resultToSessionMap = Collections.unmodifiableMap(resultToSessionMap);
+ this.resultToSessionList = Collections.unmodifiableList(resultToSessionList);
} else {
- this.resultToSessionMap = null;
+ this.resultToSessionList = null;
}
List<? extends Element> resultToResultElements = UtilXml.childElementList(element, "result-to-result");
if (UtilValidate.isNotEmpty(resultToResultElements)) {
- Map<ContextAccessor<Object>, ContextAccessor<Object>> resultToResultMap = new HashMap<ContextAccessor<Object>, ContextAccessor<Object>>(resultToResultElements.size());
+ List<ResultToResult> resultToResultList = new ArrayList<ResultToResult>(resultToResultElements.size());
for (Element resultToResultElement : resultToResultElements) {
- ContextAccessor<Object> serResAcsr = new ContextAccessor<Object>(resultToResultElement.getAttribute("service-result-name"), resultToResultElement.getAttribute("result-name"));
- ContextAccessor<Object> resultAcsr = new ContextAccessor<Object>(resultToResultElement.getAttribute("result-name"));
- resultToResultMap.put(serResAcsr, resultAcsr);
+ resultToResultList.add(new ResultToResult(resultToResultElement));
}
- this.resultToResultMap = Collections.unmodifiableMap(resultToResultMap);
+ this.resultToResultList = Collections.unmodifiableList(resultToResultList);
} else {
- this.resultToResultMap = null;
+ this.resultToResultList = null;
}
}
@@ -185,15 +163,9 @@ public final class CallService extends M
if (successCode.isEmpty()) {
successCode = simpleMethod.getDefaultSuccessCode();
}
- Map<String, Object> inMap = null;
- if (inMapAcsr.isEmpty()) {
+ Map<String, Object> inMap = inMapFma.get(methodContext.getEnvMap());
+ if (inMap == null) {
inMap = FastMap.newInstance();
- } else {
- inMap = inMapAcsr.get(methodContext);
- if (inMap == null) {
- inMap = FastMap.newInstance();
- inMapAcsr.put(methodContext, inMap);
- }
}
// before invoking the service, clear messages
if (methodContext.getMethodType() == MethodContext.EVENT) {
@@ -205,8 +177,6 @@ public final class CallService extends M
methodContext.removeEnv(simpleMethod.getServiceSuccessMessageName());
methodContext.removeEnv(simpleMethod.getServiceResponseMessageName());
}
- // invoke the service
- Map<String, Object> result = null;
// add UserLogin to context if expected
if (includeUserLogin) {
GenericValue userLogin = methodContext.getUserLogin();
@@ -219,6 +189,8 @@ public final class CallService extends M
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.transactionTimeout;
@@ -227,7 +199,7 @@ public final class CallService extends M
}
result = methodContext.getDispatcher().runSync(serviceName, inMap, timeout, requireNewTransaction);
} catch (GenericServiceException e) {
- String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process [problem invoking the [" + serviceName + "] service with the map named [" + inMapAcsr + "] containing [" + inMap + "]: " + 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) {
@@ -248,43 +220,24 @@ public final class CallService extends M
}
}
if (resultToFieldList != null) {
- for (ResultToFieldDef rtfDef : resultToFieldList) {
- if (!rtfDef.mapAcsr.isEmpty()) {
- Map<String, Object> tempMap = rtfDef.mapAcsr.get(methodContext);
- if (tempMap == null) {
- tempMap = FastMap.newInstance();
- rtfDef.mapAcsr.put(methodContext, tempMap);
- }
- rtfDef.fieldAcsr.put(tempMap, result.get(rtfDef.resultName), methodContext);
- } else {
- rtfDef.fieldAcsr.put(methodContext, result.get(rtfDef.resultName));
- }
+ for (ResultToField rtfDef : resultToFieldList) {
+ rtfDef.exec(methodContext, result);
}
}
- // only run this if it is in an EVENT context
- if (methodContext.getMethodType() == MethodContext.EVENT) {
- if (resultToRequestMap != null) {
- for (Map.Entry<FlexibleServletAccessor<Object>, ContextAccessor<Object>> entry : resultToRequestMap.entrySet()) {
- FlexibleServletAccessor<Object> requestAcsr = entry.getKey();
- ContextAccessor<Object> resultAcsr = entry.getValue();
- requestAcsr.put(methodContext.getRequest(), resultAcsr.get(result, methodContext), methodContext.getEnvMap());
- }
+ if (resultToResultList != null) {
+ for (ResultToResult rtrDef : resultToResultList) {
+ rtrDef.exec(methodContext, result);
}
- if (resultToSessionMap != null) {
- for (Map.Entry<FlexibleServletAccessor<Object>, ContextAccessor<Object>> entry : resultToSessionMap.entrySet()) {
- FlexibleServletAccessor<Object> sessionAcsr = entry.getKey();
- ContextAccessor<Object> resultAcsr = entry.getValue();
- sessionAcsr.put(methodContext.getRequest().getSession(), resultAcsr.get(result, methodContext), methodContext.getEnvMap());
+ }
+ if (methodContext.getMethodType() == MethodContext.EVENT) {
+ if (resultToRequestList != null) {
+ for (ResultToRequest rtrDef : resultToRequestList) {
+ rtrDef.exec(methodContext, result);
}
}
- }
- // only run this if it is in an SERVICE context
- if (methodContext.getMethodType() == MethodContext.SERVICE) {
- if (resultToResultMap != null) {
- for (Map.Entry<ContextAccessor<Object>, ContextAccessor<Object>> entry : resultToResultMap.entrySet()) {
- ContextAccessor<Object> targetResultAcsr = entry.getKey();
- ContextAccessor<Object> resultAcsr = entry.getValue();
- targetResultAcsr.put(methodContext.getResults(), resultAcsr.get(result, methodContext), methodContext);
+ if (resultToSessionList != null) {
+ for (ResultToSession rtsDef : resultToSessionList) {
+ rtsDef.exec(methodContext, result);
}
}
}
@@ -317,9 +270,6 @@ public final class CallService extends M
}
} else if (methodContext.getMethodType() == MethodContext.SERVICE) {
ServiceUtil.addErrors(UtilMisc.<String, String> getListFromMap(methodContext.getEnvMap(), this.simpleMethod.getServiceErrorMessageListName()), UtilMisc.<String, String, Object> getMapFromMap(methodContext.getEnvMap(), this.simpleMethod.getServiceErrorMessageMapName()), result);
- // the old way, makes a mess of messages passed up the stack:
- // methodContext.putEnv(simpleMethod.getServiceErrorMessageName(),
- // errorMessage);
Debug.logError(new Exception(errorMessage), module);
}
}
@@ -389,9 +339,68 @@ public final class CallService extends M
}
}
- public static class ResultToFieldDef {
- public ContextAccessor<Object> fieldAcsr;
- public ContextAccessor<Map<String, Object>> mapAcsr;
- public String resultName;
+ private final class ResultToField {
+ private final FlexibleMapAccessor<Object> fieldFma;
+ private final String resultName;
+
+ private ResultToField(Element element) {
+ resultName = element.getAttribute("result-name");
+ String fieldAttribute = element.getAttribute("field");
+ if (fieldAttribute.isEmpty()) {
+ fieldAttribute = resultName;
+ }
+ fieldFma = FlexibleMapAccessor.getInstance(fieldAttribute);
+ }
+
+ private void exec(MethodContext methodContext, Map<String, Object> resultMap) {
+ fieldFma.put(methodContext.getEnvMap(), resultMap.get(resultName));
+ }
+ }
+
+ private final class ResultToRequest {
+ private final FlexibleMapAccessor<Object> resultFma;
+ private final FlexibleServletAccessor<Object> requestFsa;
+
+ private ResultToRequest(Element element) {
+ requestFsa = new FlexibleServletAccessor<Object>(element.getAttribute("request-name"), element.getAttribute("result-name"));
+ resultFma =FlexibleMapAccessor.getInstance(element.getAttribute("result-name"));
+ }
+
+ private void exec(MethodContext methodContext, Map<String, Object> resultMap) {
+ requestFsa.put(methodContext.getRequest(), resultFma.get(resultMap), methodContext.getEnvMap());
+ }
+ }
+
+ private final class ResultToResult {
+ private final FlexibleMapAccessor<Object> resultFma;
+ private final FlexibleMapAccessor<Object> serviceResultFma;
+
+ private ResultToResult(Element element) {
+ resultFma = FlexibleMapAccessor.getInstance(element.getAttribute("result-name"));
+ String serviceResultAttribute = element.getAttribute("service-result-name");
+ if (serviceResultAttribute.isEmpty()) {
+ serviceResultFma = resultFma;
+ } else {
+ serviceResultFma = FlexibleMapAccessor.getInstance(serviceResultAttribute);
+ }
+ }
+
+ private void exec(MethodContext methodContext, Map<String, Object> resultMap) {
+ serviceResultFma.put(methodContext.getResults(), resultFma.get(resultMap));
+ }
+ }
+
+ private final class ResultToSession {
+ private final FlexibleMapAccessor<Object> resultFma;
+ private final FlexibleServletAccessor<Object> requestFsa;
+
+ private ResultToSession(Element element) {
+ requestFsa = new FlexibleServletAccessor<Object>(element.getAttribute("session-name"), element.getAttribute("result-name"));
+ resultFma =FlexibleMapAccessor.getInstance(element.getAttribute("result-name"));
+ }
+
+ private void exec(MethodContext methodContext, Map<String, Object> resultMap) {
+ requestFsa.put(methodContext.getRequest().getSession(), resultFma.get(resultMap), methodContext.getEnvMap());
+ }
}
}