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