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