KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > ofbiz > workeffort > workeffort > WorkEffortApplication


1 /*
2  * $Id: WorkEffortApplication.java 5462 2005-08-05 18:35:48Z jonesde $
3  *
4  * Copyright (c) 2001, 2002 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  */

25 package org.ofbiz.workeffort.workeffort;
26
27 import java.io.IOException JavaDoc;
28 import java.util.Collection JavaDoc;
29 import java.util.HashMap JavaDoc;
30 import java.util.Iterator JavaDoc;
31 import java.util.List JavaDoc;
32 import java.util.Map JavaDoc;
33
34 import javax.servlet.jsp.PageContext JavaDoc;
35
36 import org.ofbiz.base.util.BshUtil;
37 import org.ofbiz.base.util.Debug;
38 import org.ofbiz.base.util.StringUtil;
39 import org.ofbiz.base.util.UtilMisc;
40 import org.ofbiz.entity.GenericDelegator;
41 import org.ofbiz.entity.GenericEntityException;
42 import org.ofbiz.entity.GenericValue;
43 import org.ofbiz.entity.serialize.SerializeException;
44 import org.ofbiz.entity.serialize.XmlSerializer;
45 import org.ofbiz.workflow.WfException;
46 import org.ofbiz.workflow.WfUtil;
47
48 import bsh.EvalError;
49
50 /**
51  * WorkEffortWorker - Worker class to reduce code in JSPs & make it more reusable
52  *
53  * @author Manuel Soto
54  * @version $Rev: 5462 $
55  * @since 2.0
56  */

