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 15:29:03 UTC

svn commit: r1338697 - in /ofbiz/trunk/framework/minilang: dtd/simple-methods-v2.xsd src/org/ofbiz/minilang/method/callops/CallService.java

Author: adrianc
Date: Tue May 15 13:29:03 2012
New Revision: 1338697

URL: http://svn.apache.org/viewvc?rev=1338697&view=rev
Log:
Overhauled <call-service> element, first pass.

Modified:
    ofbiz/trunk/framework/minilang/dtd/simple-methods-v2.xsd
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallService.java

Modified: ofbiz/trunk/framework/minilang/dtd/simple-methods-v2.xsd
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/dtd/simple-methods-v2.xsd?rev=1338697&r1=1338696&r2=1338697&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/dtd/simple-methods-v2.xsd (original)
+++ ofbiz/trunk/framework/minilang/dtd/simple-methods-v2.xsd Tue May 15 13:29:03 2012
@@ -615,11 +615,11 @@ under the License.
                     Optional name of a map in the method environment to use as the input map.
                     If you're not going to pass any parameters to the service than you can just
                     leave off the in-map name, although typically in a service tag you will see
-                    a service-name and the in-mapname passed in.
+                    a service-name and the in-map-name passed in.
                 </xs:documentation>
             </xs:annotation>
         </xs:attribute>
-        <xs:attribute name="include-user-login" default="true">
+        <xs:attribute name="include-user-login">
             <xs:annotation>
                 <xs:documentation>
                     Include-user-login by default will include the user login
@@ -638,7 +638,7 @@ under the License.
                 </xs:restriction>
             </xs:simpleType>
         </xs:attribute>
-        <xs:attribute name="break-on-error" default="true">
+        <xs:attribute name="break-on-error">
             <xs:annotation>
                 <xs:documentation>
                     If there's an error in the service by default
@@ -656,21 +656,21 @@ under the License.
                 </xs:restriction>
             </xs:simpleType>
         </xs:attribute>
-        <xs:attribute type="xs:string" name="error-code" default="error">
+        <xs:attribute type="xs:string" name="error-code">
             <xs:annotation>
                 <xs:documentation>
                     Defaults to "error".
                 </xs:documentation>
             </xs:annotation>
         </xs:attribute>
-        <xs:attribute type="xs:string" name="success-code" default="success">
+        <xs:attribute type="xs:string" name="success-code">
             <xs:annotation>
                 <xs:documentation>
                     Defaults to "success".
                 </xs:documentation>
             </xs:annotation>
         </xs:attribute>
-        <xs:attribute name="require-new-transaction" default="false">
+        <xs:attribute name="require-new-transaction">
             <xs:annotation>
                 <xs:documentation>
                     Defines if the simple-method requires a new transaction or not.
@@ -865,7 +865,7 @@ under the License.
         <xs:attribute type="xs:string" name="session-name">
             <xs:annotation>
                 <xs:documentation>
-                    Optionnal session name.
+                    Optional session name.
                 </xs:documentation>
             </xs:annotation>
         </xs:attribute>
@@ -873,36 +873,32 @@ under the License.
     <xs:element name="result-to-result">
         <xs:annotation>
             <xs:documentation>
-                result-to-result is service specific (when the service is being called as a service).
-
-                It will take the result of the service you're calling with the call service operation and it will put it in with the result of the current service.
-                So result-name is the name of the result in the service that was called using the call-service tag.
-
-                NOTE that these attributes are somewhat confusing: result-name is the name of the field in the result of this service call that the value comes FROM;
-                service-result-name is the name of the field in the result of this simple-method called as a service where the value goes TO;
-                in other words FROM result-name and TO service-result-name.
+                Copies service OUT attributes from a called service to the calling service's OUT attributes.
+                Only valid when the script is run in a service.
+                &lt;br/&gt;&lt;br/&gt;
+                Note that the attribute names are somewhat confusing:
+                result-name is the name of the OUT attribute of the called service, and
+                service-result-name is the name of the OUT attribute of the calling service.
+                In other words, copy the OUT attribute FROM result-name TO service-result-name.
             </xs:documentation>
         </xs:annotation>
         <xs:complexType>
