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, WorkflowSupport {
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) &&
080                            !keepFileVersionLabel) {
081    
082                            DLFileVersion latestDLFileVersion =
083                                    DLFileVersionLocalServiceUtil.getLatestFileVersion(
084                                            fileEntry.getFileEntryId(), false);
085    
086                            DLUtil.startWorkflowInstance(
087                                    userId, latestDLFileVersion, DLSyncConstants.EVENT_UPDATE,
088                                    serviceContext);
089                    }
090            }
091    
092            @Override
093            public int getStatus(FileEntry fileEntry) {
094                    DLFileEntry dlFileEntry = (DLFileEntry)fileEntry.getModel();
095    
096                    return dlFileEntry.getStatus();
097            }
098    
099            @Override
100            public void revertFileEntry(
101                            long userId, FileEntry fileEntry, ServiceContext serviceContext)
102                    throws PortalException {
103    
104                    _startWorkflowInstance(userId, fileEntry, serviceContext);
105            }
106    
107            @Override
108            public void updateFileEntry(
109                            long userId, FileEntry fileEntry, ServiceContext serviceContext)
110                    throws PortalException {
111    
112                    _startWorkflowInstance(userId, fileEntry, serviceContext);
113            }
114    
115            @Override
116            public LocalRepository wrapLocalRepository(
117                    LocalRepository localRepository) {
118    
119                    return new LiferayWorkflowLocalRepositoryWrapper(localRepository, this);
120            }
121    
122            @Override
123            public Repository wrapRepository(Repository repository) {
124                    return new LiferayWorkflowRepositoryWrapper(repository, this);
125            }
126    
127            private DLFileVersion _getWorkflowDLFileVersion(
128                            long fileEntryId, ServiceContext serviceContext)
129                    throws PortalException {
130    
131                    DLFileEntry dlFileEntry = DLFileEntryLocalServiceUtil.getDLFileEntry(
132                            fileEntryId);
133    
134                    if (dlFileEntry.isCheckedOut()) {
135                            return null;
136                    }
137    
138                    DLFileVersion dlFileVersion =
139                            DLFileVersionLocalServiceUtil.getLatestFileVersion(
140                                    fileEntryId, true);
141    
142                    if (dlFileVersion.isApproved() ||
143                            (serviceContext.getWorkflowAction() ==
144                                    WorkflowConstants.ACTION_PUBLISH)) {
145    
146                            return dlFileVersion;
147                    }
148    
149                    return null;
150            }
151    
152            private void _startWorkflowInstance(
153                            long userId, DLFileVersion dlFileVersion,
154                            ServiceContext serviceContext)
155                    throws PortalException {
156    
157                    if (dlFileVersion == null) {
158                            return;
159                    }
160    
161                    String syncEvent = DLSyncConstants.EVENT_UPDATE;
162    
163                    if (dlFileVersion.getVersion().equals(
164                                    DLFileEntryConstants.VERSION_DEFAULT)) {
165    
166                            syncEvent = DLSyncConstants.EVENT_ADD;
167                    }
168    
169                    DLUtil.startWorkflowInstance(
170                            userId, dlFileVersion, syncEvent, serviceContext);
171            }
172    
173            private void _startWorkflowInstance(
174                            long userId, FileEntry fileEntry, ServiceContext serviceContext)
175                    throws PortalException {
176    
177                    DLFileVersion dlFileVersion = _getWorkflowDLFileVersion(
178                            fileEntry.getFileEntryId(), serviceContext);
179    
180                    _startWorkflowInstance(userId, dlFileVersion, serviceContext);
181            }
182    
183    }