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