001
014
015 package com.liferay.portal.repository.capabilities;
016
017 import com.liferay.portal.kernel.exception.PortalException;
018 import com.liferay.portal.kernel.messaging.DestinationNames;
019 import com.liferay.portal.kernel.messaging.Message;
020 import com.liferay.portal.kernel.messaging.MessageBusUtil;
021 import com.liferay.portal.kernel.repository.LocalRepository;
022 import com.liferay.portal.kernel.repository.Repository;
023 import com.liferay.portal.kernel.repository.capabilities.BulkOperationCapability;
024 import com.liferay.portal.kernel.repository.capabilities.SyncCapability;
025 import com.liferay.portal.kernel.repository.event.RepositoryEventAware;
026 import com.liferay.portal.kernel.repository.event.RepositoryEventListener;
027 import com.liferay.portal.kernel.repository.event.RepositoryEventType;
028 import com.liferay.portal.kernel.repository.event.TrashRepositoryEventType;
029 import com.liferay.portal.kernel.repository.event.WorkflowRepositoryEventType;
030 import com.liferay.portal.kernel.repository.model.BaseRepositoryModelOperation;
031 import com.liferay.portal.kernel.repository.model.FileEntry;
032 import com.liferay.portal.kernel.repository.model.Folder;
033 import com.liferay.portal.kernel.repository.registry.RepositoryEventRegistry;
034 import com.liferay.portal.kernel.transaction.TransactionCommitCallbackRegistryUtil;
035 import com.liferay.portal.model.Group;
036 import com.liferay.portal.repository.liferayrepository.LiferaySyncLocalRepositoryWrapper;
037 import com.liferay.portal.repository.liferayrepository.LiferaySyncRepositoryWrapper;
038 import com.liferay.portal.repository.liferayrepository.model.LiferayFileEntry;
039 import com.liferay.portal.repository.liferayrepository.model.LiferayFolder;
040 import com.liferay.portal.repository.util.RepositoryWrapperAware;
041 import com.liferay.portal.service.GroupLocalServiceUtil;
042 import com.liferay.portlet.documentlibrary.model.DLSyncConstants;
043 import com.liferay.portlet.documentlibrary.model.DLSyncEvent;
044 import com.liferay.portlet.documentlibrary.service.DLSyncEventLocalServiceUtil;
045
046 import java.util.HashMap;
047 import java.util.Map;
048 import java.util.concurrent.Callable;
049
050
053 public class LiferaySyncCapability
054 implements RepositoryEventAware, RepositoryWrapperAware, SyncCapability {
055
056 public LiferaySyncCapability(
057 BulkOperationCapability bulkOperationCapability) {
058
059 _bulkOperationCapability = bulkOperationCapability;
060 }
061
062 @Override
063 public void destroyDocumentRepository() throws PortalException {
064 _bulkOperationCapability.execute(new DeleteRepositoryModelOperation());
065 }
066
067 @Override
068 public void registerRepositoryEventListeners(
069 RepositoryEventRegistry repositoryEventRegistry) {
070
071 repositoryEventRegistry.registerRepositoryEventListener(
072 RepositoryEventType.Add.class, Folder.class,
073 ADD_FOLDER_EVENT_LISTENER);
074 repositoryEventRegistry.registerRepositoryEventListener(
075 RepositoryEventType.Delete.class, FileEntry.class,
076 DELETE_FILE_ENTRY_EVENT_LISTENER);
077 repositoryEventRegistry.registerRepositoryEventListener(
078 RepositoryEventType.Delete.class, Folder.class,
079 DELETE_FOLDER_EVENT_LISTENER);
080 repositoryEventRegistry.registerRepositoryEventListener(
081 RepositoryEventType.Move.class, FileEntry.class,
082 MOVE_FILE_ENTRY_EVENT_LISTENER);
083 repositoryEventRegistry.registerRepositoryEventListener(
084 RepositoryEventType.Move.class, Folder.class,
085 MOVE_FOLDER_EVENT_LISTENER);
086 repositoryEventRegistry.registerRepositoryEventListener(
087 TrashRepositoryEventType.EntryRestored.class, FileEntry.class,
088 RESTORE_FILE_ENTRY_EVENT_LISTENER);
089 repositoryEventRegistry.registerRepositoryEventListener(
090 TrashRepositoryEventType.EntryRestored.class, Folder.class,
091 RESTORE_FOLDER_EVENT_LISTENER);
092 repositoryEventRegistry.registerRepositoryEventListener(
093 TrashRepositoryEventType.EntryTrashed.class, FileEntry.class,
094 TRASH_FILE_ENTRY_EVENT_LISTENER);
095 repositoryEventRegistry.registerRepositoryEventListener(
096 TrashRepositoryEventType.EntryTrashed.class, Folder.class,
097 TRASH_FOLDER_EVENT_LISTENER);
098 repositoryEventRegistry.registerRepositoryEventListener(
099 RepositoryEventType.Update.class, FileEntry.class,
100 UPDATE_FILE_ENTRY_EVENT_LISTENER);
101 repositoryEventRegistry.registerRepositoryEventListener(
102 RepositoryEventType.Update.class, Folder.class,
103 UPDATE_FOLDER_EVENT_LISTENER);
104 repositoryEventRegistry.registerRepositoryEventListener(
105 WorkflowRepositoryEventType.Add.class, FileEntry.class,
106 WORKFLOW_ADD_FILE_ENTRY_EVENT_LISTENER);
107 repositoryEventRegistry.registerRepositoryEventListener(
108 WorkflowRepositoryEventType.Update.class, FileEntry.class,
109 WORKFLOW_UPDATE_FILE_ENTRY_EVENT_LISTENER);
110 }
111
112 @Override
113 public LocalRepository wrapLocalRepository(
114 LocalRepository localRepository) {
115
116 return new LiferaySyncLocalRepositoryWrapper(localRepository, this);
117 }
118
119 @Override
120 public Repository wrapRepository(Repository repository) {
121 return new LiferaySyncRepositoryWrapper(repository, this);
122 }
123
124 protected static boolean isStagingGroup(long groupId) {
125 try {
126 Group group = GroupLocalServiceUtil.getGroup(groupId);
127
128 return group.isStagingGroup();
129 }
130 catch (Exception e) {
131 return false;
132 }
133 }
134
135 protected static void registerDLSyncEventCallback(
136 String event, FileEntry fileEntry) {
137
138 if (isStagingGroup(fileEntry.getGroupId()) ||
139 !(fileEntry instanceof LiferayFileEntry)) {
140
141 return;
142 }
143
144 registerDLSyncEventCallback(
145 event, DLSyncConstants.TYPE_FILE, fileEntry.getFileEntryId());
146 }
147
148 protected static void registerDLSyncEventCallback(
149 String event, Folder folder) {
150
151 if (isStagingGroup(folder.getGroupId()) ||
152 !(folder instanceof LiferayFolder)) {
153
154 return;
155 }
156
157 registerDLSyncEventCallback(
158 event, DLSyncConstants.TYPE_FOLDER, folder.getFolderId());
159 }
160
161 protected static void registerDLSyncEventCallback(
162 final String event, final String type, final long typePK) {
163
164 DLSyncEvent dlSyncEvent = DLSyncEventLocalServiceUtil.addDLSyncEvent(
165 event, type, typePK);
166
167 final long modifiedTime = dlSyncEvent.getModifiedTime();
168
169 TransactionCommitCallbackRegistryUtil.registerCallback(
170 new Callable<Void>() {
171
172 @Override
173 public Void call() throws Exception {
174 Message message = new Message();
175
176 Map<String, Object> values = new HashMap<>(4);
177
178 values.put("event", event);
179 values.put("modifiedTime", modifiedTime);
180 values.put("type", type);
181 values.put("typePK", typePK);
182
183 message.setValues(values);
184
185 MessageBusUtil.sendMessage(
186 DestinationNames.DOCUMENT_LIBRARY_SYNC_EVENT_PROCESSOR,
187 message);
188
189 return null;
190 }
191
192 }
193 );
194 }
195
196 private static final RepositoryEventListener
197 <RepositoryEventType.Add, Folder> ADD_FOLDER_EVENT_LISTENER =
198 new SyncFolderRepositoryEventListener<>(DLSyncConstants.EVENT_ADD);
199
200 private static final RepositoryEventListener
201 <RepositoryEventType.Delete, FileEntry>
202 DELETE_FILE_ENTRY_EVENT_LISTENER =
203 new SyncFileEntryRepositoryEventListener<>(
204 DLSyncConstants.EVENT_DELETE);
205
206 private static final RepositoryEventListener
207 <RepositoryEventType.Delete, Folder> DELETE_FOLDER_EVENT_LISTENER =
208 new SyncFolderRepositoryEventListener<>(
209 DLSyncConstants.EVENT_DELETE);
210
211 private static final RepositoryEventListener
212 <RepositoryEventType.Move, FileEntry> MOVE_FILE_ENTRY_EVENT_LISTENER =
213 new SyncFileEntryRepositoryEventListener<>(
214 DLSyncConstants.EVENT_MOVE);
215
216 private static final RepositoryEventListener
217 <RepositoryEventType.Move, Folder> MOVE_FOLDER_EVENT_LISTENER =
218 new SyncFolderRepositoryEventListener<>(DLSyncConstants.EVENT_MOVE);
219
220 private static final RepositoryEventListener
221 <TrashRepositoryEventType.EntryRestored, FileEntry>
222 RESTORE_FILE_ENTRY_EVENT_LISTENER =
223 new SyncFileEntryRepositoryEventListener<>(
224 DLSyncConstants.EVENT_RESTORE);
225
226 private static final RepositoryEventListener
227 <TrashRepositoryEventType.EntryRestored, Folder>
228 RESTORE_FOLDER_EVENT_LISTENER =
229 new SyncFolderRepositoryEventListener<>(
230 DLSyncConstants.EVENT_RESTORE);
231
232 private static final RepositoryEventListener
233 <TrashRepositoryEventType.EntryTrashed, FileEntry>
234 TRASH_FILE_ENTRY_EVENT_LISTENER =
235 new SyncFileEntryRepositoryEventListener<>(
236 DLSyncConstants.EVENT_TRASH);
237
238 private static final RepositoryEventListener
239 <TrashRepositoryEventType.EntryTrashed, Folder>
240 TRASH_FOLDER_EVENT_LISTENER =
241 new SyncFolderRepositoryEventListener<>(
242 DLSyncConstants.EVENT_TRASH);
243
244 private static final RepositoryEventListener
245 <RepositoryEventType.Update, FileEntry>
246 UPDATE_FILE_ENTRY_EVENT_LISTENER =
247 new SyncFileEntryRepositoryEventListener<>(
248 DLSyncConstants.EVENT_UPDATE);
249
250 private static final RepositoryEventListener
251 <RepositoryEventType.Update, Folder> UPDATE_FOLDER_EVENT_LISTENER =
252 new SyncFolderRepositoryEventListener<>(
253 DLSyncConstants.EVENT_UPDATE);
254
255 private static final RepositoryEventListener
256 <WorkflowRepositoryEventType.Add, FileEntry>
257 WORKFLOW_ADD_FILE_ENTRY_EVENT_LISTENER =
258 new SyncFileEntryRepositoryEventListener<>(
259 DLSyncConstants.EVENT_ADD);
260
261 private static final RepositoryEventListener
262 <WorkflowRepositoryEventType.Update, FileEntry>
263 WORKFLOW_UPDATE_FILE_ENTRY_EVENT_LISTENER =
264 new SyncFileEntryRepositoryEventListener<>(
265 DLSyncConstants.EVENT_UPDATE);
266
267 private final BulkOperationCapability _bulkOperationCapability;
268
269 private static class SyncFileEntryRepositoryEventListener
270 <S extends RepositoryEventType>
271 implements RepositoryEventListener<S, FileEntry> {
272
273 public SyncFileEntryRepositoryEventListener(String syncEvent) {
274 _syncEvent = syncEvent;
275 }
276
277 @Override
278 public void execute(FileEntry fileEntry) {
279 registerDLSyncEventCallback(_syncEvent, fileEntry);
280 }
281
282 private final String _syncEvent;
283
284 }
285
286 private static class SyncFolderRepositoryEventListener
287 <S extends RepositoryEventType>
288 implements RepositoryEventListener<S, Folder> {
289
290 public SyncFolderRepositoryEventListener(String syncEvent) {
291 _syncEvent = syncEvent;
292 }
293
294 @Override
295 public void execute(Folder folder) {
296 registerDLSyncEventCallback(_syncEvent, folder);
297 }
298
299 private final String _syncEvent;
300
301 }
302
303 private class DeleteRepositoryModelOperation
304 extends BaseRepositoryModelOperation {
305
306 @Override
307 public void execute(FileEntry fileEntry) {
308 registerDLSyncEventCallback(
309 DLSyncConstants.EVENT_DELETE, fileEntry);
310 }
311
312 @Override
313 public void execute(Folder folder) {
314 registerDLSyncEventCallback(DLSyncConstants.EVENT_DELETE, folder);
315 }
316
317 }
318
319 }