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.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    /**
071     * @author Bruno Farache
072     * @author Raymond Aug??
073     * @author Sampsa Sohlman
074     * @author Mate Thurzo
075     * @author Zsolt Berentey
076     */
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    }