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