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