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.PortletDataContext;
024    import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil;
025    import com.liferay.portal.kernel.repository.model.FileEntry;
026    import com.liferay.portal.kernel.repository.model.Folder;
027    import com.liferay.portal.kernel.util.GetterUtil;
028    import com.liferay.portal.kernel.util.MapUtil;
029    import com.liferay.portal.kernel.util.StringPool;
030    import com.liferay.portal.kernel.xml.Element;
031    import com.liferay.portal.model.RepositoryEntry;
032    import com.liferay.portlet.documentlibrary.model.DLFileEntry;
033    import com.liferay.portlet.documentlibrary.model.DLFileEntryType;
034    import com.liferay.portlet.documentlibrary.model.DLFileRank;
035    import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
036    import com.liferay.portlet.documentlibrary.model.DLFolder;
037    import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
038    import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
039    import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;
040    import com.liferay.portlet.documentlibrary.service.persistence.DLFileEntryActionableDynamicQuery;
041    import com.liferay.portlet.documentlibrary.service.persistence.DLFolderActionableDynamicQuery;
042    
043    import java.util.ArrayList;
044    import java.util.List;
045    import java.util.Map;
046    
047    import javax.portlet.PortletPreferences;
048    
049    /**
050     * @author Raymond Augé
051     */
052    public class DLDisplayPortletDataHandler extends DLPortletDataHandler {
053    
054            public DLDisplayPortletDataHandler() {
055                    setAlwaysExportable(false);
056            }
057    
058            @Override
059            protected PortletPreferences doDeleteData(
060                            PortletDataContext portletDataContext, String portletId,
061                            PortletPreferences portletPreferences)
062                    throws Exception {
063    
064                    if (portletPreferences == null) {
065                            return portletPreferences;
066                    }
067    
068                    portletPreferences.setValue("enable-comment-ratings", StringPool.BLANK);
069                    portletPreferences.setValue("fileEntriesPerPage", StringPool.BLANK);
070                    portletPreferences.setValue("fileEntryColumns", StringPool.BLANK);
071                    portletPreferences.setValue("folderColumns", StringPool.BLANK);
072                    portletPreferences.setValue("foldersPerPage", StringPool.BLANK);
073                    portletPreferences.setValue("rootFolderId", StringPool.BLANK);
074                    portletPreferences.setValue("showFoldersSearch", StringPool.BLANK);
075                    portletPreferences.setValue("showSubfolders", StringPool.BLANK);
076    
077                    return portletPreferences;
078            }
079    
080            @Override
081            protected String doExportData(
082                            final PortletDataContext portletDataContext, String portletId,
083                            PortletPreferences portletPreferences)
084                    throws Exception {
085    
086                    portletDataContext.addPermissions(
087                            "com.liferay.portlet.documentlibrary",
088                            portletDataContext.getScopeGroupId());
089    
090                    Element rootElement = addExportDataRootElement(portletDataContext);
091    
092                    rootElement.addAttribute(
093                            "group-id", String.valueOf(portletDataContext.getScopeGroupId()));
094    
095                    long rootFolderId = GetterUtil.getLong(
096                            portletPreferences.getValue("rootFolderId", null));
097    
098                    if (rootFolderId == DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
099                            ActionableDynamicQuery folderActionableDynamicQuery =
100                                    new DLFolderActionableDynamicQuery() {
101    
102                                    @Override
103                                    protected void addCriteria(DynamicQuery dynamicQuery) {
104                                            portletDataContext.addDateRangeCriteria(
105                                                    dynamicQuery, "modifiedDate");
106                                    }
107    
108                                    @Override
109                                    protected void performAction(Object object)
110                                            throws PortalException, SystemException {
111    
112                                            DLFolder dlFolder = (DLFolder)object;
113    
114                                            Folder folder = DLAppLocalServiceUtil.getFolder(
115                                                    dlFolder.getFolderId());
116    
117                                            StagedModelDataHandlerUtil.exportStagedModel(
118                                                    portletDataContext, folder);
119                                    }
120    
121                            };
122    
123                            folderActionableDynamicQuery.setGroupId(
124                                    portletDataContext.getScopeGroupId());
125    
126                            folderActionableDynamicQuery.performActions();
127    
128                            ActionableDynamicQuery fileEntryActionableDynamicQuery =
129                                    new DLFileEntryActionableDynamicQuery() {
130    
131                                    @Override
132                                    protected void addCriteria(DynamicQuery dynamicQuery) {
133                                            portletDataContext.addDateRangeCriteria(
134                                                    dynamicQuery, "modifiedDate");
135                                    }
136    
137                                    @Override
138                                    protected void performAction(Object object)
139                                            throws PortalException, SystemException {
140    
141                                            DLFileEntry dlFileEntry = (DLFileEntry)object;
142    
143                                            FileEntry fileEntry = DLAppLocalServiceUtil.getFileEntry(
144                                                    dlFileEntry.getFileEntryId());
145    
146                                            StagedModelDataHandlerUtil.exportStagedModel(
147                                                    portletDataContext, fileEntry);
148                                    }
149    
150                            };
151    
152                            fileEntryActionableDynamicQuery.setGroupId(
153                                    portletDataContext.getScopeGroupId());
154    
155                            fileEntryActionableDynamicQuery.performActions();
156    
157                            return getExportDataRootElementString(rootElement);
158                    }
159    
160                    Folder rootFolder = DLAppLocalServiceUtil.getFolder(rootFolderId);
161    
162                    rootElement.addAttribute(
163                            "root-folder-id", String.valueOf(rootFolder.getFolderId()));
164                    rootElement.addAttribute(
165                            "default-repository",
166                            String.valueOf(rootFolder.isDefaultRepository()));
167    
168                    final List<Long> folderIds = new ArrayList<Long>();
169    
170                    DLFolderLocalServiceUtil.getSubfolderIds(
171                            folderIds, portletDataContext.getScopeGroupId(), rootFolderId);
172    
173                    folderIds.add(rootFolderId);
174    
175                    for (long folderId : folderIds) {
176                            Folder folder = DLAppLocalServiceUtil.getFolder(folderId);
177    
178                            StagedModelDataHandlerUtil.exportStagedModel(
179                                    portletDataContext, folder);
180                    }
181    
182                    ActionableDynamicQuery fileEntryActionableDynamicQuery =
183                            new DLFileEntryActionableDynamicQuery() {
184    
185                            @Override
186                            protected void addCriteria(DynamicQuery dynamicQuery) {
187                                    portletDataContext.addDateRangeCriteria(
188                                            dynamicQuery, "modifiedDate");
189    
190                                    Property property = PropertyFactoryUtil.forName("folderId");
191    
192                                    Long[] folderIdsArray = folderIds.toArray(
193                                            new Long[folderIds.size()]);
194    
195                                    dynamicQuery.add(property.in(folderIdsArray));
196                            }
197    
198                            @Override
199                            protected void performAction(Object object)
200                                    throws PortalException, SystemException {
201    
202                                    DLFileEntry dlFileEntry = (DLFileEntry)object;
203    
204                                    FileEntry fileEntry = DLAppLocalServiceUtil.getFileEntry(
205                                            dlFileEntry.getFileEntryId());
206    
207                                    StagedModelDataHandlerUtil.exportStagedModel(
208                                            portletDataContext, fileEntry);
209                            }
210    
211                    };
212    
213                    fileEntryActionableDynamicQuery.setGroupId(
214                            portletDataContext.getScopeGroupId());
215    
216                    fileEntryActionableDynamicQuery.performActions();
217    
218                    return getExportDataRootElementString(rootElement);
219            }
220    
221            @Override
222            protected PortletPreferences doImportData(
223                            PortletDataContext portletDataContext, String portletId,
224                            PortletPreferences portletPreferences, String data)
225                    throws Exception {
226    
227                    portletDataContext.importPermissions(
228                            "com.liferay.portlet.documentlibrary",
229                            portletDataContext.getSourceGroupId(),
230                            portletDataContext.getScopeGroupId());
231    
232                    Element fileEntryTypesElement =
233                            portletDataContext.getImportDataGroupElement(DLFileEntryType.class);
234    
235                    List<Element> fileEntryTypeElements = fileEntryTypesElement.elements();
236    
237                    for (Element fileEntryTypeElement : fileEntryTypeElements) {
238                            StagedModelDataHandlerUtil.importStagedModel(
239                                    portletDataContext, fileEntryTypeElement);
240                    }
241    
242                    Element foldersElement = portletDataContext.getImportDataGroupElement(
243                            DLFolder.class);
244    
245                    List<Element> folderElements = foldersElement.elements();
246    
247                    for (Element folderElement : folderElements) {
248                            StagedModelDataHandlerUtil.importStagedModel(
249                                    portletDataContext, folderElement);
250                    }
251    
252                    Element fileEntriesElement =
253                            portletDataContext.getImportDataGroupElement(DLFileEntry.class);
254    
255                    List<Element> fileEntryElements = fileEntriesElement.elements();
256    
257                    for (Element fileEntryElement : fileEntryElements) {
258                            StagedModelDataHandlerUtil.importStagedModel(
259                                    portletDataContext, fileEntryElement);
260                    }
261    
262                    if (portletDataContext.getBooleanParameter(
263                                    DLPortletDataHandler.NAMESPACE, "shortcuts")) {
264    
265                            Element fileShortcutsElement =
266                                    portletDataContext.getImportDataGroupElement(
267                                            DLFileShortcut.class);
268    
269                            List<Element> fileShortcutElements =
270                                    fileShortcutsElement.elements();
271    
272                            for (Element fileShortcutElement : fileShortcutElements) {
273                                    StagedModelDataHandlerUtil.importStagedModel(
274                                            portletDataContext, fileShortcutElement);
275                            }
276                    }
277    
278                    if (portletDataContext.getBooleanParameter(
279                                    DLPortletDataHandler.NAMESPACE, "ranks")) {
280    
281                            Element fileRanksElement =
282                                    portletDataContext.getImportDataGroupElement(DLFileRank.class);
283    
284                            List<Element> fileRankElements = fileRanksElement.elements();
285    
286                            for (Element fileRankElement : fileRankElements) {
287                                    StagedModelDataHandlerUtil.importStagedModel(
288                                            portletDataContext, fileRankElement);
289                            }
290                    }
291    
292                    Element rootElement = portletDataContext.getImportDataRootElement();
293    
294                    long rootFolderId = GetterUtil.getLong(
295                            rootElement.attributeValue("root-folder-id"));
296                    boolean defaultRepository = GetterUtil.getBoolean(
297                            rootElement.attributeValue("default-repository"), true);
298    
299                    if (rootFolderId > 0) {
300                            Map<Long, Long> folderIds = null;
301    
302                            if (defaultRepository) {
303                                    folderIds =
304                                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
305                                                    DLFolder.class);
306                            }
307                            else {
308                                    folderIds =
309                                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
310                                                    RepositoryEntry.class);
311                            }
312    
313                            rootFolderId = MapUtil.getLong(
314                                    folderIds, rootFolderId, rootFolderId);
315    
316                            portletPreferences.setValue(
317                                    "rootFolderId", String.valueOf(rootFolderId));
318                    }
319    
320                    return portletPreferences;
321            }
322    
323    }