-            <xs:attributeGroup ref="attlist.result-to-result"/>
+            <xs:attribute type="xs:string" name="result-name" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        Name of the field in the result of this service call that the value comes FROM.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute type="xs:string" name="service-result-name">
+                <xs:annotation>
+                    <xs:documentation>
+                        Name of the field in the result of this simple-method called as a service where the value goes TO.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
         </xs:complexType>
     </xs:element>
-    <xs:attributeGroup name="attlist.result-to-result">
-        <xs:attribute type="xs:string" name="result-name" use="required">
-            <xs:annotation>
-                <xs:documentation>
-                    Name of the field in the result of this service call that the value comes FROM.
-                </xs:documentation>
-            </xs:annotation>
-        </xs:attribute>
-        <xs:attribute type="xs:string" name="service-result-name">
-            <xs:annotation>
-                <xs:documentation>
-                    Name of the field in the result of this simple-method called as a service where the value goes TO.
-                </xs:documentation>
-            </xs:annotation>
-        </xs:attribute>
-    </xs:attributeGroup>
     <xs:element name="call-service-asynch" substitutionGroup="CallOperations">
         <xs:annotation>
             <xs:documentation>
@@ -978,7 +974,7 @@ under the License.
     <xs:element name="call-bsh" substitutionGroup="CallOperations">
         <xs:annotation>
             <xs:documentation>
-                Executes a BSH script. Deprecated - replace with &lt;script&gt;.
+                Executes a BSH script. Deprecated - replace with script.
                 &lt;br/&gt;&lt;br/&gt;
                 The script can be contained in a Java resource, or a short
                 script can be included in the element body.
@@ -1060,7 +1056,7 @@ under the License.
     <xs:element name="call-object-method" substitutionGroup="CallOperations">
         <xs:annotation>
             <xs:documentation>
-                Calls a method on an existing Java object. Deprecated - replace with &lt;script&gt;.
+                Calls a method on an existing Java object. Deprecated - replace with script.
                 &lt;br/&gt;&lt;br/&gt;
                 The string and field sub-elements are passed to the method as arguments in the order they are specified.
                 If the method returns a value, the value will be put in the named field.
@@ -1098,7 +1094,7 @@ under the License.
     <xs:element name="call-class-method" substitutionGroup="CallOperations">
         <xs:annotation>
             <xs:documentation>
-                Calls a static method on a Java class. Deprecated - replace with &lt;script&gt;.
+                Calls a static method on a Java class. Deprecated - replace with script.
                 &lt;br/&gt;&lt;br/&gt;
                 The string and field sub-elements are passed to the method as arguments in the order they are specified.
                 If the method returns a value, the value will be put in the named field.
@@ -3648,6 +3644,7 @@ under the License.
                 Causes script execution to exit the nearest enclosing loop element.
             </xs:documentation>
         </xs:annotation>
+        <xs:complexType />
     </xs:element>
     <xs:element name="continue" substitutionGroup="ControlOperations">
         <xs:annotation>
@@ -3655,6 +3652,7 @@ under the License.
                 Causes script execution to return to the beginning of the nearest enclosing loop element.
             </xs:documentation>
         </xs:annotation>
+        <xs:complexType />
     </xs:element>
     <xs:element name="return" substitutionGroup="ControlOperations">
         <xs:annotation>
@@ -3677,7 +3675,7 @@ under the License.
     <xs:element name="assert" substitutionGroup="EnvOperations">
         <xs:annotation>
             <xs:documentation>
-                Adds an error to the error list for each condition that evaluates to false.
+                Adds an error message to the error message list for each condition that evaluates to false.
             </xs:documentation>
         </xs:annotation>
         <xs:complexType>
@@ -4285,9 +4283,9 @@ under the License.
                 The check-id tag checks to see if the ID value in the given field is a valid database ID string.
                 An invalid ID field will add an error message to the error message list.
                 &lt;br/&gt;&lt;br/&gt;
