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());
+        }
     }
 }