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.DLFileVersion;
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.permission.DLPermission;
047    import com.liferay.portlet.documentlibrary.service.persistence.DLFileEntryExportActionableDynamicQuery;
048    import com.liferay.portlet.documentlibrary.service.persistence.DLFileEntryTypeExportActionableDynamicQuery;
049    import com.liferay.portlet.documentlibrary.service.persistence.DLFileShortcutExportActionableDynamicQuery;
050    import com.liferay.portlet.documentlibrary.service.persistence.DLFolderExportActionableDynamicQuery;
051    
052    import java.util.List;
053    import java.util.Map;
054    
055    import javax.portlet.PortletPreferences;
056    
057    /**
058     * @author Bruno Farache
059     * @author Raymond Aug??
060     * @author Sampsa Sohlman
061     * @author Mate Thurzo
062     * @author Zsolt Berentey
063     */
064    public class DLPortletDataHandler extends BasePortletDataHandler {
065    
066            public static final String NAMESPACE = "document_library";
067    
068            public DLPortletDataHandler() {
069                    setDataLocalized(true);
070                    setDataPortletPreferences("rootFolderId");
071                    setDeletionSystemEventStagedModelTypes(
072                            new StagedModelType(DLFileEntryType.class),
073                            new StagedModelType(DLFileRank.class),
074                            new StagedModelType(DLFileShortcut.class),
075                            new StagedModelType(FileEntry.class),
076                            new StagedModelType(Folder.class));
077                    setExportControls(
078                            new PortletDataHandlerBoolean(
079                                    NAMESPACE, "documents", true, false,
080                                    new PortletDataHandlerControl[] {
081                                            new PortletDataHandlerBoolean(
082                                                    NAMESPACE, "previews-and-thumbnails")
083                                    },
084                                    FileEntry.class.getName()),
085                            new PortletDataHandlerBoolean(
086                                    NAMESPACE, "shortcuts", true, false, null,
087                                    DLFileShortcut.class.getName()));
088                    setPublishToLiveByDefault(PropsValues.DL_PUBLISH_TO_LIVE_BY_DEFAULT);
089            }
090    
091            @Override
092            protected PortletPreferences doDeleteData(
093                            PortletDataContext portletDataContext, String portletId,
094                            PortletPreferences portletPreferences)
095                    throws Exception {
096    
097                    if (portletDataContext.addPrimaryKey(
098                                    DLPortletDataHandler.class, "deleteData")) {
099    
100                            return portletPreferences;
101                    }
102    
103                    DLAppLocalServiceUtil.deleteAll(portletDataContext.getScopeGroupId());
104    
105                    return portletPreferences;
106            }
107    
108            @Override
109            protected String doExportData(
110                            final PortletDataContext portletDataContext, String portletId,
111                            PortletPreferences portletPreferences)
112                    throws Exception {
113    
114                    portletDataContext.addPermissions(
115                            DLPermission.RESOURCE_NAME, portletDataContext.getScopeGroupId());
116    
117                    Element rootElement = addExportDataRootElement(portletDataContext);
118    
119                    rootElement.addAttribute(
120                            "group-id", String.valueOf(portletDataContext.getScopeGroupId()));
121    
122                    if (portletDataContext.getBooleanParameter(NAMESPACE, "documents")) {
123                            ActionableDynamicQuery fileEntryTypeActionableDynamicQuery =
124                                    getDLFileEntryTypeActionableDynamicQuery(portletDataContext);
125    
126                            fileEntryTypeActionableDynamicQuery.performActions();
127    
128                            ActionableDynamicQuery folderActionableDynamicQuery =
129                                    getFolderActionableDynamicQuery(portletDataContext);
130    
131                            folderActionableDynamicQuery.performActions();
132    
133                            ActionableDynamicQuery fileEntryActionableDynamicQuery =
134                                    getFileEntryActionableDynamicQuery(portletDataContext);
135    
136                            fileEntryActionableDynamicQuery.performActions();
137                    }
138    
139                    if (portletDataContext.getBooleanParameter(NAMESPACE, "shortcuts")) {
140                            ActionableDynamicQuery fileShortcutActionableDynamicQuery =
141                                    getDLFileShortcutActionableDynamicQuery(portletDataContext);
142    
143                            fileShortcutActionableDynamicQuery.performActions();
144                    }
145    
146                    return getExportDataRootElementString(rootElement);
147            }
148    
149            @Override
150            protected PortletPreferences doImportData(
151                            PortletDataContext portletDataContext, String portletId,
152                            PortletPreferences portletPreferences, String data)
153                    throws Exception {
154    
155                    portletDataContext.importPermissions(
156                            DLPermission.RESOURCE_NAME, portletDataContext.getSourceGroupId(),
157                            portletDataContext.getScopeGroupId());
158    
159                    Element fileEntryTypesElement =
160                            portletDataContext.getImportDataGroupElement(DLFileEntryType.class);
161    
162                    List<Element> fileEntryTypeElements = fileEntryTypesElement.elements();
163    
164                    for (Element fileEntryTypeElement : fileEntryTypeElements) {
165                            StagedModelDataHandlerUtil.importStagedModel(
166                                    portletDataContext, fileEntryTypeElement);
167                    }
168    
169                    if (portletDataContext.getBooleanParameter(NAMESPACE, "documents")) {
170                            Element foldersElement =
171                                    portletDataContext.getImportDataGroupElement(Folder.class);
172    
173                            List<Element> folderElements = foldersElement.elements();
174    
175                            for (Element folderElement : folderElements) {
176                                    StagedModelDataHandlerUtil.importStagedModel(
177                                            portletDataContext, folderElement);
178                            }
179    
180                            Element fileEntriesElement =
181                                    portletDataContext.getImportDataGroupElement(FileEntry.class);
182    
183                            List<Element> fileEntryElements = fileEntriesElement.elements();
184    
185                            for (Element fileEntryElement : fileEntryElements) {
186                                    StagedModelDataHandlerUtil.importStagedModel(
187                                            portletDataContext, fileEntryElement);
188                            }
189                    }
190    
191                    if (portletDataContext.getBooleanParameter(NAMESPACE, "shortcuts")) {
192                            Element fileShortcutsElement =
193                                    portletDataContext.getImportDataGroupElement(
194                                            DLFileShortcut.class);
195    
196                            List<Element> fileShortcutElements =
197                                    fileShortcutsElement.elements();
198    
199                            for (Element fileShortcutElement : fileShortcutElements) {
200                                    StagedModelDataHandlerUtil.importStagedModel(
201                                            portletDataContext, fileShortcutElement);
202                            }
203                    }
204    
205                    return portletPreferences;
206            }
207    
208            @Override
209            protected void doPrepareManifestSummary(
210                            final PortletDataContext portletDataContext,
211                            PortletPreferences portletPreferences)
212                    throws Exception {
213    
214                    ActionableDynamicQuery dlFileShortcutActionableDynamicQuery =
215                            getDLFileShortcutActionableDynamicQuery(portletDataContext);
216    
217                    dlFileShortcutActionableDynamicQuery.performCount();
218    
219                    ActionableDynamicQuery fileEntryActionableDynamicQuery =
220                            getFileEntryActionableDynamicQuery(portletDataContext);
221    
222                    fileEntryActionableDynamicQuery.performCount();
223    
224                    ActionableDynamicQuery folderActionableDynamicQuery =
225                            getFolderActionableDynamicQuery(portletDataContext);
226    
227                    folderActionableDynamicQuery.performCount();
228            }
229    
230            @Override
231            protected PortletPreferences doProcessExportPortletPreferences(
232                            PortletDataContext portletDataContext, String portletId,
233                            PortletPreferences portletPreferences, Element rootElement)
234                    throws Exception {
235    
236                    long rootFolderId = GetterUtil.getLong(
237                            portletPreferences.getValue("rootFolderId", null));
238    
239                    if (rootFolderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
240                            Folder folder = DLAppLocalServiceUtil.getFolder(rootFolderId);
241    
242                            Portlet portlet = PortletLocalServiceUtil.getPortletById(
243                                    portletDataContext.getCompanyId(), portletId);
244    
245                            portletDataContext.addReferenceElement(
246                                    portlet, rootElement, folder, Folder.class,
247                                    PortletDataContext.REFERENCE_TYPE_DEPENDENCY,
248                                    !portletDataContext.getBooleanParameter(
249                                            NAMESPACE, "documents"));
250                    }
251    
252                    return portletPreferences;
253            }
254    
255            @Override
256            protected PortletPreferences doProcessImportPortletPreferences(
257                            PortletDataContext portletDataContext, String portletId,
258                            PortletPreferences portletPreferences)
259                    throws Exception {
260    
261                    long rootFolderId = GetterUtil.getLong(
262                            portletPreferences.getValue("rootFolderId", null));
263    
264                    if (rootFolderId > 0) {
265                            String rootFolderPath = ExportImportPathUtil.getModelPath(
266                                    portletDataContext, Folder.class.getName(), rootFolderId);
267    
268                            Folder folder = (Folder)portletDataContext.getZipEntryAsObject(
269                                    rootFolderPath);
270    
271                            StagedModelDataHandlerUtil.importStagedModel(
272                                    portletDataContext, folder);
273    
274                            Map<Long, Long> folderIds =
275                                    (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
276                                            Folder.class);
277    
278                            rootFolderId = MapUtil.getLong(
279                                    folderIds, rootFolderId, rootFolderId);
280    
281                            portletPreferences.setValue(
282                                    "rootFolderId", String.valueOf(rootFolderId));
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                                    DLFileVersion dlFileVersion = dlFileEntry.getFileVersion();
368    
369                                    if (dlFileVersion.isInTrash() ||
370                                            dlFileEntry.isInTrashContainer()) {
371    
372                                            return;
373                                    }
374    
375                                    FileEntry fileEntry = DLAppLocalServiceUtil.getFileEntry(
376                                            dlFileEntry.getFileEntryId());
377    
378                                    StagedModelDataHandlerUtil.exportStagedModel(
379                                            portletDataContext, fileEntry);
380                            }
381    
382                    };
383            }
384    
385            protected ActionableDynamicQuery getFolderActionableDynamicQuery(
386                            final PortletDataContext portletDataContext)
387                    throws Exception {
388    
389                    return new DLFolderExportActionableDynamicQuery(portletDataContext) {
390    
391                            @Override
392                            protected void addCriteria(DynamicQuery dynamicQuery) {
393                                    super.addCriteria(dynamicQuery);
394    
395                                    Property property = PropertyFactoryUtil.forName("repositoryId");
396    
397                                    dynamicQuery.add(
398                                            property.eq(portletDataContext.getScopeGroupId()));
399                            }
400    
401                            @Override
402                            protected StagedModelType getStagedModelType() {
403                                    return new StagedModelType(Folder.class);
404                            }
405    
406                            @Override
407                            protected void performAction(Object object)
408                                    throws PortalException, SystemException {
409    
410                                    DLFolder dlFolder = (DLFolder)object;
411    
412                                    if (dlFolder.isInTrash() || dlFolder.isInTrashContainer()) {
413                                            return;
414                                    }
415    
416                                    Folder folder = DLAppLocalServiceUtil.getFolder(
417                                            dlFolder.getFolderId());
418    
419                                    StagedModelDataHandlerUtil.exportStagedModel(
420                                            portletDataContext, folder);
421                            }
422    
423                    };
424            }
425    
426    }