-                Valid IDs can be any sequence of characters or digits but must not containt the following characters:
-                space [ ], double quote [&quot;], single quote ['], ampersand [&amp;], question
-                mark [?], less-than sign [&lt;], greater-than sign [&gt;].
+                <![CDATA[Valid IDs can be any sequence of characters or digits but must not contain the following characters:
+                space [ ], double quote ["], single quote ['], ampersand [&], question mark [?],
+                less-than sign [<], greater-than sign [>], forward-slash [/], back-slash [\].]]>
             </xs:documentation>
         </xs:annotation>
         <xs:complexType>
@@ -4302,7 +4300,7 @@ under the License.
                     </xs:documentation>
                 </xs:annotation>
             </xs:attribute>
-            <xs:attribute ref="error-list-name"/>
+            <xs:attribute ref="error-list-name" />
         </xs:complexType>
     </xs:element>
     <!-- the "Other" Operations -->
@@ -4367,7 +4365,7 @@ under the License.
     <xs:element name="now-timestamp" substitutionGroup="OtherOperations">
         <xs:annotation>
             <xs:documentation>
-                Deprecated - use &lt;now&gt;.
+                Deprecated - use now.
             </xs:documentation>
         </xs:annotation>
         <xs:complexType>
@@ -4377,7 +4375,7 @@ under the License.
     <xs:element name="now-date-to-env" substitutionGroup="OtherOperations">
         <xs:annotation>
             <xs:documentation>
-                Deprecated - use &lt;now&gt;.
+                Deprecated - use now.
             </xs:documentation>
         </xs:annotation>
         <xs:complexType>

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=1338697&r1=1338696&r2=1338697&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 13:29:03 2012
@@ -18,11 +18,13 @@
  *******************************************************************************/
 package org.ofbiz.minilang.method.callops;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
-import javolution.util.FastList;
 import javolution.util.FastMap;
 
 import org.ofbiz.base.util.Debug;
@@ -46,52 +48,50 @@ import org.w3c.dom.Element;
 /**
  * Calls a service using the given parameters
  */
-public class CallService extends MethodOperation {
+public final class CallService extends MethodOperation {
 
     public static final String module = CallService.class.getName();
     public static final String resource = "MiniLangErrorUiLabels";
 
-    protected String breakOnErrorStr;
-    protected FlexibleMessage defaultMessage;
-    protected String errorCode;
-    protected FlexibleMessage errorPrefix;
-    protected FlexibleMessage errorSuffix;
-    protected String includeUserLoginStr;
-    protected ContextAccessor<Map<String, Object>> inMapAcsr;
-    protected FlexibleMessage messagePrefix;
-    protected FlexibleMessage messageSuffix;
+    private final boolean breakOnError;
+    private final FlexibleMessage defaultMessage;
+    private final String errorCode;
+    private final FlexibleMessage errorPrefix;
+    private final FlexibleMessage errorSuffix;
+    private final boolean includeUserLogin;
+    private final ContextAccessor<Map<String, Object>> inMapAcsr;
+    private final FlexibleMessage messagePrefix;
+    private final FlexibleMessage messageSuffix;
     /** Require a new transaction for this service */
-    protected String requireNewTransactionStr;
+    private final boolean requireNewTransaction;
     /** A list of strings with names of new maps to create */
-    protected List<String> resultsToMap = FastList.newInstance();
+    private final List<String> resultsToMapList;
     /** A list of ResultToFieldDef objects */
-    protected List<ResultToFieldDef> resultToField = FastList.newInstance();
+    private final List<ResultToFieldDef> resultToFieldList;
     /** the key is the request attribute name, the value is the result name to get */
-    protected Map<FlexibleServletAccessor<Object>, ContextAccessor<Object>> resultToRequest = FastMap.newInstance();
+    private final Map<FlexibleServletAccessor<Object>, ContextAccessor<Object>> resultToRequestMap;
     /** the key is the result entry name, the value is the result name to get */
-    protected Map<ContextAccessor<Object>, ContextAccessor<Object>> resultToResult = FastMap.newInstance();
+    private final Map<ContextAccessor<Object>, ContextAccessor<Object>> resultToResultMap;
     /** the key is the session attribute name, the value is the result name to get */
-    protected Map<FlexibleServletAccessor<Object>, ContextAccessor<Object>> resultToSession = FastMap.newInstance();
-    protected String serviceName;
-    protected String successCode;
-    protected FlexibleMessage successPrefix;
-    protected FlexibleMessage successSuffix;
+    private final Map<FlexibleServletAccessor<Object>, ContextAccessor<Object>> resultToSessionMap;
+    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 */
-    protected int transactionTimeout;
+    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"));
-        includeUserLoginStr = element.getAttribute("include-user-login");
-        breakOnErrorStr = element.getAttribute("break-on-error");
+        includeUserLogin = !"false".equals(element.getAttribute("include-user-login"));
+        breakOnError = !"false".equals(element.getAttribute("break-on-error"));
         errorCode = element.getAttribute("error-code");
-        if (UtilValidate.isEmpty(errorCode))
-            errorCode = "error";
-        this.requireNewTransactionStr = element.getAttribute("require-new-transaction");
-        String timeoutStr = UtilXml.checkEmpty(element.getAttribute("transaction-timeout"), element.getAttribute("transaction-timout"));
+        requireNewTransaction = "true".equals(element.getAttribute("require-new-transaction"));
+        String timeoutStr = UtilXml.checkEmpty(element.getAttribute("transaction-timeout"));
         int timeout = -1;
-        if (!UtilValidate.isEmpty(timeoutStr)) {
+        if (!timeoutStr.isEmpty()) {
             try {
                 timeout = Integer.parseInt(timeoutStr);
             } catch (NumberFormatException e) {
@@ -99,10 +99,8 @@ public class CallService extends MethodO
                 timeout = 0;
             }
         }
-        this.transactionTimeout = timeout;
+        transactionTimeout = timeout;
         successCode = element.getAttribute("success-code");
-        if (UtilValidate.isEmpty(successCode))
-            successCode = "success";
         errorPrefix = new FlexibleMessage(UtilXml.firstChildElement(element, "error-prefix"), "service.error.prefix");
         errorSuffix = new FlexibleMessage(UtilXml.firstChildElement(element, "error-suffix"), "service.error.suffix");
         successPrefix = new FlexibleMessage(UtilXml.firstChildElement(element, "success-prefix"), "service.success.prefix");
@@ -112,59 +110,81 @@ public class CallService extends MethodO
         defaultMessage = new FlexibleMessage(UtilXml.firstChildElement(element, "default-message"), null);// "service.default.message"
         List<? extends Element> resultsToMapElements = UtilXml.childElementList(element, "results-to-map");
         if (UtilValidate.isNotEmpty(resultsToMapElements)) {
+            List<String> resultsToMapList = new ArrayList<String>(resultsToMapElements.size());
             for (Element resultsToMapElement : resultsToMapElements) {
-                resultsToMap.add(resultsToMapElement.getAttribute("map-name"));
+                resultsToMapList.add(resultsToMapElement.getAttribute("map-name"));
             }
+            this.resultsToMapList = Collections.unmodifiableList(resultsToMapList);
+        } else {
+            this.resultsToMapList = null;
         }
         List<? extends Element> resultToFieldElements = UtilXml.childElementList(element, "result-to-field");
         if (UtilValidate.isNotEmpty(resultToFieldElements)) {
+            List<ResultToFieldDef> resultToFieldList = new ArrayList<ResultToFieldDef>(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);
-
-                resultToField.add(rtfDef);
+                resultToFieldList.add(rtfDef);
             }
+            this.resultToFieldList = Collections.unmodifiableList(resultToFieldList);
+        } else {
+            this.resultToFieldList = null;
         }
-        // get result-to-request and result-to-session sub-ops
         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());
             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"));
-                resultToRequest.put(reqAcsr, resultAcsr);
+                resultToRequestMap.put(reqAcsr, resultAcsr);
             }
+            this.resultToRequestMap = Collections.unmodifiableMap(resultToRequestMap);
+        } else {
+            this.resultToRequestMap = 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());
             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"));
-                resultToSession.put(sesAcsr, resultAcsr);
+                resultToSessionMap.put(sesAcsr, resultAcsr);
             }
