/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.repository.capabilities;
import com.liferay.document.library.kernel.model.DLFileEntry;
import com.liferay.document.library.kernel.model.DLFileEntryConstants;
import com.liferay.document.library.kernel.model.DLFileVersion;
import com.liferay.document.library.kernel.model.DLSyncConstants;
import com.liferay.document.library.kernel.util.DLAppHelperThreadLocal;
import com.liferay.document.library.kernel.util.DLUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.repository.LocalRepository;
import com.liferay.portal.kernel.repository.Repository;
import com.liferay.portal.kernel.repository.capabilities.WorkflowCapability;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.repository.model.FileVersion;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import com.liferay.portal.kernel.workflow.WorkflowThreadLocal;
import com.liferay.portal.repository.capabilities.util.DLFileEntryServiceAdapter;
import com.liferay.portal.repository.capabilities.util.DLFileVersionServiceAdapter;
import com.liferay.portal.repository.liferayrepository.LiferayWorkflowLocalRepositoryWrapper;
import com.liferay.portal.repository.liferayrepository.LiferayWorkflowRepositoryWrapper;
import com.liferay.portal.repository.util.RepositoryWrapperAware;
/**
* @author Adolfo PĂ©rez
*/
public class LiferayWorkflowCapability
implements RepositoryWrapperAware, WorkflowCapability, WorkflowSupport {
public LiferayWorkflowCapability(
DLFileEntryServiceAdapter dlFileEntryServiceAdapter,
DLFileVersionServiceAdapter dlFileVersionServiceAdapter) {
_dlFileEntryServiceAdapter = dlFileEntryServiceAdapter;
_dlFileVersionServiceAdapter = dlFileVersionServiceAdapter;
}
@Override
public void addFileEntry(
long userId, FileEntry fileEntry, ServiceContext serviceContext)
throws PortalException {
boolean previousEnabled = WorkflowThreadLocal.isEnabled();
if (!DLAppHelperThreadLocal.isEnabled()) {
WorkflowThreadLocal.setEnabled(false);
}
try {
FileVersion fileVersion = fileEntry.getFileVersion();
DLUtil.startWorkflowInstance(
userId, (DLFileVersion)fileVersion.getModel(),
DLSyncConstants.EVENT_ADD, serviceContext);
}
finally {
if (!DLAppHelperThreadLocal.isEnabled()) {
WorkflowThreadLocal.setEnabled(previousEnabled);
}
}
}
@Override
public void checkInFileEntry(
long userId, FileEntry fileEntry, boolean majorVersion,
ServiceContext serviceContext)
throws PortalException {
boolean keepFileVersionLabel =
_dlFileEntryServiceAdapter.isKeepFileVersionLabel(
fileEntry.getFileEntryId(), majorVersion, serviceContext);
if ((serviceContext.getWorkflowAction() ==
WorkflowConstants.ACTION_PUBLISH) &&
!keepFileVersionLabel) {
DLFileVersion latestDLFileVersion =
_dlFileVersionServiceAdapter.getLatestFileVersion(
fileEntry.getFileEntryId(), false);
DLUtil.startWorkflowInstance(
userId, latestDLFileVersion, DLSyncConstants.EVENT_UPDATE,
serviceContext);
}
}
@Override
public int getStatus(FileEntry fileEntry) {
DLFileEntry dlFileEntry = (DLFileEntry)fileEntry.getModel();
return dlFileEntry.getStatus();
}
@Override
public void revertFileEntry(
long userId, FileEntry fileEntry, ServiceContext serviceContext)
throws PortalException {
_startWorkflowInstance(userId, fileEntry, serviceContext);
}
@Override
public void updateFileEntry(
long userId, FileEntry fileEntry, boolean majorVersion,
ServiceContext serviceContext)
throws PortalException {
_startWorkflowInstance(userId, fileEntry, serviceContext);
}
@Override
public LocalRepository wrapLocalRepository(
LocalRepository localRepository) {
return new LiferayWorkflowLocalRepositoryWrapper(localRepository, this);
}
@Override
public Repository wrapRepository(Repository repository) {
return new LiferayWorkflowRepositoryWrapper(repository, this);
}
private DLFileVersion _getWorkflowDLFileVersion(
long fileEntryId, ServiceContext serviceContext)
throws PortalException {
DLFileEntry dlFileEntry = _dlFileEntryServiceAdapter.getDLFileEntry(
fileEntryId);
if (dlFileEntry.isCheckedOut()) {
return null;
}
DLFileVersion dlFileVersion =
_dlFileVersionServiceAdapter.getLatestFileVersion(
fileEntryId, true);
if (dlFileVersion.isApproved() ||
(serviceContext.getWorkflowAction() ==
WorkflowConstants.ACTION_PUBLISH)) {
return dlFileVersion;
}
return null;
}
private void _startWorkflowInstance(
long userId, DLFileVersion dlFileVersion,
ServiceContext serviceContext)
throws PortalException {
if (dlFileVersion == null) {
return;
}
String syncEvent = DLSyncConstants.EVENT_UPDATE;
if (dlFileVersion.getVersion().equals(
DLFileEntryConstants.VERSION_DEFAULT)) {
syncEvent = DLSyncConstants.EVENT_ADD;
}
DLUtil.startWorkflowInstance(
userId, dlFileVersion, syncEvent, serviceContext);
}
private void _startWorkflowInstance(
long userId, FileEntry fileEntry, ServiceContext serviceContext)
throws PortalException {
DLFileVersion dlFileVersion = _getWorkflowDLFileVersion(
fileEntry.getFileEntryId(), serviceContext);
_startWorkflowInstance(userId, dlFileVersion, serviceContext);
}
private final DLFileEntryServiceAdapter _dlFileEntryServiceAdapter;
private final DLFileVersionServiceAdapter _dlFileVersionServiceAdapter;
}