001    /**
002     * Copyright (c) 2000-2012 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.service.impl;
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.spring.aop.Skip;
021    import com.liferay.portal.kernel.staging.StagingUtil;
022    import com.liferay.portal.kernel.util.CharPool;
023    import com.liferay.portal.kernel.util.GetterUtil;
024    import com.liferay.portal.kernel.util.ObjectValuePair;
025    import com.liferay.portal.kernel.util.StringUtil;
026    import com.liferay.portal.kernel.util.Validator;
027    import com.liferay.portal.kernel.workflow.WorkflowConstants;
028    import com.liferay.portal.kernel.workflow.WorkflowEngineManagerUtil;
029    import com.liferay.portal.model.User;
030    import com.liferay.portal.model.WorkflowDefinitionLink;
031    import com.liferay.portal.service.base.WorkflowDefinitionLinkLocalServiceBaseImpl;
032    import com.liferay.portal.util.PortalUtil;
033    
034    import java.util.Date;
035    import java.util.List;
036    
037    /**
038     * @author Jorge Ferrer
039     * @author Bruno Farache
040     * @author Brian Wing Shun Chan
041     * @author Juan Fernández
042     * @author Marcellus Tavares
043     */
044    public class WorkflowDefinitionLinkLocalServiceImpl
045            extends WorkflowDefinitionLinkLocalServiceBaseImpl {
046    
047            public WorkflowDefinitionLink addWorkflowDefinitionLink(
048                            long userId, long companyId, long groupId, String className,
049                            long classPK, long typePK, String workflowDefinitionName,
050                            int workflowDefinitionVersion)
051                    throws PortalException, SystemException {
052    
053                    User user = userPersistence.findByPrimaryKey(userId);
054                    long classNameId = PortalUtil.getClassNameId(className);
055                    Date now = new Date();
056    
057                    long workflowDefinitionLinkId = counterLocalService.increment();
058    
059                    WorkflowDefinitionLink workflowDefinitionLink =
060                            workflowDefinitionLinkPersistence.create(workflowDefinitionLinkId);
061    
062                    workflowDefinitionLink.setCreateDate(now);
063                    workflowDefinitionLink.setModifiedDate(now);
064                    workflowDefinitionLink.setUserId(userId);
065                    workflowDefinitionLink.setUserName(user.getFullName());
066                    workflowDefinitionLink.setGroupId(groupId);
067                    workflowDefinitionLink.setCompanyId(companyId);
068                    workflowDefinitionLink.setClassNameId(classNameId);
069                    workflowDefinitionLink.setClassPK(classPK);
070                    workflowDefinitionLink.setTypePK(typePK);
071                    workflowDefinitionLink.setWorkflowDefinitionName(
072                            workflowDefinitionName);
073                    workflowDefinitionLink.setWorkflowDefinitionVersion(
074                            workflowDefinitionVersion);
075    
076                    workflowDefinitionLinkPersistence.update(workflowDefinitionLink, false);
077    
078                    return workflowDefinitionLink;
079            }
080    
081            public void deleteWorkflowDefinitionLink(
082                            long companyId, long groupId, String className, long classPK,
083                            long typePK)
084                    throws PortalException, SystemException {
085    
086                    try {
087                            WorkflowDefinitionLink workflowDefinitionLink =
088                                    getWorkflowDefinitionLink(
089                                            companyId, groupId, className, classPK, typePK, true);
090    
091                            deleteWorkflowDefinitionLink(workflowDefinitionLink);
092                    }
093                    catch (NoSuchWorkflowDefinitionLinkException nswdle) {
094                    }
095            }
096    
097            public WorkflowDefinitionLink getDefaultWorkflowDefinitionLink(
098                            long companyId, String className, long classPK, long typePK)
099                    throws PortalException, SystemException {
100    
101                    if (!WorkflowEngineManagerUtil.isDeployed()) {
102                            throw new NoSuchWorkflowDefinitionLinkException();
103                    }
104    
105                    long classNameId = PortalUtil.getClassNameId(className);
106    
107                    return workflowDefinitionLinkPersistence.findByG_C_C_C_T(
108                            WorkflowConstants.DEFAULT_GROUP_ID, companyId, classNameId, classPK,
109                            typePK);
110            }
111    
112            public WorkflowDefinitionLink getWorkflowDefinitionLink(
113                            long companyId, long groupId, String className, long classPK,
114                            long typePK)
115                    throws PortalException, SystemException {
116    
117                    return getWorkflowDefinitionLink(
118                            companyId, groupId, className, classPK, typePK, false);
119            }
120    
121            public WorkflowDefinitionLink getWorkflowDefinitionLink(
122                            long companyId, long groupId, String className, long classPK,
123                            long typePK, boolean strict)
124                    throws PortalException, SystemException {
125    
126                    if (!WorkflowEngineManagerUtil.isDeployed()) {
127                            throw new NoSuchWorkflowDefinitionLinkException();
128                    }
129    
130                    long classNameId = PortalUtil.getClassNameId(className);
131    
132                    WorkflowDefinitionLink workflowDefinitionLink = null;
133    
134                    if (groupId > 0) {
135                            groupId = StagingUtil.getLiveGroupId(groupId);
136                    }
137    
138                    workflowDefinitionLink =
139                            workflowDefinitionLinkPersistence.fetchByG_C_C_C_T(
140                                    groupId, companyId, classNameId, classPK, typePK);
141    
142                    if (!strict && (workflowDefinitionLink == null)) {
143                            workflowDefinitionLink =
144                                    workflowDefinitionLinkPersistence.fetchByG_C_C_C_T(
145                                            WorkflowConstants.DEFAULT_GROUP_ID, companyId, classNameId,
146                                            classPK, typePK);
147                    }
148    
149                    if (workflowDefinitionLink == null) {
150                            throw new NoSuchWorkflowDefinitionLinkException(
151                                    "No workflow for groupId=" + groupId + ", companyId=" +
152                                            companyId + " and classNameId=" + classNameId);
153                    }
154    
155                    return workflowDefinitionLink;
156            }
157    
158            public int getWorkflowDefinitionLinksCount(
159                            long companyId, String workflowDefinitionName,
160                            int workflowDefinitionVersion)
161                    throws SystemException{
162    
163                    if (!WorkflowEngineManagerUtil.isDeployed()) {
164                            return 0;
165                    }
166    
167                    return workflowDefinitionLinkPersistence.countByC_W_W(
168                            companyId, workflowDefinitionName, workflowDefinitionVersion);
169            }
170    
171            @Skip
172            public boolean hasWorkflowDefinitionLink(
173                            long companyId, long groupId, String className)
174                    throws PortalException, SystemException {
175    
176                    return hasWorkflowDefinitionLink(companyId, groupId, className, 0);
177            }
178    
179            @Skip
180            public boolean hasWorkflowDefinitionLink(
181                            long companyId, long groupId, String className, long classPK)
182                    throws PortalException, SystemException {
183    
184                    return hasWorkflowDefinitionLink(
185                            companyId, groupId, className, classPK, 0);
186            }
187    
188            @Skip
189            public boolean hasWorkflowDefinitionLink(
190                            long companyId, long groupId, String className, long classPK,
191                            long typePK)
192                    throws PortalException, SystemException {
193    
194                    if (!WorkflowEngineManagerUtil.isDeployed()) {
195                            return false;
196                    }
197    
198                    try {
199                            workflowDefinitionLinkLocalService.getWorkflowDefinitionLink(
200                                    companyId, groupId, className, classPK, typePK);
201    
202                            return true;
203                    }
204                    catch (NoSuchWorkflowDefinitionLinkException nswdle) {
205                            return false;
206                    }
207            }
208    
209            public void updateWorkflowDefinitionLink(
210                            long userId, long companyId, long groupId, String className,
211                            long classPK, long typePK, String workflowDefinition)
212                    throws PortalException, SystemException {
213    
214                    if (Validator.isNull(workflowDefinition)) {
215                            deleteWorkflowDefinitionLink(
216                                    companyId, groupId, className, classPK, typePK);
217                    }
218                    else {
219                            String[] workflowDefinitionParts = StringUtil.split(
220                                    workflowDefinition, CharPool.AT);
221    
222                            String workflowDefinitionName = workflowDefinitionParts[0];
223                            int workflowDefinitionVersion = GetterUtil.getInteger(
224                                    workflowDefinitionParts[1]);
225    
226                            updateWorkflowDefinitionLink(
227                                    userId, companyId, groupId, className, classPK, typePK,
228                                    workflowDefinitionName, workflowDefinitionVersion);
229                    }
230            }
231    
232            public WorkflowDefinitionLink updateWorkflowDefinitionLink(
233                            long userId, long companyId, long groupId, String className,
234                            long classPK, long typePK, String workflowDefinitionName,
235                            int workflowDefinitionVersion)
236                    throws PortalException, SystemException {
237    
238                    User user = userPersistence.findByPrimaryKey(userId);
239                    long classNameId = PortalUtil.getClassNameId(className);
240                    Date now = new Date();
241    
242                    WorkflowDefinitionLink workflowDefinitionLink =
243                            workflowDefinitionLinkPersistence.fetchByG_C_C_C_T(
244                                    groupId, companyId, classNameId, classPK, typePK);
245    
246                    if (workflowDefinitionLink == null) {
247                            workflowDefinitionLink = addWorkflowDefinitionLink(
248                                    userId, companyId, groupId, className, classPK, typePK,
249                                    workflowDefinitionName, workflowDefinitionVersion);
250                    }
251    
252                    workflowDefinitionLink.setModifiedDate(now);
253                    workflowDefinitionLink.setUserId(userId);
254                    workflowDefinitionLink.setUserName(user.getFullName());
255                    workflowDefinitionLink.setGroupId(groupId);
256                    workflowDefinitionLink.setCompanyId(companyId);
257                    workflowDefinitionLink.setClassNameId(classNameId);
258                    workflowDefinitionLink.setClassPK(classPK);
259                    workflowDefinitionLink.setTypePK(typePK);
260                    workflowDefinitionLink.setWorkflowDefinitionName(
261                            workflowDefinitionName);
262                    workflowDefinitionLink.setWorkflowDefinitionVersion(
263                            workflowDefinitionVersion);
264    
265                    workflowDefinitionLinkPersistence.update(workflowDefinitionLink, false);
266    
267                    return workflowDefinitionLink;
268            }
269    
270            public void updateWorkflowDefinitionLinks(
271                            long userId, long companyId, long groupId, String className,
272                            long classPK,
273                            List<ObjectValuePair<Long, String>> workflowDefinitions)
274                    throws PortalException, SystemException {
275    
276                    for (ObjectValuePair<Long, String> workflowDefinition :
277                                    workflowDefinitions) {
278    
279                            long typePK = workflowDefinition.getKey();
280                            String workflowDefinitionName = workflowDefinition.getValue();
281    
282                            if (Validator.isNull(workflowDefinitionName)) {
283                                    deleteWorkflowDefinitionLink(
284                                            companyId, groupId, className, classPK, typePK);
285                            }
286                            else {
287                                    updateWorkflowDefinitionLink(
288                                            userId, companyId, groupId, className, classPK, typePK,
289                                            workflowDefinitionName);
290                            }
291                    }
292            }
293    
294    }