001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
066     * @author Bruno Farache
067     * @author Raymond Aug??
068     * @author Sampsa Sohlman
069     * @author Mate Thurzo
070     * @author Zsolt Berentey
071     */
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", false, 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                                            dlFileEntry.isInTrashContainer()) {
404    
405                                            return;
406                                    }
407    
408                                    FileEntry fileEntry = DLAppLocalServiceUtil.getFileEntry(
409                                            dlFileEntry.getFileEntryId());
410    
411                                    StagedModelDataHandlerUtil.exportStagedModel(
412                                            portletDataContext, fileEntry);
413                            }
414    
415                            @Override
416                            public long performCount() throws PortalException, SystemException {
417                                    ManifestSummary manifestSummary =
418                                            portletDataContext.getManifestSummary();
419    
420                                    long modelAdditionCount =
421                                            DLFileEntryLocalServiceUtil.getFileEntriesCount(
422                                                    portletDataContext.getScopeGroupId(),
423                                                    portletDataContext.getDateRange(),
424                                                    portletDataContext.getScopeGroupId(),
425                                                    new QueryDefinition(WorkflowConstants.STATUS_APPROVED));
426    
427                                    StagedModelType stagedModelType = getStagedModelType();
428    
429                                    manifestSummary.addModelAdditionCount(
430                                            stagedModelType.toString(), modelAdditionCount);
431    
432                                    long modelDeletionCount =
433                                            ExportImportHelperUtil.getModelDeletionCount(
434                                                    portletDataContext, stagedModelType);
435    
436                                    manifestSummary.addModelDeletionCount(
437                                            stagedModelType.toString(), modelDeletionCount);
438    
439                                    return modelAdditionCount;
440                            }
441    
442                    };
443            }
444    
445            protected ActionableDynamicQuery getFolderActionableDynamicQuery(
446                            final PortletDataContext portletDataContext)
447                    throws Exception {
448    
449                    return new DLFolderExportActionableDynamicQuery(portletDataContext) {
450    
451                            @Override
452                            protected void addCriteria(DynamicQuery dynamicQuery) {
453                                    super.addCriteria(dynamicQuery);
454    
455                                    Property property = PropertyFactoryUtil.forName("repositoryId");
456    
457                                    dynamicQuery.add(
458                                            property.eq(portletDataContext.getScopeGroupId()));
459                            }
460    
461                            @Override
462                            protected StagedModelType getStagedModelType() {
463                                    return new StagedModelType(Folder.class);
464                            }
465    
466                            @Override
467                            protected void performAction(Object object)
468                                    throws PortalException, SystemException {
469    
470                                    DLFolder dlFolder = (DLFolder)object;
471    
472                                    if (dlFolder.isInTrash() || dlFolder.isInTrashContainer()) {
473                                            return;
474                                    }
475    
476                                    Folder folder = DLAppLocalServiceUtil.getFolder(
477                                            dlFolder.getFolderId());
478    
479                                    StagedModelDataHandlerUtil.exportStagedModel(
480                                            portletDataContext, folder);
481                            }
482    
483                    };
484            }
485    
486            protected ActionableDynamicQuery getRepositoryActionableDynamicQuery(
487                            final PortletDataContext portletDataContext)
488                    throws Exception {
489    
490                    return new RepositoryExportActionableDynamicQuery(portletDataContext) {
491    
492                            @Override
493                            protected void addCriteria(DynamicQuery dynamicQuery) {
494                                    super.addCriteria(dynamicQuery);
495    
496                                    Property classNameIdProperty = PropertyFactoryUtil.forName(
497                                            "classNameId");
498    
499                                    long liferayRepositoryClassNameId = PortalUtil.getClassNameId(
500                                            LiferayRepository.class);
501    
502                                    dynamicQuery.add(
503                                            classNameIdProperty.ne(liferayRepositoryClassNameId));
504    
505                                    Disjunction disjunction = RestrictionsFactoryUtil.disjunction();
506    
507                                    Property portletIdProperty = PropertyFactoryUtil.forName(
508                                            "portletId");
509    
510                                    disjunction.add(portletIdProperty.isNull());
511                                    disjunction.add(portletIdProperty.eq(StringPool.BLANK));
512    
513                                    dynamicQuery.add(disjunction);
514                            }
515    
516                            @Override
517                            protected StagedModelType getStagedModelType() {
518                                    return new StagedModelType(
519                                            PortalUtil.getClassNameId(Repository.class.getName()),
520                                            StagedModelType.REFERRER_CLASS_NAME_ID_ALL);
521                            }
522    
523                    };
524            }
525    
526    }