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