001
014
015 package com.liferay.portal.kernel.workflow;
016
017 import com.liferay.portal.kernel.exception.PortalException;
018 import com.liferay.portal.kernel.exception.SystemException;
019 import com.liferay.portal.kernel.log.Log;
020 import com.liferay.portal.kernel.log.LogFactoryUtil;
021 import com.liferay.portal.kernel.security.pacl.permission.PortalRuntimePermission;
022 import com.liferay.portal.kernel.transaction.TransactionCommitCallbackRegistryUtil;
023 import com.liferay.portal.kernel.util.GetterUtil;
024 import com.liferay.portal.kernel.util.LocaleUtil;
025 import com.liferay.portal.model.WorkflowDefinitionLink;
026 import com.liferay.portal.model.WorkflowInstanceLink;
027 import com.liferay.portal.service.ServiceContext;
028 import com.liferay.portal.service.WorkflowInstanceLinkLocalServiceUtil;
029
030 import java.io.Serializable;
031
032 import java.util.Collections;
033 import java.util.HashMap;
034 import java.util.List;
035 import java.util.Map;
036 import java.util.concurrent.Callable;
037
038
042 public class WorkflowHandlerRegistryUtil {
043
044 public static List<WorkflowHandler> getScopeableWorkflowHandlers() {
045 return getWorkflowHandlerRegistry().getScopeableWorkflowHandlers();
046 }
047
048 public static WorkflowHandler getWorkflowHandler(String className) {
049 return getWorkflowHandlerRegistry().getWorkflowHandler(className);
050 }
051
052 public static WorkflowHandlerRegistry getWorkflowHandlerRegistry() {
053 PortalRuntimePermission.checkGetBeanProperty(
054 WorkflowHandlerRegistryUtil.class);
055
056 return _workflowHandlerRegistry;
057 }
058
059 public static List<WorkflowHandler> getWorkflowHandlers() {
060 return getWorkflowHandlerRegistry().getWorkflowHandlers();
061 }
062
063 public static void register(List<WorkflowHandler> workflowHandlers) {
064 for (WorkflowHandler workflowHandler : workflowHandlers) {
065 register(workflowHandler);
066 }
067 }
068
069 public static void register(WorkflowHandler workflowHandler) {
070 getWorkflowHandlerRegistry().register(workflowHandler);
071 }
072
073 public static void startWorkflowInstance(
074 final long companyId, final long groupId, final long userId,
075 String className, final long classPK, final Object model,
076 ServiceContext serviceContext,
077 Map<String, Serializable> workflowContext)
078 throws PortalException, SystemException {
079
080 if (serviceContext.getWorkflowAction() !=
081 WorkflowConstants.ACTION_PUBLISH) {
082
083 return;
084 }
085
086 final WorkflowHandler workflowHandler = getWorkflowHandler(className);
087
088 if (workflowHandler == null) {
089 if (WorkflowThreadLocal.isEnabled()) {
090 throw new WorkflowException(
091 "No workflow handler found for " + className);
092 }
093
094 return;
095 }
096
097 boolean hasWorkflowInstanceInProgress =
098 _instance._hasWorkflowInstanceInProgress(
099 companyId, groupId, className, classPK);
100
101 if (hasWorkflowInstanceInProgress) {
102 if (_log.isWarnEnabled()) {
103 _log.warn(
104 "Workflow already started for class " + className +
105 " with primary key " + classPK + " in group " +
106 groupId);
107 }
108
109 return;
110 }
111
112 WorkflowDefinitionLink workflowDefinitionLink = null;
113
114 if (WorkflowThreadLocal.isEnabled() &&
115 WorkflowEngineManagerUtil.isDeployed()) {
116
117 workflowDefinitionLink = workflowHandler.getWorkflowDefinitionLink(
118 companyId, groupId, classPK);
119 }
120
121 int status = WorkflowConstants.STATUS_PENDING;
122
123 if (workflowDefinitionLink == null) {
124 status = WorkflowConstants.STATUS_APPROVED;
125 }
126
127 workflowContext = new HashMap<String, Serializable>(workflowContext);
128
129 workflowContext.put(
130 WorkflowConstants.CONTEXT_COMPANY_ID, String.valueOf(companyId));
131 workflowContext.put(
132 WorkflowConstants.CONTEXT_GROUP_ID, String.valueOf(groupId));
133 workflowContext.put(
134 WorkflowConstants.CONTEXT_USER_ID, String.valueOf(userId));
135 workflowContext.put(
136 WorkflowConstants.CONTEXT_ENTRY_CLASS_NAME, className);
137 workflowContext.put(
138 WorkflowConstants.CONTEXT_ENTRY_CLASS_PK, String.valueOf(classPK));
139 workflowContext.put(
140 WorkflowConstants.CONTEXT_ENTRY_TYPE,
141 workflowHandler.getType(LocaleUtil.getDefault()));
142 workflowContext.put(
143 WorkflowConstants.CONTEXT_SERVICE_CONTEXT, serviceContext);
144 workflowContext.put(
145 WorkflowConstants.CONTEXT_TASK_COMMENTS,
146 GetterUtil.getString(serviceContext.getAttribute("comments")));
147
148 workflowHandler.updateStatus(status, workflowContext);
149
150 if (workflowDefinitionLink != null) {
151 final Map<String, Serializable> tempWorkflowContext =
152 workflowContext;
153
154 TransactionCommitCallbackRegistryUtil.registerCallback(
155 new Callable<Object>() {
156
157 @Override
158 public Object call() throws Exception {
159 workflowHandler.startWorkflowInstance(
160 companyId, groupId, userId, classPK, model,
161 tempWorkflowContext);
162
163 return null;
164 }
165
166 });
167 }
168 }
169
170 public static void startWorkflowInstance(
171 long companyId, long groupId, long userId, String className,
172 long classPK, Object model, ServiceContext serviceContext)
173 throws PortalException, SystemException {
174
175 Map<String, Serializable> workflowContext =
176 (Map<String, Serializable>)serviceContext.removeAttribute(
177 "workflowContext");
178
179 if (workflowContext == null) {
180 workflowContext = Collections.emptyMap();
181 }
182
183 startWorkflowInstance(
184 companyId, groupId, userId, className, classPK, model,
185 serviceContext, workflowContext);
186 }
187
188 public static void startWorkflowInstance(
189 long companyId, long userId, String className, long classPK,
190 Object model, ServiceContext serviceContext)
191 throws PortalException, SystemException {
192
193 Map<String, Serializable> workflowContext =
194 (Map<String, Serializable>)serviceContext.removeAttribute(
195 "workflowContext");
196
197 if (workflowContext == null) {
198 workflowContext = Collections.emptyMap();
199 }
200
201 startWorkflowInstance(
202 companyId, WorkflowConstants.DEFAULT_GROUP_ID, userId, className,
203 classPK, model, serviceContext, workflowContext);
204 }
205
206 public static void startWorkflowInstance(
207 long companyId, long userId, String className, long classPK,
208 Object model, ServiceContext serviceContext,
209 Map<String, Serializable> workflowContext)
210 throws PortalException, SystemException {
211
212 startWorkflowInstance(
213 companyId, WorkflowConstants.DEFAULT_GROUP_ID, userId, className,
214 classPK, model, serviceContext, workflowContext);
215 }
216
217 public static void unregister(List<WorkflowHandler> workflowHandlers) {
218 for (WorkflowHandler workflowHandler : workflowHandlers) {
219 unregister(workflowHandler);
220 }
221 }
222
223 public static void unregister(WorkflowHandler workflowHandler) {
224 getWorkflowHandlerRegistry().unregister(workflowHandler);
225 }
226
227 public static Object updateStatus(
228 int status, Map<String, Serializable> workflowContext)
229 throws PortalException, SystemException {
230
231 String className = (String)workflowContext.get(
232 WorkflowConstants.CONTEXT_ENTRY_CLASS_NAME);
233
234 WorkflowHandler workflowHandler = getWorkflowHandler(className);
235
236 if (workflowHandler != null) {
237 return workflowHandler.updateStatus(status, workflowContext);
238 }
239
240 return null;
241 }
242
243 public void setWorkflowHandlerRegistry(
244 WorkflowHandlerRegistry workflowHandlerRegistry) {
245
246 PortalRuntimePermission.checkSetBeanProperty(getClass());
247
248 _workflowHandlerRegistry = workflowHandlerRegistry;
249 }
250
251 private boolean _hasWorkflowInstanceInProgress(
252 long companyId, long groupId, String className, long classPK)
253 throws PortalException, SystemException {
254
255 WorkflowInstanceLink workflowInstanceLink =
256 WorkflowInstanceLinkLocalServiceUtil.fetchWorkflowInstanceLink(
257 companyId, groupId, className, classPK);
258
259 if (workflowInstanceLink == null) {
260 return false;
261 }
262
263 WorkflowInstance workflowInstance =
264 WorkflowInstanceManagerUtil.getWorkflowInstance(
265 companyId, workflowInstanceLink.getWorkflowInstanceId());
266
267 if (!workflowInstance.isComplete()) {
268 return true;
269 }
270
271 return false;
272 }
273
274 private static Log _log = LogFactoryUtil.getLog(
275 WorkflowHandlerRegistryUtil.class);
276
277 private static WorkflowHandlerRegistryUtil _instance =
278 new WorkflowHandlerRegistryUtil();
279
280 private static WorkflowHandlerRegistry _workflowHandlerRegistry;
281
282 }