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