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


Reply via email to