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