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", 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    }