001    /**
002     * Copyright (c) 2000-2013 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            @Override
048            public WorkflowDefinitionLink addWorkflowDefinitionLink(
049                            long userId, long companyId, long groupId, String className,
050                            long classPK, long typePK, String workflowDefinitionName,
051                            int workflowDefinitionVersion)
052                    throws PortalException, SystemException {
053    
054                    User user = userPersistence.findByPrimaryKey(userId);
055                    long classNameId = PortalUtil.getClassNameId(className);
056                    Date now = new Date();
057    
058                    long workflowDefinitionLinkId = counterLocalService.increment();
059    
060                    WorkflowDefinitionLink workflowDefinitionLink =
061                            workflowDefinitionLinkPersistence.create(workflowDefinitionLinkId);
062    
063                    workflowDefinitionLink.setCreateDate(now);
064                    workflowDefinitionLink.setModifiedDate(now);
065                    workflowDefinitionLink.setUserId(userId);
066                    workflowDefinitionLink.setUserName(user.getFullName());
067                    workflowDefinitionLink.setGroupId(groupId);
068                    workflowDefinitionLink.setCompanyId(companyId);
069                    workflowDefinitionLink.setClassNameId(classNameId);
070                    workflowDefinitionLink.setClassPK(classPK);
071                    workflowDefinitionLink.setTypePK(typePK);
072                    workflowDefinitionLink.setWorkflowDefinitionName(
073                            workflowDefinitionName);
074                    workflowDefinitionLink.setWorkflowDefinitionVersion(
075                            workflowDefinitionVersion);
076    
077                    workflowDefinitionLinkPersistence.update(workflowDefinitionLink, false);
078    
079                    return workflowDefinitionLink;
080            }
081    
082            @Override
083            public void deleteWorkflowDefinitionLink(
084                            long companyId, long groupId, String className, long classPK,
085                            long typePK)
086                    throws PortalException, SystemException {
087    
088                    WorkflowDefinitionLink workflowDefinitionLink =
089                            fetchWorkflowDefinitionLink(
090                                    companyId, groupId, className, classPK, typePK, true);
091    
092                    if (workflowDefinitionLink != null) {
093                            deleteWorkflowDefinitionLink(workflowDefinitionLink);
094                    }
095            }
096    
097            @Override
098            public WorkflowDefinitionLink fetchDefaultWorkflowDefinitionLink(
099                            long companyId, String className, long classPK, long typePK)
100                    throws SystemException {
101    
102                    if (!WorkflowEngineManagerUtil.isDeployed()) {
103                            return null;
104                    }
105    
106                    long classNameId = PortalUtil.getClassNameId(className);
107    
108                    return workflowDefinitionLinkPersistence.fetchByG_C_C_C_T(
109                            WorkflowConstants.DEFAULT_GROUP_ID, companyId, classNameId, classPK,
110                            typePK);
111            }
112    
113            @Override
114            public WorkflowDefinitionLink fetchWorkflowDefinitionLink(
115                            long companyId, long groupId, String className, long classPK,
116                            long typePK)
117                    throws PortalException, SystemException {
118    
119                    return fetchWorkflowDefinitionLink(
120                            companyId, groupId, className, classPK, typePK, false);
121            }
122    
123            @Override
124            public WorkflowDefinitionLink fetchWorkflowDefinitionLink(
125                            long companyId, long groupId, String className, long classPK,
126                            long typePK, boolean strict)
127                    throws PortalException, SystemException {
128    
129                    if (!WorkflowEngineManagerUtil.isDeployed()) {
130                            return null;
131                    }
132    
133                    long classNameId = PortalUtil.getClassNameId(className);
134    
135                    WorkflowDefinitionLink workflowDefinitionLink = null;
136    
137                    if (groupId > 0) {
138                            groupId = StagingUtil.getLiveGroupId(groupId);
139                    }
140    
141                    workflowDefinitionLink =
142                            workflowDefinitionLinkPersistence.fetchByG_C_C_C_T(
143                                    groupId, companyId, classNameId, classPK, typePK);
144    
145                    if (!strict && (workflowDefinitionLink == null)) {
146                            workflowDefinitionLink =
147                                    workflowDefinitionLinkPersistence.fetchByG_C_C_C_T(
148                                            WorkflowConstants.DEFAULT_GROUP_ID, companyId, classNameId,
149                                            classPK, typePK);
150                    }
151    
152                    return workflowDefinitionLink;
153            }
154    
155            @Override
156            public WorkflowDefinitionLink getDefaultWorkflowDefinitionLink(
157                            long companyId, String className, long classPK, long typePK)
158                    throws PortalException, SystemException {
159    
160                    if (!WorkflowEngineManagerUtil.isDeployed()) {
161                            throw new NoSuchWorkflowDefinitionLinkException();
162                    }
163    
164                    long classNameId = PortalUtil.getClassNameId(className);
165    
166                    return workflowDefinitionLinkPersistence.findByG_C_C_C_T(
167                            WorkflowConstants.DEFAULT_GROUP_ID, companyId, classNameId, classPK,
168                            typePK);
169            }
170    
171            @Override
172            public WorkflowDefinitionLink getWorkflowDefinitionLink(
173                            long companyId, long groupId, String className, long classPK,
174                            long typePK)
175                    throws PortalException, SystemException {
176    
177                    return getWorkflowDefinitionLink(
178                            companyId, groupId, className, classPK, typePK, false);
179            }
180    
181            @Override
182            public WorkflowDefinitionLink getWorkflowDefinitionLink(
183                            long companyId, long groupId, String className, long classPK,
184                            long typePK, boolean strict)
185                    throws PortalException, SystemException {
186    
187                    if (!WorkflowEngineManagerUtil.isDeployed()) {
188                            throw new NoSuchWorkflowDefinitionLinkException();
189                    }
190    
191                    WorkflowDefinitionLink workflowDefinitionLink =
192                            fetchWorkflowDefinitionLink(
193                                    companyId, groupId, className, classPK, typePK, strict);
194    
195                    if (workflowDefinitionLink == null) {
196                            throw new NoSuchWorkflowDefinitionLinkException(
197                                    "No workflow for groupId=" + groupId + ", companyId=" +
198                                            companyId + " and className=" + className);
199                    }
200    
201                    return workflowDefinitionLink;
202            }
203    
204            @Override
205            public int getWorkflowDefinitionLinksCount(
206                            long companyId, String workflowDefinitionName,
207                            int workflowDefinitionVersion)
208                    throws SystemException {
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                    throws PortalException, SystemException {
223    
224                    return hasWorkflowDefinitionLink(companyId, groupId, className, 0);
225            }
226    
227            @Override
228            @Skip
229            public boolean hasWorkflowDefinitionLink(
230                            long companyId, long groupId, String className, long classPK)
231                    throws PortalException, SystemException {
232    
233                    return hasWorkflowDefinitionLink(
234                            companyId, groupId, className, classPK, 0);
235            }
236    
237            @Override
238            @Skip
239            public boolean hasWorkflowDefinitionLink(
240                            long companyId, long groupId, String className, long classPK,
241                            long typePK)
242                    throws PortalException, SystemException {
243    
244                    if (!WorkflowEngineManagerUtil.isDeployed()) {
245                            return false;
246                    }
247    
248                    WorkflowDefinitionLink workflowDefinitionLink =
249                            workflowDefinitionLinkLocalService.fetchWorkflowDefinitionLink(
250                                    companyId, groupId, className, classPK, typePK);
251    
252                    if (workflowDefinitionLink != null) {
253                            return true;
254                    }
255    
256                    return false;
257            }
258    
259            @Override
260            public void updateWorkflowDefinitionLink(
261                            long userId, long companyId, long groupId, String className,
262                            long classPK, long typePK, String workflowDefinition)
263                    throws PortalException, SystemException {
264    
265                    if (Validator.isNull(workflowDefinition)) {
266                            deleteWorkflowDefinitionLink(
267                                    companyId, groupId, className, classPK, typePK);
268                    }
269                    else {
270                            String[] workflowDefinitionParts = StringUtil.split(
271                                    workflowDefinition, CharPool.AT);
272    
273                            String workflowDefinitionName = workflowDefinitionParts[0];
274                            int workflowDefinitionVersion = GetterUtil.getInteger(
275                                    workflowDefinitionParts[1]);
276    
277                            updateWorkflowDefinitionLink(
278                                    userId, companyId, groupId, className, classPK, typePK,
279                                    workflowDefinitionName, workflowDefinitionVersion);
280                    }
281            }
282    
283            @Override
284            public WorkflowDefinitionLink updateWorkflowDefinitionLink(
285                            long userId, long companyId, long groupId, String className,
286                            long classPK, long typePK, String workflowDefinitionName,
287                            int workflowDefinitionVersion)
288                    throws PortalException, SystemException {
289    
290                    User user = userPersistence.findByPrimaryKey(userId);
291                    long classNameId = PortalUtil.getClassNameId(className);
292                    Date now = new Date();
293    
294                    WorkflowDefinitionLink workflowDefinitionLink =
295                            workflowDefinitionLinkPersistence.fetchByG_C_C_C_T(
296                                    groupId, companyId, classNameId, classPK, typePK);
297    
298                    if (workflowDefinitionLink == null) {
299                            workflowDefinitionLink = addWorkflowDefinitionLink(
300                                    userId, companyId, groupId, className, classPK, typePK,
301                                    workflowDefinitionName, workflowDefinitionVersion);
302                    }
303    
304                    workflowDefinitionLink.setModifiedDate(now);
305                    workflowDefinitionLink.setUserId(userId);
306                    workflowDefinitionLink.setUserName(user.getFullName());
307                    workflowDefinitionLink.setGroupId(groupId);
308                    workflowDefinitionLink.setCompanyId(companyId);
309                    workflowDefinitionLink.setClassNameId(classNameId);
310                    workflowDefinitionLink.setClassPK(classPK);
311                    workflowDefinitionLink.setTypePK(typePK);
312                    workflowDefinitionLink.setWorkflowDefinitionName(
313                            workflowDefinitionName);
314                    workflowDefinitionLink.setWorkflowDefinitionVersion(
315                            workflowDefinitionVersion);
316    
317                    workflowDefinitionLinkPersistence.update(workflowDefinitionLink, false);
318    
319                    return workflowDefinitionLink;
320            }
321    
322            @Override
323            public void updateWorkflowDefinitionLinks(
324                            long userId, long companyId, long groupId, String className,
325                            long classPK,
326                            List<ObjectValuePair<Long, String>> workflowDefinitions)
327                    throws PortalException, SystemException {
328    
329                    for (ObjectValuePair<Long, String> workflowDefinition :
330                                    workflowDefinitions) {
331    
332                            long typePK = workflowDefinition.getKey();
333                            String workflowDefinitionName = workflowDefinition.getValue();
334    
335                            if (Validator.isNull(workflowDefinitionName)) {
336                                    deleteWorkflowDefinitionLink(
337                                            companyId, groupId, className, classPK, typePK);
338                            }
339                            else {
340                                    updateWorkflowDefinitionLink(
341                                            userId, companyId, groupId, className, classPK, typePK,
342                                            workflowDefinitionName);
343                            }
344                    }
345            }
346    
347    }