KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > ofbiz > minilang > method > callops > CallService


1 /*
2  * $Id: CallService.java 5462 2005-08-05 18:35:48Z jonesde $
3  *
4  * Copyright (c) 2001-2005 The Open For Business Project - www.ofbiz.org
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the "Software"),
8  * to deal in the Software without restriction, including without limitation
9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10  * and/or sell copies of the Software, and to permit persons to whom the
11  * Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included
14  * in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
21  * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
22  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */

24 package org.ofbiz.minilang.method.callops;
25
26 import java.util.HashMap JavaDoc;
27 import java.util.Iterator JavaDoc;
28 import java.util.LinkedList JavaDoc;
29 import java.util.List JavaDoc;
30 import java.util.Locale JavaDoc;
31 import java.util.Map JavaDoc;
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 JavaDoc;
46
47 /**
48  * Calls a service using the given parameters
49  *
50  * @author <a HREF="mailto:jonesde@ofbiz.org">David E. Jones</a>
51  * @author <a HREF="mailto:jaz@ofbiz.org">Andy Zeneski</a>
52  * @version $Rev: 5462 $
53  * @since 2.0
54  */

55 public class CallService extends MethodOperation {
56     
57     public static final String JavaDoc module = CallService.class.getName();
58     
59     String JavaDoc serviceName;
60     ContextAccessor inMapAcsr;
61     String JavaDoc includeUserLoginStr;
62     String JavaDoc breakOnErrorStr;
63     String JavaDoc errorCode;
64     String JavaDoc 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     /** A list of strings with names of new maps to create */
75     List JavaDoc resultsToMap = new LinkedList JavaDoc();
76
77     /** A list of ResultToFieldDef objects */
78     List JavaDoc resultToField = new LinkedList JavaDoc();
79
80     /** the key is the request attribute name, the value is the result name to get */
81     Map JavaDoc resultToRequest = new HashMap JavaDoc();
82
83     /** the key is the session attribute name, the value is the result name to get */
84     Map JavaDoc resultToSession = new HashMap JavaDoc();
85
86     /** the key is the result entry name, the value is the result name to get */
87     Map JavaDoc resultToResult = new HashMap JavaDoc();
88
89     public CallService(Element JavaDoc 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 JavaDoc resultsToMapElements = UtilXml.childElementList(element, "results-to-map");
110         if (resultsToMapElements != null && resultsToMapElements.size() > 0) {
111             Iterator JavaDoc iter = resultsToMapElements.iterator();
112             while (iter.hasNext()) {
113                 Element JavaDoc resultsToMapElement = (Element JavaDoc) iter.next();
114
115                 resultsToMap.add(resultsToMapElement.getAttribute("map-name"));
116             }
117         }
118
119         List JavaDoc resultToFieldElements = UtilXml.childElementList(element, "result-to-field");
120         if (resultToFieldElements != null && resultToFieldElements.size() > 0) {
121             Iterator JavaDoc iter = resultToFieldElements.iterator();
122             while (iter.hasNext()) {
123                 Element JavaDoc resultToFieldElement = (Element JavaDoc) 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         // get result-to-request and result-to-session sub-ops
135
List JavaDoc resultToRequestElements = UtilXml.childElementList(element, "result-to-request");
136         if (resultToRequestElements != null && resultToRequestElements.size() > 0) {
137             Iterator JavaDoc iter = resultToRequestElements.iterator();
138             while (iter.hasNext()) {
139                 Element JavaDoc resultToRequestElement = (Element JavaDoc) 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 JavaDoc resultToSessionElements = UtilXml.childElementList(element, "result-to-session");
147         if (resultToSessionElements != null && resultToSessionElements.size() > 0) {
148             Iterator JavaDoc iter = resultToSessionElements.iterator();
149             while (iter.hasNext()) {
150                 Element JavaDoc resultToSessionElement = (Element JavaDoc) 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 JavaDoc resultToResultElements = UtilXml.childElementList(element, "result-to-result");
158         if (resultToResultElements != null && resultToResultElements.size() > 0) {
159             Iterator JavaDoc iter = resultToResultElements.iterator();
160             while (iter.hasNext()) {
161                 Element JavaDoc resultToResultElement = (Element JavaDoc) 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 JavaDoc serviceName = methodContext.expandString(this.serviceName);
174         String JavaDoc errorCode = methodContext.expandString(this.errorCode);
175         String JavaDoc successCode = methodContext.expandString(this.successCode);
176
177         Map JavaDoc inMap = null;
178         if (inMapAcsr.isEmpty()) {
179             inMap = new HashMap JavaDoc();
180         } else {
181             inMap = (Map JavaDoc) inMapAcsr.get(methodContext);
182             if (inMap == null) {
183                 inMap = new HashMap JavaDoc();
184                 inMapAcsr.put(methodContext, inMap);
185             }
186         }
187
188         // before invoking the service, clear messages
189
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         // invoke the service
200
Map JavaDoc result = null;
201
202         // add UserLogin to context if expected
203
if (includeUserLogin) {
204             GenericValue userLogin = methodContext.getUserLogin();
205
206             if (userLogin != null) {
207                 inMap.put("userLogin", userLogin);
208             }
209         }
210         
211         // always add Locale to context unless null
212
Locale JavaDoc 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 JavaDoc 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 JavaDoc iter = resultsToMap.iterator();
234             while (iter.hasNext()) {
235                 String JavaDoc mapName = (String JavaDoc) iter.next();
236                 methodContext.putEnv(mapName, new HashMap JavaDoc(result));
237             }
238         }
239
240         if (resultToField.size() > 0) {
241             Iterator JavaDoc iter = resultToField.iterator();
242             while (iter.hasNext()) {
243                 ResultToFieldDef rtfDef = (ResultToFieldDef) iter.next();
244                 if (!rtfDef.mapAcsr.isEmpty()) {
245                     Map JavaDoc tempMap = (Map JavaDoc) rtfDef.mapAcsr.get(methodContext);
246                     if (tempMap == null) {
247                         tempMap = new HashMap JavaDoc();
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         // only run this if it is in an EVENT context
258
if (methodContext.getMethodType() == MethodContext.EVENT) {
259             if (resultToRequest.size() > 0) {
260                 Iterator JavaDoc iter = resultToRequest.entrySet().iterator();
261                 while (iter.hasNext()) {
262                     Map.Entry JavaDoc entry = (Map.Entry JavaDoc) 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 JavaDoc iter = resultToSession.entrySet().iterator();
271                 while (iter.hasNext()) {
272                     Map.Entry JavaDoc entry = (Map.Entry JavaDoc) 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         // only run this if it is in an SERVICE context
281
if (methodContext.getMethodType() == MethodContext.SERVICE) {
282             if (resultToResult.size() > 0) {
283                 Iterator JavaDoc iter = resultToResult.entrySet().iterator();
284                 while (iter.hasNext()) {
285                     Map.Entry JavaDoc entry = (Map.Entry JavaDoc) 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 JavaDoc errorPrefixStr = errorPrefix.getMessage(methodContext.getLoader(), methodContext);
294         String JavaDoc errorSuffixStr = errorSuffix.getMessage(methodContext.getLoader(), methodContext);
295         String JavaDoc successPrefixStr = successPrefix.getMessage(methodContext.getLoader(), methodContext);
296         String JavaDoc successSuffixStr = successSuffix.getMessage(methodContext.getLoader(), methodContext);
297         String JavaDoc messagePrefixStr = messagePrefix.getMessage(methodContext.getLoader(), methodContext);
298         String JavaDoc messageSuffixStr = messageSuffix.getMessage(methodContext.getLoader(), methodContext);
299
300         String JavaDoc 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 JavaDoc 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 JavaDoc 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         // handle the result
329
String JavaDoc responseCode = result.containsKey(ModelService.RESPONSE_MESSAGE) ? (String JavaDoc) 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 JavaDoc rawString() {
344         // TODO: something more than the empty tag
345
return "<call-service/>";
346     }
347     public String JavaDoc expandedString(MethodContext methodContext) {
348         // TODO: something more than a stub/dummy
349
return this.rawString();
350     }
351
352     public static class ResultToFieldDef {
353         public String JavaDoc resultName;
354         public ContextAccessor mapAcsr;
355         public ContextAccessor fieldAcsr;
356     }
357 }
358
Popular Tags