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