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.repository.capabilities;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.repository.LocalRepository;
019    import com.liferay.portal.kernel.repository.Repository;
020    import com.liferay.portal.kernel.repository.capabilities.WorkflowCapability;
021    import com.liferay.portal.kernel.repository.model.FileEntry;
022    import com.liferay.portal.kernel.repository.model.FileVersion;
023    import com.liferay.portal.kernel.workflow.WorkflowConstants;
024    import com.liferay.portal.kernel.workflow.WorkflowThreadLocal;
025    import com.liferay.portal.repository.liferayrepository.LiferayWorkflowLocalRepositoryWrapper;
026    import com.liferay.portal.repository.liferayrepository.LiferayWorkflowRepositoryWrapper;
027    import com.liferay.portal.repository.util.RepositoryWrapperAware;
028    import com.liferay.portal.service.ServiceContext;
029    import com.liferay.portlet.documentlibrary.model.DLFileEntry;
030    import com.liferay.portlet.documentlibrary.model.DLFileEntryConstants;
031    import com.liferay.portlet.documentlibrary.model.DLFileVersion;
032    import com.liferay.portlet.documentlibrary.model.DLSyncConstants;
033    import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
034    import com.liferay.portlet.documentlibrary.service.DLFileVersionLocalServiceUtil;
035    import com.liferay.portlet.documentlibrary.util.DLAppHelperThreadLocal;
036    import com.liferay.portlet.documentlibrary.util.DLUtil;
037    
038    /**
039     * @author Adolfo P??rez
040     */
041    public class LiferayWorkflowCapability
042            implements RepositoryWrapperAware, WorkflowCapability {
043    
044            @Override
045            public void addFileEntry(
046                            long userId, FileEntry fileEntry, ServiceContext serviceContext)
047                    throws PortalException {
048    
049                    boolean previousEnabled = WorkflowThreadLocal.isEnabled();
050    
051                    if (!DLAppHelperThreadLocal.isEnabled()) {
052                            WorkflowThreadLocal.setEnabled(false);
053                    }
054    
055                    try {
056                            FileVersion fileVersion = fileEntry.getFileVersion();
057    
058                            DLUtil.startWorkflowInstance(
059                                    userId, (DLFileVersion)fileVersion.getModel(),
060                                    DLSyncConstants.EVENT_ADD, serviceContext);
061                    }
062                    finally {
063                            if (!DLAppHelperThreadLocal.isEnabled()) {
064                                    WorkflowThreadLocal.setEnabled(previousEnabled);
065                            }
066                    }
067            }
068    
069            @Override
070            public void checkInFileEntry(
071                            long userId, FileEntry fileEntry, ServiceContext serviceContext)
072                    throws PortalException {
073    
074                    boolean keepFileVersionLabel =
075                            DLFileEntryLocalServiceUtil.isKeepFileVersionLabel(
076                                    fileEntry.getFileEntryId(), serviceContext);
077    
078                    if ((serviceContext.getWorkflowAction() ==
079                                    WorkflowConstants.ACTION_PUBLISH) && !keepFileVersionLabel) {
080    
081                            DLFileVersion latestDLFileVersion =
082                                    DLFileVersionLocalServiceUtil.getLatestFileVersion(
083                                            fileEntry.getFileEntryId(), false);
084    
085                            DLUtil.startWorkflowInstance(
086                                    userId, latestDLFileVersion, DLSyncConstants.EVENT_UPDATE,
087                                    serviceContext);
088                    }
089            }
090    
091            @Override
092            public void revertFileEntry(
093                            long userId, FileEntry fileEntry, ServiceContext serviceContext)
094                    throws PortalException {
095    
096                    _startWorkflowInstance(userId, fileEntry, serviceContext);
097            }
098    
099            @Override
100            public void updateFileEntry(
101                            long userId, FileEntry fileEntry, ServiceContext serviceContext)
102                    throws PortalException {
103    
104                    _startWorkflowInstance(userId, fileEntry, serviceContext);
105            }
106    
107            @Override
108            public LocalRepository wrapLocalRepository(
109                    LocalRepository localRepository) {
110    
111                    return new LiferayWorkflowLocalRepositoryWrapper(localRepository, this);
112            }
113    
114            @Override
115            public Repository wrapRepository(Repository repository) {
116                    return new LiferayWorkflowRepositoryWrapper(repository, this);
117            }
118    
119            private DLFileVersion _getWorkflowDLFileVersion(
120                            long fileEntryId, ServiceContext serviceContext)
121                    throws PortalException {
122    
123                    DLFileEntry dlFileEntry = DLFileEntryLocalServiceUtil.getDLFileEntry(
124                            fileEntryId);
125    
126                    if (dlFileEntry.isCheckedOut()) {
127                            return null;
128                    }
129    
130                    DLFileVersion dlFileVersion =
131                            DLFileVersionLocalServiceUtil.getLatestFileVersion(
132                                    fileEntryId, true);
133    
134                    if (dlFileVersion.isApproved() ||
135                            (serviceContext.getWorkflowAction() ==
136                                            WorkflowConstants.ACTION_PUBLISH)) {
137    
138                            return dlFileVersion;
139                    }
140    
141                    return null;
142            }
143    
144            private void _startWorkflowInstance(
145                            long userId, DLFileVersion dlFileVersion,
146                            ServiceContext serviceContext)
147                    throws PortalException {
148    
149                    if (dlFileVersion == null) {
150                            return;
151                    }
152    
153                    String syncEvent = DLSyncConstants.EVENT_UPDATE;
154    
155                    if (dlFileVersion.getVersion().equals(
156                                    DLFileEntryConstants.VERSION_DEFAULT)) {
157    
158                            syncEvent = DLSyncConstants.EVENT_ADD;
159                    }
160    
161                    DLUtil.startWorkflowInstance(
162                            userId, dlFileVersion, syncEvent, serviceContext);
163            }
164    
165            private void _startWorkflowInstance(
166                            long userId, FileEntry fileEntry, ServiceContext serviceContext)
167                    throws PortalException {
168    
169                    DLFileVersion dlFileVersion = _getWorkflowDLFileVersion(
170                            fileEntry.getFileEntryId(), serviceContext);
171    
172                    _startWorkflowInstance(userId, dlFileVersion, serviceContext);
173            }
174    
175    }