001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.kernel.workflow;
016    
017    import com.liferay.portal.NoSuchWorkflowDefinitionLinkException;
018    import com.liferay.portal.kernel.exception.PortalException;
019    import com.liferay.portal.kernel.exception.SystemException;
020    import com.liferay.portal.kernel.util.LocaleUtil;
021    import com.liferay.portal.service.ServiceContext;
022    
023    import java.io.Serializable;
024    
025    import java.util.HashMap;
026    import java.util.List;
027    import java.util.Map;
028    
029    /**
030     * @author Bruno Farache
031     * @author Marcellus Tavares
032     */
033    public class WorkflowHandlerRegistryUtil {
034    
035            public static WorkflowHandler getWorkflowHandler(String className) {
036                    return getWorkflowHandlerRegistry().getWorkflowHandler(className);
037            }
038    
039            public static WorkflowHandlerRegistry getWorkflowHandlerRegistry() {
040                    return _workflowHandlerRegistry;
041            }
042    
043            public static List<WorkflowHandler> getWorkflowHandlers() {
044                    return getWorkflowHandlerRegistry().getWorkflowHandlers();
045            }
046    
047            public static void register(List<WorkflowHandler> workflowHandlers) {
048                    for (WorkflowHandler workflowHandler : workflowHandlers) {
049                            register(workflowHandler);
050                    }
051            }
052    
053            public static void register(WorkflowHandler workflowHandler) {
054                    getWorkflowHandlerRegistry().register(workflowHandler);
055            }
056    
057            public static void startWorkflowInstance(
058                            long companyId, long groupId, long userId, String className,
059                            long classPK, Object model, ServiceContext serviceContext)
060                    throws PortalException, SystemException {
061    
062                    if (serviceContext.getWorkflowAction() !=
063                                    WorkflowConstants.ACTION_PUBLISH) {
064    
065                            return;
066                    }
067    
068                    WorkflowHandler workflowHandler = getWorkflowHandler(className);
069    
070                    if (workflowHandler == null) {
071                            throw new WorkflowException(
072                                    "No workflow handler found for " + className);
073                    }
074    
075                    int status = WorkflowConstants.STATUS_PENDING;
076    
077                    if (!WorkflowThreadLocal.isEnabled() ||
078                            !WorkflowEngineManagerUtil.isDeployed()) {
079    
080                            status = WorkflowConstants.STATUS_APPROVED;
081                    }
082    
083                    Map<String, Serializable> workflowContext =
084                            new HashMap<String, Serializable>();
085    
086                    workflowContext.put(
087                            WorkflowConstants.CONTEXT_COMPANY_ID, String.valueOf(companyId));
088                    workflowContext.put(
089                            WorkflowConstants.CONTEXT_GROUP_ID, String.valueOf(groupId));
090                    workflowContext.put(
091                            WorkflowConstants.CONTEXT_USER_ID, String.valueOf(userId));
092                    workflowContext.put(
093                            WorkflowConstants.CONTEXT_ENTRY_CLASS_NAME, className);
094                    workflowContext.put(
095                            WorkflowConstants.CONTEXT_ENTRY_CLASS_PK, String.valueOf(classPK));
096                    workflowContext.put(
097                            WorkflowConstants.CONTEXT_ENTRY_TYPE,
098                            workflowHandler.getType(LocaleUtil.getDefault()));
099                    workflowContext.put(
100                            WorkflowConstants.CONTEXT_SERVICE_CONTEXT, serviceContext);
101    
102                    workflowHandler.updateStatus(status, workflowContext);
103    
104                    if (WorkflowThreadLocal.isEnabled() &&
105                            WorkflowEngineManagerUtil.isDeployed()) {
106    
107                            try {
108                                    workflowHandler.startWorkflowInstance(
109                                            companyId, groupId, userId, classPK, model,
110                                            workflowContext);
111                            }
112                            catch(NoSuchWorkflowDefinitionLinkException nswdle) {
113                                    workflowHandler.updateStatus(
114                                            WorkflowConstants.STATUS_APPROVED, workflowContext);
115                            }
116                    }
117            }
118    
119            public static void unregister(List<WorkflowHandler> workflowHandlers) {
120                    for (WorkflowHandler workflowHandler : workflowHandlers) {
121                            unregister(workflowHandler);
122                    }
123            }
124    
125            public static void unregister(WorkflowHandler workflowHandler) {
126                    getWorkflowHandlerRegistry().unregister(workflowHandler);
127            }
128    
129            public static Object updateStatus(
130                            int status, Map<String, Serializable> workflowContext)
131                    throws PortalException, SystemException {
132    
133                    String className = (String)workflowContext.get(
134                            WorkflowConstants.CONTEXT_ENTRY_CLASS_NAME);
135    
136                    WorkflowHandler workflowHandler = getWorkflowHandler(className);
137    
138                    if (workflowHandler != null) {
139                            return workflowHandler.updateStatus(status, workflowContext);
140                    }
141    
142                    return null;
143            }
144    
145            public void setWorkflowHandlerRegistry(
146                    WorkflowHandlerRegistry workflowHandlerRegistry) {
147    
148                    _workflowHandlerRegistry = workflowHandlerRegistry;
149            }
150    
151            private static WorkflowHandlerRegistry _workflowHandlerRegistry;
152    
153    }