001
014
015 package com.liferay.portlet.documentlibrary.lar;
016
017 import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
018 import com.liferay.portal.kernel.dao.orm.Disjunction;
019 import com.liferay.portal.kernel.dao.orm.DynamicQuery;
020 import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil;
021 import com.liferay.portal.kernel.dao.orm.ProjectionFactoryUtil;
022 import com.liferay.portal.kernel.dao.orm.Property;
023 import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
024 import com.liferay.portal.kernel.dao.orm.QueryDefinition;
025 import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil;
026 import com.liferay.portal.kernel.exception.PortalException;
027 import com.liferay.portal.kernel.exception.SystemException;
028 import com.liferay.portal.kernel.lar.BasePortletDataHandler;
029 import com.liferay.portal.kernel.lar.ExportImportHelperUtil;
030 import com.liferay.portal.kernel.lar.ManifestSummary;
031 import com.liferay.portal.kernel.lar.PortletDataContext;
032 import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
033 import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
034 import com.liferay.portal.kernel.lar.StagedModelDataHandler;
035 import com.liferay.portal.kernel.lar.StagedModelDataHandlerRegistryUtil;
036 import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil;
037 import com.liferay.portal.kernel.lar.StagedModelType;
038 import com.liferay.portal.kernel.log.Log;
039 import com.liferay.portal.kernel.log.LogFactoryUtil;
040 import com.liferay.portal.kernel.repository.model.FileEntry;
041 import com.liferay.portal.kernel.repository.model.Folder;
042 import com.liferay.portal.kernel.util.GetterUtil;
043 import com.liferay.portal.kernel.util.MapUtil;
044 import com.liferay.portal.kernel.util.PortalClassLoaderUtil;
045 import com.liferay.portal.kernel.util.StringPool;
046 import com.liferay.portal.kernel.workflow.WorkflowConstants;
047 import com.liferay.portal.kernel.xml.Element;
048 import com.liferay.portal.model.Repository;
049 import com.liferay.portal.repository.liferayrepository.LiferayRepository;
050 import com.liferay.portal.service.persistence.RepositoryExportActionableDynamicQuery;
051 import com.liferay.portal.util.PortalUtil;
052 import com.liferay.portal.util.PropsValues;
053 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
054 import com.liferay.portlet.documentlibrary.model.DLFileEntryConstants;
055 import com.liferay.portlet.documentlibrary.model.DLFileEntryType;
056 import com.liferay.portlet.documentlibrary.model.DLFileRank;
057 import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
058 import com.liferay.portlet.documentlibrary.model.DLFileVersion;
059 import com.liferay.portlet.documentlibrary.model.DLFolder;
060 import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
061 import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
062 import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
063 import com.liferay.portlet.documentlibrary.service.permission.DLPermission;
064 import com.liferay.portlet.documentlibrary.service.persistence.DLFileEntryExportActionableDynamicQuery;
065 import com.liferay.portlet.documentlibrary.service.persistence.DLFileEntryTypeExportActionableDynamicQuery;
066 import com.liferay.portlet.documentlibrary.service.persistence.DLFileShortcutExportActionableDynamicQuery;
067 import com.liferay.portlet.documentlibrary.service.persistence.DLFolderExportActionableDynamicQuery;
068
069 import java.util.List;
070 import java.util.Map;
071
072 import javax.portlet.PortletPreferences;
073
074
081 public class DLPortletDataHandler extends BasePortletDataHandler {
082
083 public static final String NAMESPACE = "document_library";
084
085 public DLPortletDataHandler() {
086 setDataLocalized(true);
087 setDataPortletPreferences("rootFolderId");
088 setDeletionSystemEventStagedModelTypes(
089 new StagedModelType(DLFileEntryType.class),
090 new StagedModelType(DLFileRank.class),
091 new StagedModelType(DLFileShortcut.class),
092 new StagedModelType(DLFileEntryConstants.getClassName()),
093 new StagedModelType(DLFolderConstants.getClassName()),
094 new StagedModelType(Repository.class));
095 setExportControls(
096 new PortletDataHandlerBoolean(
097 NAMESPACE, "repositories", true, false, null,
098 Repository.class.getName()),
099 new PortletDataHandlerBoolean(
100 NAMESPACE, "folders", true, false, null,
101 DLFolderConstants.getClassName()),
102 new PortletDataHandlerBoolean(
103 NAMESPACE, "documents", true, false,
104 new PortletDataHandlerControl[] {
105 new PortletDataHandlerBoolean(
106 NAMESPACE, "previews-and-thumbnails")
107 },
108 DLFileEntryConstants.getClassName()),
109 new PortletDataHandlerBoolean(
110 NAMESPACE, "document-types", true, false, null,
111 DLFileEntryType.class.getName()),
112 new PortletDataHandlerBoolean(
113 NAMESPACE, "shortcuts", true, false, null,
114 DLFileShortcut.class.getName()));
115 setPublishToLiveByDefault(PropsValues.DL_PUBLISH_TO_LIVE_BY_DEFAULT);
116 }
117
118 @Override
119 protected PortletPreferences doDeleteData(
120 PortletDataContext portletDataContext, String portletId,
121 PortletPreferences portletPreferences)
122 throws Exception {
123
124 if (portletDataContext.addPrimaryKey(
125 DLPortletDataHandler.class, "deleteData")) {
126
127 return portletPreferences;
128 }
129
130 DLAppLocalServiceUtil.deleteAll(portletDataContext.getScopeGroupId());
131
132 return portletPreferences;
133 }
134
135 @Override
136 protected String doExportData(
137 final PortletDataContext portletDataContext, String portletId,
138 PortletPreferences portletPreferences)
139 throws Exception {
140
141 portletDataContext.addPortletPermissions(DLPermission.RESOURCE_NAME);
142
143 Element rootElement = addExportDataRootElement(portletDataContext);
144
145 rootElement.addAttribute(
146 "group-id", String.valueOf(portletDataContext.getScopeGroupId()));
147
148 if (portletDataContext.getBooleanParameter(NAMESPACE, "folders")) {
149 ActionableDynamicQuery folderActionableDynamicQuery =
150 getFolderActionableDynamicQuery(portletDataContext);
151
152 folderActionableDynamicQuery.performActions();
153 }
154
155 if (portletDataContext.getBooleanParameter(NAMESPACE, "documents")) {
156 ActionableDynamicQuery fileEntryActionableDynamicQuery =
157 getFileEntryActionableDynamicQuery(portletDataContext);
158
159 fileEntryActionableDynamicQuery.performActions();
160 }
161
162 if (portletDataContext.getBooleanParameter(
163 NAMESPACE, "document-types")) {
164
165 ActionableDynamicQuery fileEntryTypeActionableDynamicQuery =
166 getDLFileEntryTypeActionableDynamicQuery(portletDataContext);
167
168 fileEntryTypeActionableDynamicQuery.performActions();
169 }
170
171 if (portletDataContext.getBooleanParameter(NAMESPACE, "repositories")) {
172 ActionableDynamicQuery repositoryActionableDynamicQuery =
173 getRepositoryActionableDynamicQuery(portletDataContext);
174
175 repositoryActionableDynamicQuery.performActions();
176 }
177
178 if (portletDataContext.getBooleanParameter(NAMESPACE, "shortcuts")) {
179 ActionableDynamicQuery fileShortcutActionableDynamicQuery =
180 getDLFileShortcutActionableDynamicQuery(portletDataContext);
181
182 fileShortcutActionableDynamicQuery.performActions();
183 }
184
185 return getExportDataRootElementString(rootElement);
186 }
187
188 @Override
189 protected PortletPreferences doImportData(
190 PortletDataContext portletDataContext, String portletId,
191 PortletPreferences portletPreferences, String data)
192 throws Exception {
193
194 portletDataContext.importPortletPermissions(DLPermission.RESOURCE_NAME);
195
196 if (portletDataContext.getBooleanParameter(NAMESPACE, "folders")) {
197 Element foldersElement =
198 portletDataContext.getImportDataGroupElement(DLFolder.class);
199
200 List<Element> folderElements = foldersElement.elements();
201
202 for (Element folderElement : folderElements) {
203 StagedModelDataHandlerUtil.importStagedModel(
204 portletDataContext, folderElement);
205 }
206 }
207
208 if (portletDataContext.getBooleanParameter(NAMESPACE, "documents")) {
209 Element fileEntriesElement =
210 portletDataContext.getImportDataGroupElement(DLFileEntry.class);
211
212 List<Element> fileEntryElements = fileEntriesElement.elements();
213
214 for (Element fileEntryElement : fileEntryElements) {
215 StagedModelDataHandlerUtil.importStagedModel(
216 portletDataContext, fileEntryElement);
217 }
218 }
219
220 if (portletDataContext.getBooleanParameter(
221 NAMESPACE, "document-types")) {
222
223 Element fileEntryTypesElement =
224 portletDataContext.getImportDataGroupElement(
225 DLFileEntryType.class);
226
227 List<Element> fileEntryTypeElements =
228 fileEntryTypesElement.elements();
229
230 for (Element fileEntryTypeElement : fileEntryTypeElements) {
231 StagedModelDataHandlerUtil.importStagedModel(
232 portletDataContext, fileEntryTypeElement);
233 }
234 }
235
236 if (portletDataContext.getBooleanParameter(NAMESPACE, "repositories")) {
237 Element repositoriesElement =
238 portletDataContext.getImportDataGroupElement(Repository.class);
239
240 List<Element> repositoryElements = repositoriesElement.elements();
241
242 for (Element repositoryElement : repositoryElements) {
243 StagedModelDataHandlerUtil.importStagedModel(
244 portletDataContext, repositoryElement);
245 }
246 }
247
248 if (portletDataContext.getBooleanParameter(NAMESPACE, "shortcuts")) {
249 Element fileShortcutsElement =
250 portletDataContext.getImportDataGroupElement(
251 DLFileShortcut.class);
252
253 List<Element> fileShortcutElements =
254 fileShortcutsElement.elements();
255
256 for (Element fileShortcutElement : fileShortcutElements) {
257 StagedModelDataHandlerUtil.importStagedModel(
258 portletDataContext, fileShortcutElement);
259 }
260 }
261
262 return portletPreferences;
263 }
264
265 @Override
266 protected void doPrepareManifestSummary(
267 final PortletDataContext portletDataContext,
268 PortletPreferences portletPreferences)
269 throws Exception {
270
271 ActionableDynamicQuery dlFileShortcutActionableDynamicQuery =
272 getDLFileShortcutActionableDynamicQuery(portletDataContext);
273
274 dlFileShortcutActionableDynamicQuery.performCount();
275
276 ActionableDynamicQuery fileEntryActionableDynamicQuery =
277 getFileEntryActionableDynamicQuery(portletDataContext);
278
279 fileEntryActionableDynamicQuery.performCount();
280
281 ActionableDynamicQuery fileEntryTypeActionableDynamicQuery =
282 getDLFileEntryTypeActionableDynamicQuery(portletDataContext);
283
284 fileEntryTypeActionableDynamicQuery.performCount();
285
286 ActionableDynamicQuery folderActionableDynamicQuery =
287 getFolderActionableDynamicQuery(portletDataContext);
288
289 folderActionableDynamicQuery.performCount();
290
291 ActionableDynamicQuery repositoryActionableDynamicQuery =
292 getRepositoryActionableDynamicQuery(portletDataContext);
293
294 repositoryActionableDynamicQuery.performCount();
295 }
296
297 @Override
298 protected PortletPreferences doProcessExportPortletPreferences(
299 PortletDataContext portletDataContext, String portletId,
300 PortletPreferences portletPreferences)
301 throws Exception {
302
303 long rootFolderId = GetterUtil.getLong(
304 portletPreferences.getValue("rootFolderId", null));
305
306 if (rootFolderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
307 Folder folder = null;
308
309 try {
310 folder = DLAppLocalServiceUtil.getFolder(rootFolderId);
311 }
312 catch (PortalException e) {
313 if (_log.isErrorEnabled()) {
314 _log.error(
315 "Portlet " + portletId +
316 " refers to an invalid root folder ID " +
317 rootFolderId);
318 }
319
320 throw e;
321 }
322
323 StagedModelDataHandlerUtil.exportReferenceStagedModel(
324 portletDataContext, portletId, folder);
325 }
326
327 return portletPreferences;
328 }
329
330 @Override
331 protected PortletPreferences doProcessImportPortletPreferences(
332 PortletDataContext portletDataContext, String portletId,
333 PortletPreferences portletPreferences)
334 throws Exception {
335
336 long rootFolderId = GetterUtil.getLong(
337 portletPreferences.getValue("rootFolderId", null));
338
339 if (rootFolderId > 0) {
340 Element foldersElement =
341 portletDataContext.getImportDataGroupElement(DLFolder.class);
342
343 List<Element> folderElements = foldersElement.elements();
344
345 if (!folderElements.isEmpty()) {
346 StagedModelDataHandlerUtil.importStagedModel(
347 portletDataContext, folderElements.get(0));
348
349 Map<Long, Long> folderIds =
350 (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
351 Folder.class);
352
353 rootFolderId = MapUtil.getLong(
354 folderIds, rootFolderId, rootFolderId);
355
356 portletPreferences.setValue(
357 "rootFolderId", String.valueOf(rootFolderId));
358 }
359 }
360
361 return portletPreferences;
362 }
363
364 protected ActionableDynamicQuery getDLFileEntryTypeActionableDynamicQuery(
365 final PortletDataContext portletDataContext)
366 throws Exception {
367
368 return new DLFileEntryTypeExportActionableDynamicQuery(
369 portletDataContext) {
370
371 @Override
372 protected void addCriteria(DynamicQuery dynamicQuery) {
373 super.addCriteria(dynamicQuery);
374
375 Property property = PropertyFactoryUtil.forName("groupId");
376
377 dynamicQuery.add(
378 property.in(
379 new Long[] {
380 portletDataContext.getScopeGroupId()
381 }));
382 }
383
384 @Override
385 protected void performAction(Object object) throws PortalException {
386 DLFileEntryType dlFileEntryType = (DLFileEntryType)object;
387
388 if (dlFileEntryType.isExportable()) {
389 StagedModelDataHandlerUtil.exportStagedModel(
390 portletDataContext, dlFileEntryType);
391 }
392 }
393
394 };
395 }
396
397 protected ActionableDynamicQuery getDLFileShortcutActionableDynamicQuery(
398 final PortletDataContext portletDataContext)
399 throws Exception {
400
401 return new DLFileShortcutExportActionableDynamicQuery(
402 portletDataContext) {
403
404 @Override
405 protected void addCriteria(DynamicQuery dynamicQuery) {
406 super.addCriteria(dynamicQuery);
407
408 Property property = PropertyFactoryUtil.forName("active");
409
410 dynamicQuery.add(property.eq(Boolean.TRUE));
411 }
412
413 };
414 }
415
416 protected ActionableDynamicQuery getFileEntryActionableDynamicQuery(
417 final PortletDataContext portletDataContext)
418 throws Exception {
419
420 return new DLFileEntryExportActionableDynamicQuery(portletDataContext) {
421
422 @Override
423 protected void addCriteria(DynamicQuery dynamicQuery) {
424 super.addCriteria(dynamicQuery);
425
426 DynamicQuery fileVersionDynamicQuery =
427 DynamicQueryFactoryUtil.forClass(
428 DLFileVersion.class, "dlFileVersion",
429 PortalClassLoaderUtil.getClassLoader());
430
431 fileVersionDynamicQuery.setProjection(
432 ProjectionFactoryUtil.property("fileEntryId"));
433
434 fileVersionDynamicQuery.add(
435 RestrictionsFactoryUtil.eqProperty(
436 "dlFileVersion.version", "version"));
437
438 fileVersionDynamicQuery.add(
439 RestrictionsFactoryUtil.eqProperty(
440 "dlFileVersion.fileEntryId", "fileEntryId"));
441
442 Property statusProperty = PropertyFactoryUtil.forName("status");
443
444 StagedModelDataHandler<?> stagedModelDataHandler =
445 StagedModelDataHandlerRegistryUtil.
446 getStagedModelDataHandler(DLFileEntry.class.getName());
447
448 fileVersionDynamicQuery.add(
449 statusProperty.in(
450 stagedModelDataHandler.getExportableStatuses()));
451
452 Property fileEntryIdProperty = PropertyFactoryUtil.forName(
453 "fileEntryId");
454
455 dynamicQuery.add(
456 fileEntryIdProperty.in(fileVersionDynamicQuery));
457
458 Property repositoryIdProperty = PropertyFactoryUtil.forName(
459 "repositoryId");
460
461 dynamicQuery.add(
462 repositoryIdProperty.eq(
463 portletDataContext.getScopeGroupId()));
464 }
465
466 @Override
467 protected StagedModelType getStagedModelType() {
468 return new StagedModelType(DLFileEntryConstants.getClassName());
469 }
470
471 @Override
472 protected void performAction(Object object)
473 throws PortalException, SystemException {
474
475 DLFileEntry dlFileEntry = (DLFileEntry)object;
476
477 if (dlFileEntry.isInTrash()) {
478 return;
479 }
480
481 FileEntry fileEntry = DLAppLocalServiceUtil.getFileEntry(
482 dlFileEntry.getFileEntryId());
483
484 StagedModelDataHandlerUtil.exportStagedModel(
485 portletDataContext, fileEntry);
486 }
487
488 @Override
489 public long performCount() throws PortalException, SystemException {
490 ManifestSummary manifestSummary =
491 portletDataContext.getManifestSummary();
492
493 long modelAdditionCount =
494 DLFileEntryLocalServiceUtil.getFileEntriesCount(
495 portletDataContext.getScopeGroupId(),
496 portletDataContext.getDateRange(),
497 portletDataContext.getScopeGroupId(),
498 new QueryDefinition(WorkflowConstants.STATUS_APPROVED));
499
500 StagedModelType stagedModelType = getStagedModelType();
501
502 manifestSummary.addModelAdditionCount(
503 stagedModelType.toString(), modelAdditionCount);
504
505 long modelDeletionCount =
506 ExportImportHelperUtil.getModelDeletionCount(
507 portletDataContext, stagedModelType);
508
509 manifestSummary.addModelDeletionCount(
510 stagedModelType.toString(), modelDeletionCount);
511
512 return modelAdditionCount;
513 }
514
515 };
516 }
517
518 protected ActionableDynamicQuery getFolderActionableDynamicQuery(
519 final PortletDataContext portletDataContext)
520 throws Exception {
521
522 return new DLFolderExportActionableDynamicQuery(portletDataContext) {
523
524 @Override
525 protected void addCriteria(DynamicQuery dynamicQuery) {
526 super.addCriteria(dynamicQuery);
527
528 Property property = PropertyFactoryUtil.forName("repositoryId");
529
530 dynamicQuery.add(
531 property.eq(portletDataContext.getScopeGroupId()));
532 }
533
534 @Override
535 protected StagedModelType getStagedModelType() {
536 return new StagedModelType(DLFolderConstants.getClassName());
537 }
538
539 @Override
540 protected void performAction(Object object)
541 throws PortalException, SystemException {
542
543 DLFolder dlFolder = (DLFolder)object;
544
545 if (dlFolder.isInTrash()) {
546 return;
547 }
548
549 Folder folder = DLAppLocalServiceUtil.getFolder(
550 dlFolder.getFolderId());
551
552 StagedModelDataHandlerUtil.exportStagedModel(
553 portletDataContext, folder);
554 }
555
556 };
557 }
558
559 protected ActionableDynamicQuery getRepositoryActionableDynamicQuery(
560 final PortletDataContext portletDataContext)
561 throws Exception {
562
563 return new RepositoryExportActionableDynamicQuery(portletDataContext) {
564
565 @Override
566 protected void addCriteria(DynamicQuery dynamicQuery) {
567 super.addCriteria(dynamicQuery);
568
569 Property classNameIdProperty = PropertyFactoryUtil.forName(
570 "classNameId");
571
572 long liferayRepositoryClassNameId = PortalUtil.getClassNameId(
573 LiferayRepository.class);
574
575 dynamicQuery.add(
576 classNameIdProperty.ne(liferayRepositoryClassNameId));
577
578 Disjunction disjunction = RestrictionsFactoryUtil.disjunction();
579
580 Property portletIdProperty = PropertyFactoryUtil.forName(
581 "portletId");
582
583 disjunction.add(portletIdProperty.isNull());
584 disjunction.add(portletIdProperty.eq(StringPool.BLANK));
585
586 dynamicQuery.add(disjunction);
587 }
588
589 @Override
590 protected StagedModelType getStagedModelType() {
591 return new StagedModelType(
592 PortalUtil.getClassNameId(Repository.class.getName()),
593 StagedModelType.REFERRER_CLASS_NAME_ID_ALL);
594 }
595
596 };
597 }
598
599 private static Log _log = LogFactoryUtil.getLog(DLPortletDataHandler.class);
600
601 }