+            this.resultToSessionMap = Collections.unmodifiableMap(resultToSessionMap);
+        } else {
+            this.resultToSessionMap = 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());
             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"));
-                resultToResult.put(serResAcsr, resultAcsr);
+                resultToResultMap.put(serResAcsr, resultAcsr);
             }
+            this.resultToResultMap = Collections.unmodifiableMap(resultToResultMap);
+        } else {
+            this.resultToResultMap = null;
         }
     }
 
     @Override
     public boolean exec(MethodContext methodContext) throws MiniLangException {
-        boolean includeUserLogin = !"false".equals(methodContext.expandString(includeUserLoginStr));
-        boolean breakOnError = !"false".equals(methodContext.expandString(breakOnErrorStr));
         String serviceName = methodContext.expandString(this.serviceName);
-        String errorCode = methodContext.expandString(this.errorCode);
-        String successCode = methodContext.expandString(this.successCode);
+        String errorCode = this.errorCode;
+        if (errorCode.isEmpty()) {
+            errorCode = simpleMethod.getDefaultErrorCode();
+        }
+        String successCode = this.successCode;
+        if (successCode.isEmpty()) {
+            successCode = simpleMethod.getDefaultSuccessCode();
+        }
         Map<String, Object> inMap = null;
         if (inMapAcsr.isEmpty()) {
             inMap = FastMap.newInstance();
@@ -200,20 +220,12 @@ public class CallService extends MethodO
             inMap.put("locale", locale);
         }
         try {
-            if (UtilValidate.isEmpty(this.requireNewTransactionStr) && this.transactionTimeout < 0) {
-                result = methodContext.getDispatcher().runSync(serviceName, inMap);
-            } else {
-                ModelService modelService = methodContext.getDispatcher().getDispatchContext().getModelService(serviceName);
-                boolean requireNewTransaction = modelService.requireNewTransaction;
-                int timeout = modelService.transactionTimeout;
-                if (UtilValidate.isNotEmpty(this.requireNewTransactionStr)) {
-                    requireNewTransaction = "true".equalsIgnoreCase(this.requireNewTransactionStr) ? true : false;
-                }
-                if (this.transactionTimeout >= 0) {
-                    timeout = this.transactionTimeout;
-                }
-                result = methodContext.getDispatcher().runSync(serviceName, inMap, timeout, requireNewTransaction);
+            ModelService modelService = methodContext.getDispatcher().getDispatchContext().getModelService(serviceName);
+            int timeout = modelService.transactionTimeout;
+            if (this.transactionTimeout >= 0) {
+                timeout = this.transactionTimeout;
             }
+            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() + "]";
             Debug.logError(e, errMsg, module);
@@ -230,13 +242,13 @@ public class CallService extends MethodO
                 return true;
             }
         }
-        if (resultsToMap.size() > 0) {
-            for (String mapName : resultsToMap) {
+        if (resultsToMapList != null) {
+            for (String mapName : resultsToMapList) {
                 methodContext.putEnv(mapName, UtilMisc.makeMapWritable(result));
             }
         }
-        if (resultToField.size() > 0) {
-            for (ResultToFieldDef rtfDef : resultToField) {
+        if (resultToFieldList != null) {
+            for (ResultToFieldDef rtfDef : resultToFieldList) {
                 if (!rtfDef.mapAcsr.isEmpty()) {
                     Map<String, Object> tempMap = rtfDef.mapAcsr.get(methodContext);
                     if (tempMap == null) {
@@ -251,15 +263,15 @@ public class CallService extends MethodO
         }
         // only run this if it is in an EVENT context
         if (methodContext.getMethodType() == MethodContext.EVENT) {
-            if (resultToRequest.size() > 0) {
-                for (Map.Entry<FlexibleServletAccessor<Object>, ContextAccessor<Object>> entry : resultToRequest.entrySet()) {
+            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 (resultToSession.size() > 0) {
-                for (Map.Entry<FlexibleServletAccessor<Object>, ContextAccessor<Object>> entry : resultToSession.entrySet()) {
+            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());
@@ -268,8 +280,8 @@ public class CallService extends MethodO
         }
         // only run this if it is in an SERVICE context
         if (methodContext.getMethodType() == MethodContext.SERVICE) {
-            if (resultToResult.size() > 0) {
-                for (Map.Entry<ContextAccessor<Object>, ContextAccessor<Object>> entry : resultToResult.entrySet()) {
+            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);