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.getCompanyGroupId(),
305                                                            portletDataContext.getScopeGroupId()
306                                                    }));
307                            }
308    
309                            @Override
310                            protected void performAction(Object object) throws PortalException {
311                                    DLFileEntryType dlFileEntryType = (DLFileEntryType)object;
312    
313                                    if (dlFileEntryType.isExportable()) {
314                                            StagedModelDataHandlerUtil.exportStagedModel(
315                                                    portletDataContext, dlFileEntryType);
316                                    }
317                            }
318    
319                    };
320            }
321    
322            protected ActionableDynamicQuery getDLFileShortcutActionableDynamicQuery(
323                            final PortletDataContext portletDataContext)
324                    throws Exception {
325    
326                    return new DLFileShortcutExportActionableDynamicQuery(
327                            portletDataContext) {
328    
329                            @Override
330                            protected void addCriteria(DynamicQuery dynamicQuery) {
331                                    super.addCriteria(dynamicQuery);
332    
333                                    Property property = PropertyFactoryUtil.forName("active");
334    
335                                    dynamicQuery.add(property.eq(Boolean.TRUE));
336                            }
337    
338                    };
339            }
340    
341            protected ActionableDynamicQuery getFileEntryActionableDynamicQuery(
342                            final PortletDataContext portletDataContext)
343                    throws Exception {
344    
345                    return new DLFileEntryExportActionableDynamicQuery(portletDataContext) {
346    
347                            @Override
348                            protected void addCriteria(DynamicQuery dynamicQuery) {
349                                    super.addCriteria(dynamicQuery);
350    
351                                    Property property = PropertyFactoryUtil.forName("repositoryId");
352    
353                                    dynamicQuery.add(
354                                            property.eq(portletDataContext.getScopeGroupId()));
355                            }
356    
357                            @Override
358                            protected StagedModelType getStagedModelType() {
359                                    return new StagedModelType(FileEntry.class);
360                            }
361    
362                            @Override
363                            protected void performAction(Object object)
364                                    throws PortalException, SystemException {
365    
366                                    DLFileEntry dlFileEntry = (DLFileEntry)object;
367    
368                                    DLFileVersion dlFileVersion = dlFileEntry.getFileVersion();
369    
370                                    if (dlFileVersion.isInTrash() ||
371                                            dlFileEntry.isInTrashContainer()) {
372    
373                                            return;
374                                    }
375    
376                                    FileEntry fileEntry = DLAppLocalServiceUtil.getFileEntry(
377                                            dlFileEntry.getFileEntryId());
378    
379                                    StagedModelDataHandlerUtil.exportStagedModel(
380                                            portletDataContext, fileEntry);
381                            }
382    
383                    };
384            }
385    
386            protected ActionableDynamicQuery getFolderActionableDynamicQuery(
387                            final PortletDataContext portletDataContext)
388                    throws Exception {
389    
390                    return new DLFolderExportActionableDynamicQuery(portletDataContext) {
391    
392                            @Override
393                            protected void addCriteria(DynamicQuery dynamicQuery) {
394                                    super.addCriteria(dynamicQuery);
395    
396                                    Property property = PropertyFactoryUtil.forName("repositoryId");
397    
398                                    dynamicQuery.add(
399                                            property.eq(portletDataContext.getScopeGroupId()));
400                            }
401    
402                            @Override
403                            protected StagedModelType getStagedModelType() {
404                                    return new StagedModelType(Folder.class);
405                            }
406    
407                            @Override
408                            protected void performAction(Object object)
409                                    throws PortalException, SystemException {
410    
411                                    DLFolder dlFolder = (DLFolder)object;
412    
413                                    if (dlFolder.isInTrash() || dlFolder.isInTrashContainer()) {
414                                            return;
415                                    }
416    
417                                    Folder folder = DLAppLocalServiceUtil.getFolder(
418                                            dlFolder.getFolderId());
419    
420                                    StagedModelDataHandlerUtil.exportStagedModel(
421                                            portletDataContext, folder);
422                            }
423    
424                    };
425            }
426    
427    }