1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portal.kernel.workflow;
16  
17  import com.liferay.portal.NoSuchWorkflowDefinitionLinkException;
18  import com.liferay.portal.kernel.exception.PortalException;
19  import com.liferay.portal.kernel.exception.SystemException;
20  import com.liferay.portal.service.ServiceContext;
21  
22  import java.io.Serializable;
23  
24  import java.util.HashMap;
25  import java.util.List;
26  import java.util.Map;
27  
28  /**
29   * <a href="WorkflowHandlerRegistryUtil.java.html"><b><i>View Source</i></b></a>
30   *
31   * @author Bruno Farache
32   * @author Marcellus Tavares
33   */
34  public class WorkflowHandlerRegistryUtil {
35  
36      public static WorkflowHandler getWorkflowHandler(String className) {
37          return getWorkflowHandlerRegistry().getWorkflowHandler(className);
38      }
39  
40      public static WorkflowHandlerRegistry getWorkflowHandlerRegistry() {
41          return _workflowHandlerRegistry;
42      }
43  
44      public static List<WorkflowHandler> getWorkflowHandlers() {
45          return getWorkflowHandlerRegistry().getWorkflowHandlers();
46      }
47  
48      public static void register(List<WorkflowHandler> workflowHandlers) {
49          for (WorkflowHandler workflowHandler : workflowHandlers) {
50              register(workflowHandler);
51          }
52      }
53  
54      public static void register(WorkflowHandler workflowHandler) {
55          getWorkflowHandlerRegistry().register(workflowHandler);
56      }
57  
58      public static void startWorkflowInstance(
59              long companyId, long groupId, long userId, String className,
60              long classPK, Object model, ServiceContext serviceContext)
61          throws PortalException, SystemException {
62  
63          if (serviceContext.getWorkflowAction() !=
64                  WorkflowConstants.ACTION_PUBLISH) {
65  
66              return;
67          }
68  
69          WorkflowHandler workflowHandler = getWorkflowHandler(className);
70  
71          if (workflowHandler == null) {
72              throw new WorkflowException(
73                  "No workflow handler found for " + className);
74          }
75  
76          int status = WorkflowConstants.STATUS_PENDING;
77  
78          if (!WorkflowThreadLocal.isEnabled() ||
79              !WorkflowEngineManagerUtil.isDeployed()) {
80  
81              status = WorkflowConstants.STATUS_APPROVED;
82          }
83  
84          Map<String, Serializable> workflowContext =
85              new HashMap<String, Serializable>();
86  
87          workflowContext.put(
88              WorkflowConstants.CONTEXT_COMPANY_ID, String.valueOf(companyId));
89          workflowContext.put(
90              WorkflowConstants.CONTEXT_GROUP_ID, String.valueOf(groupId));
91          workflowContext.put(
92              WorkflowConstants.CONTEXT_USER_ID, String.valueOf(userId));
93          workflowContext.put(
94              WorkflowConstants.CONTEXT_ENTRY_CLASS_NAME, className);
95          workflowContext.put(
96              WorkflowConstants.CONTEXT_ENTRY_CLASS_PK, String.valueOf(classPK));
97          workflowContext.put(
98              WorkflowConstants.CONTEXT_SERVICE_CONTEXT, serviceContext);
99  
100         workflowHandler.updateStatus(status, workflowContext);
101 
102         if (WorkflowThreadLocal.isEnabled() &&
103             WorkflowEngineManagerUtil.isDeployed()) {
104 
105             try {
106                 workflowHandler.startWorkflowInstance(
107                     companyId, groupId, userId, classPK, model,
108                     workflowContext);
109             }
110             catch(NoSuchWorkflowDefinitionLinkException nswdle) {
111                 workflowHandler.updateStatus(
112                     WorkflowConstants.STATUS_APPROVED, workflowContext);
113             }
114         }
115     }
116 
117     public static void unregister(List<WorkflowHandler> workflowHandlers) {
118         for (WorkflowHandler workflowHandler : workflowHandlers) {
119             unregister(workflowHandler);
120         }
121     }
122 
123     public static void unregister(WorkflowHandler workflowHandler) {
124         getWorkflowHandlerRegistry().unregister(workflowHandler);
125     }
126 
127     public static Object updateStatus(
128             int status, Map<String, Serializable> workflowContext)
129         throws PortalException, SystemException {
130 
131         String className = (String)workflowContext.get(
132             WorkflowConstants.CONTEXT_ENTRY_CLASS_NAME);
133 
134         WorkflowHandler workflowHandler = getWorkflowHandler(className);
135 
136         if (workflowHandler != null) {
137             return workflowHandler.updateStatus(status, workflowContext);
138         }
139 
140         return null;
141     }
142 
143     public void setWorkflowHandlerRegistry(
144         WorkflowHandlerRegistry workflowHandlerRegistry) {
145 
146         _workflowHandlerRegistry = workflowHandlerRegistry;
147     }
148 
149     private static WorkflowHandlerRegistry _workflowHandlerRegistry;
150 
151 }