57 public final class WorkEffortApplication {
58
59     public static final String JavaDoc module = WorkEffortApplication.class.getName();
60
61     /**
62      * Determine if the workeffort is an activity and has an Application as the implementation
63      * @param pageContext
64      * @param workEffort The work effort to be examined
65      * @return
66      */

67     public static boolean isApplication(GenericValue workEffort) {
68
69         if (!workEffort.get("workEffortTypeId").equals("ACTIVITY"))
70             return false;
71         // check for the existence of applications
72
try {
73             if (getApplications(workEffort).isEmpty())
74                 return false;
75         } catch (GenericEntityException ee) {
76             Debug.logWarning(ee, module);
77             return false;
78         }
79
80         return true;
81
82     }
83
84     /**
85      * Determine if the workeffort is an activity and has an Application as the implementation
86      * @param workEffortAttrName The work effort to be examined. Located in the pageContext
87      * @return
88      */

89     public static void isApplication(
90         PageContext JavaDoc pageContext,
91         String JavaDoc workEffortAttrName,
92         String JavaDoc isApplicationAttrName) {
93
94         pageContext.setAttribute(
95             isApplicationAttrName,
96             new Boolean JavaDoc(isApplication((GenericValue) pageContext.getAttribute(workEffortAttrName))));
97
98     }
99
100     public static String JavaDoc getApplicationId(PageContext JavaDoc pageContext, String JavaDoc partyAssignsAttrName) {
101         Collection JavaDoc partyAssigns = (Collection JavaDoc) pageContext.getAttribute(partyAssignsAttrName);
102         if (!partyAssigns.isEmpty()) {
103             // look for acepted
104
GenericValue partyAssignAcepted = null;
105             for (Iterator JavaDoc partyAssignIt = partyAssigns.iterator(); partyAssignIt.hasNext();) {
106                 GenericValue partyAssign = (GenericValue) partyAssignIt.next();
107                 if (((String JavaDoc) partyAssign.get("statusId")).equals("CAL_ACCEPTED")) {
108                     partyAssignAcepted = partyAssign;
109                     break;
110                 }
111             }
112             if (partyAssignAcepted != null)
113                 try {
114                     final Collection JavaDoc applicationSandboxs = partyAssignAcepted.getRelated("ApplicationSandbox");
115                     GenericValue applicationSandbox = (GenericValue) applicationSandboxs.toArray()[0];
116                     return (String JavaDoc) applicationSandbox.get("applicationId");
117                 } catch (GenericEntityException ee) {
118                     Debug.logWarning(ee, module);
119                 }
120         }
121         Debug.logWarning("Can't find applicationId", module);
122         return null;
123     }
124
125     /**
126      * Retrieve the information of the application in the implementation of the activity ans save in the page context
127      * It asume that an activity has at least one application
128      *
129      * @param pageContext The page context where the information is to be saved
130      * @param workEffortAttrName The attribute name to localte the workeffort in the pageCOntext
131      * @param applicationAttrName The name of the attribute where the application's specification will be savd in the page context
132      * @throws WfException
133      * @see getApplication
134      */

135     public static void getApplication(PageContext JavaDoc pageContext, String JavaDoc workEffortAttrName, String JavaDoc applicationAttrName)
136             throws WfException {
137         getApplication(pageContext, workEffortAttrName, applicationAttrName, null, null, null);
138     }
139
140     /**
141      * Retrieve the information of the application in the implementation of the activity ans save in the page context
142      * It asume that an activity has at least one application
143      *
144      * @param pageContext The page context where the information is to be saved
145      * @param workEffortAttrName The attribute name to localte the workeffort in the pageContext
146      * @param applicationAttrName The name of the attribute where the application's specification will be savd in the page context
147      * @param applicationContextSignatureName The name of the attribute where the application's context Signature specification will be savd in the page context
148      * @param applicationResultSignatureName The name of the attribute where the application's result Signature specification will be saved in the page context
149      * @param applicationContextName The name of the attribute where the application's context will be savd in the page context
150      * @throws WfException
151      */

152     public static void getApplication(PageContext JavaDoc pageContext, String JavaDoc workEffortAttrName, String JavaDoc applicationAttrName,
153             String JavaDoc applicationContextSignatureName, String JavaDoc applicationResultSignatureName, String JavaDoc applicationContextName)
154             throws WfException {
155         GenericValue workEffort = (GenericValue) pageContext.getAttribute(workEffortAttrName);
156         GenericDelegator delegator = (GenericDelegator) pageContext.getRequest().getAttribute("delegator");
157         try {
158             Collection JavaDoc applications = getApplications(workEffort);
159
160             if (applications.iterator().hasNext()) {
161                 GenericValue workflowActivityTool = (GenericValue) applications.iterator().next();
162                 if (applicationAttrName != null && applicationAttrName.length() != 0)
163                     pageContext.setAttribute(applicationAttrName, workflowActivityTool);
164
165                 Map JavaDoc contextSignature = new HashMap JavaDoc();
166                 Map JavaDoc resultSignature = new HashMap JavaDoc();
167                 getApplicationSignatures(delegator, workflowActivityTool, contextSignature, resultSignature);
168
169                 Map JavaDoc context =
170                     getApplicationContext(
171                         delegator,
172                         contextSignature,
173                         (String JavaDoc) workflowActivityTool.get("actualParameters"),
174                         (String JavaDoc) workflowActivityTool.get("extendedAttributes"),
175                         getContext(workEffort),
176                         (String JavaDoc) workEffort.get("workEffortId"));
177
178                 if (applicationContextSignatureName != null
179                     && applicationContextSignatureName.length() != 0
180                     && contextSignature != null)
181                     pageContext.setAttribute(applicationContextSignatureName, contextSignature);
182
183                 if (applicationResultSignatureName != null
184                     && applicationResultSignatureName.length() != 0
185                     && resultSignature != null)
186                     pageContext.setAttribute(applicationResultSignatureName, resultSignature);
187
188                 if (applicationContextName != null && applicationContextName.length() != 0)
189                     pageContext.setAttribute(applicationContextName, context);
190             }
191
192         } catch (GenericEntityException gex) {
193             throw new WfException(
194                 "Can't find Applications in Workeffort [" + workEffort.get("workEffortId") + "]",
195                 gex);
196         }
197
198     }
199
200     private static Collection JavaDoc getApplications(GenericValue workEffort) throws GenericEntityException {
201
202         final String JavaDoc packageId = (String JavaDoc) workEffort.get("workflowPackageId");
203         final String JavaDoc packageVersion = (String JavaDoc) workEffort.get("workflowPackageVersion");
204         final String JavaDoc processId = (String JavaDoc) workEffort.get("workflowProcessId");
205         final String JavaDoc processVersion = (String JavaDoc) workEffort.get("workflowProcessVersion");
206         final String JavaDoc activityId = (String JavaDoc) workEffort.get("workflowActivityId");
207         final GenericDelegator delegator = workEffort.getDelegator();
208
209         Map JavaDoc expresions = new HashMap JavaDoc();
210         expresions.putAll(UtilMisc.toMap("packageId", packageId));
211         expresions.putAll(UtilMisc.toMap("packageVersion", packageVersion));
212         expresions.putAll(UtilMisc.toMap("processId", processId));
213         expresions.putAll(UtilMisc.toMap("processVersion", processVersion));
214         expresions.putAll(UtilMisc.toMap("activityId", activityId));
215         expresions.putAll(UtilMisc.toMap("toolTypeEnumId", "WTT_APPLICATION"));
216
217         return delegator.findByAnd("WorkflowActivityTool", expresions);
218
219     }
220
221     private static void getApplicationSignatures(
222             GenericDelegator delegator,
223             GenericValue application,
224             Map JavaDoc contextSignature,
225             Map JavaDoc resultSignature)
226             throws GenericEntityException {
227         final String JavaDoc packageId = (String JavaDoc) application.get("packageId");
228         final String JavaDoc packageVersion = (String JavaDoc) application.get("packageVersion");
229         final String JavaDoc processId = (String JavaDoc) application.get("processId");
230         final String JavaDoc processVersion = (String JavaDoc) application.get("processVersion");
231         final String JavaDoc applicationId = (String JavaDoc) application.get("toolId");
232
233         Map JavaDoc expresions = new HashMap JavaDoc();
234         expresions.putAll(UtilMisc.toMap("packageId", packageId));
235         expresions.putAll(UtilMisc.toMap("packageVersion", packageVersion));
236         expresions.putAll(UtilMisc.toMap("processId", processId));
237         expresions.putAll(UtilMisc.toMap("processVersion", processVersion));
238         expresions.putAll(UtilMisc.toMap("applicationId", applicationId));
239
240         final Collection JavaDoc params = delegator.findByAnd("WorkflowFormalParam", expresions);
241
242         Iterator JavaDoc i = params.iterator();
243         while (i.hasNext()) {
244             GenericValue param = (GenericValue) i.next();
245             String JavaDoc name = param.getString("formalParamId");
246             String JavaDoc mode = param.getString("modeEnumId");
247             String JavaDoc type = param.getString("dataTypeEnumId");
248             if (mode.equals("WPM_IN") || mode.equals("WPM_INOUT"))
249                 contextSignature.put(name, WfUtil.getJavaType(type));
250             else if (mode.equals("WPM_OUT") || mode.equals("WPM_INOUT"))
251                 resultSignature.put(name, WfUtil.getJavaType(type));
252         }
253     }
254
255     private static Map JavaDoc getApplicationContext(
256             GenericDelegator delegator,
257             Map JavaDoc contextSignature,
258             String JavaDoc actualParameters,
259             String JavaDoc extendedAttr,
260             Map JavaDoc context,
261             String JavaDoc workEffortId)
262             throws WfException {
263         List JavaDoc params = StringUtil.split(actualParameters, ",");
264         Map JavaDoc actualContext = new HashMap JavaDoc();
265
266         Map JavaDoc extendedAttributes = StringUtil.strToMap(extendedAttr);
267         if (extendedAttributes != null && extendedAttributes.size() > 0)
268             actualContext.putAll(extendedAttributes);
269
270         // setup some internal buffer parameters
271
// maintain synchronized w/ wfActivityImpl
272
GenericValue userLogin = null;
273         if (context.containsKey("runAsUser")) {
274             userLogin = getUserLogin(delegator, (String JavaDoc) context.get("runAsUser"));
275             actualContext.put("userLogin", userLogin);
276         } else if (context.containsKey("workflowOwnerId")) {
277             userLogin = getUserLogin(delegator, (String JavaDoc) context.get("workflowOwnerId"));
278         }
279
280         context.put("userLogin", userLogin);
281         context.put("workEffortId", workEffortId);
282         // /setup some internal bufer parameters
283

284         Iterator JavaDoc i = params.iterator();
285         while (i.hasNext()) {
286
287             Object JavaDoc keyExpr = i.next();
288             String JavaDoc keyExprStr = (String JavaDoc) keyExpr;
289             if (keyExprStr != null && keyExprStr.trim().toLowerCase().startsWith("expr:"))
290                 try {
291                     BshUtil.eval(keyExprStr.trim().substring(5).trim(), context);
292                 } catch (EvalError e) {
293                     throw new WfException("Error evaluating actual parameter: " + keyExprStr, e);
294                 } else if (keyExprStr != null && keyExprStr.trim().toLowerCase().startsWith("name:")) {
295                 List JavaDoc couple = StringUtil.split(keyExprStr.trim().substring(5).trim(), "=");
296                 if (contextSignature.containsKey(((String JavaDoc) couple.get(0)).trim()))
297                     actualContext.put(((String JavaDoc) couple.get(0)).trim(), context.get(couple.get(1)));
298             } else if (context.containsKey(keyExprStr)) {
299                 if (contextSignature.containsKey(keyExprStr))
300                     actualContext.put(keyExprStr, context.get(keyExprStr));
301             } else if (!actualContext.containsKey(keyExprStr))
302                 throw new WfException("Context does not contain the key: '" + keyExprStr + "'");
303         }
304
305         return actualContext;
306
307     }
308
309     private static Map JavaDoc getContext(GenericValue dataObject) throws WfException {
310         String JavaDoc contextXML = null;
311         Map JavaDoc context = null;
312         if (dataObject.get("runtimeDataId") == null)
313             return context;
314         try {
315             GenericValue runtimeData = dataObject.getRelatedOne("RuntimeData");
316             contextXML = runtimeData.getString("runtimeInfo");
317         } catch (GenericEntityException e) {
318             throw new WfException(e.getMessage(), e);
319         }
320         // De-serialize the context
321
if (contextXML != null) {
322             try {
323                 context = (Map JavaDoc) XmlSerializer.deserialize(contextXML, dataObject.getDelegator());
324             } catch (SerializeException e) {
325                 throw new WfException(e.getMessage(), e);
326             } catch (IOException JavaDoc e) {
327                 throw new WfException(e.getMessage(), e);
328             } catch (Exception JavaDoc e) {
329                 throw new WfException(e.getMessage(), e);
330             }
331         }
332         return context;
333     }
334     // Gets a UserLogin object for service invocation
335
// This allows a workflow to invoke a service as a specific user
336
private static GenericValue getUserLogin(GenericDelegator delegator, String JavaDoc userId) throws WfException {
337         GenericValue userLogin = null;
338         try {
339             userLogin = delegator.findByPrimaryKey("UserLogin", UtilMisc.toMap("userLoginId", userId));
340         } catch (GenericEntityException e) {
341             throw new WfException(e.getMessage(), e);
342         }
343         return userLogin;
344     }
345
346 }
347
Popular Tags