001    /**
002     * Copyright (c) 2000-2012 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.lar.PortletDataContext;
018    import com.liferay.portal.kernel.repository.model.FileEntry;
019    import com.liferay.portal.kernel.repository.model.Folder;
020    import com.liferay.portal.kernel.util.GetterUtil;
021    import com.liferay.portal.kernel.util.MapUtil;
022    import com.liferay.portal.kernel.util.StringPool;
023    import com.liferay.portal.kernel.xml.Document;
024    import com.liferay.portal.kernel.xml.Element;
025    import com.liferay.portal.kernel.xml.SAXReaderUtil;
026    import com.liferay.portal.model.RepositoryEntry;
027    import com.liferay.portlet.documentlibrary.model.DLFolder;
028    import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
029    import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
030    
031    import java.util.List;
032    import java.util.Map;
033    
034    import javax.portlet.PortletPreferences;
035    
036    /**
037     * @author Raymond Augé
038     */
039    public class DLDisplayPortletDataHandler extends DLPortletDataHandler {
040    
041            public DLDisplayPortletDataHandler() {
042                    setAlwaysExportable(false);
043            }
044    
045            @Override
046            protected PortletPreferences doDeleteData(
047                            PortletDataContext portletDataContext, String portletId,
048                            PortletPreferences portletPreferences)
049                    throws Exception {
050    
051                    if (portletPreferences == null) {
052                            return portletPreferences;
053                    }
054    
055                    portletPreferences.setValue("rootFolderId", StringPool.BLANK);
056                    portletPreferences.setValue("showFoldersSearch", StringPool.BLANK);
057                    portletPreferences.setValue("showSubfolders", StringPool.BLANK);
058                    portletPreferences.setValue("foldersPerPage", StringPool.BLANK);
059                    portletPreferences.setValue("folderColumns", StringPool.BLANK);
060                    portletPreferences.setValue("fileEntriesPerPage", StringPool.BLANK);
061                    portletPreferences.setValue("fileEntryColumns", StringPool.BLANK);
062                    portletPreferences.setValue("enable-comment-ratings", StringPool.BLANK);
063    
064                    return portletPreferences;
065            }
066    
067            @Override
068            protected String doExportData(
069                            PortletDataContext portletDataContext, String portletId,
070                            PortletPreferences portletPreferences)
071                    throws Exception {
072    
073                    portletDataContext.addPermissions(
074                            "com.liferay.portlet.documentlibrary",
075                            portletDataContext.getScopeGroupId());
076    
077                    Element rootElement = addExportRootElement();
078    
079                    rootElement.addAttribute(
080                            "group-id", String.valueOf(portletDataContext.getScopeGroupId()));
081    
082                    Element fileEntryTypesElement = rootElement.addElement(
083                            "file-entry-types");
084                    Element foldersElement = rootElement.addElement("folders");
085                    Element fileEntriesElement = rootElement.addElement("file-entries");
086                    Element fileShortcutsElement = rootElement.addElement("file-shortcuts");
087                    Element fileRanksElement = rootElement.addElement("file-ranks");
088                    Element repositoriesElement = rootElement.addElement("repositories");
089                    Element repositoryEntriesElement = rootElement.addElement(
090                            "repository-entries");
091    
092                    long rootFolderId = GetterUtil.getLong(
093                            portletPreferences.getValue("rootFolderId", null));
094    
095                    if (rootFolderId == DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
096                            List<Folder> folders = FolderUtil.findByRepositoryId(
097                                    portletDataContext.getScopeGroupId());
098    
099                            for (Folder folder : folders) {
100                                    DLPortletDataHandler.exportFolder(
101                                            portletDataContext, fileEntryTypesElement, foldersElement,
102                                            fileEntriesElement, fileShortcutsElement, fileRanksElement,
103                                            repositoriesElement, repositoryEntriesElement, folder,
104                                            false);
105                            }
106    
107                            List<FileEntry> fileEntries = FileEntryUtil.findByR_F(
108                                    portletDataContext.getScopeGroupId(),
109                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
110    
111                            for (FileEntry fileEntry : fileEntries) {
112                                    DLPortletDataHandler.exportFileEntry(
113                                            portletDataContext, fileEntryTypesElement, foldersElement,
114                                            fileEntriesElement, fileRanksElement, repositoriesElement,
115                                            repositoryEntriesElement, fileEntry, true);
116                            }
117                    }
118                    else {
119                            Folder folder = DLAppLocalServiceUtil.getFolder(rootFolderId);
120    
121                            rootElement.addAttribute(
122                                    "root-folder-id", String.valueOf(folder.getFolderId()));
123                            rootElement.addAttribute(
124                                    "default-repository",
125                                    String.valueOf(folder.isDefaultRepository()));
126    
127                            DLPortletDataHandler.exportFolder(
128                                    portletDataContext, fileEntryTypesElement, foldersElement,
129                                    fileEntriesElement, fileShortcutsElement, fileRanksElement,
130                                    repositoriesElement, repositoryEntriesElement, folder, true);
131                    }
132    
133                    return rootElement.formattedString();
134            }
135    
136            @Override
137            protected PortletPreferences doImportData(
138                            PortletDataContext portletDataContext, String portletId,
139                            PortletPreferences portletPreferences, String data)
140                    throws Exception {
141    
142                    portletDataContext.importPermissions(
143                            "com.liferay.portlet.documentlibrary",
144                            portletDataContext.getSourceGroupId(),
145                            portletDataContext.getScopeGroupId());
146    
147                    Document document = SAXReaderUtil.read(data);
148    
149                    Element rootElement = document.getRootElement();
150    
151                    Element fileEntryTypesElement = rootElement.element("file-entry-types");
152    
153                    List<Element> fileEntryTypeElements = fileEntryTypesElement.elements(
154                            "file-entry-type");
155    
156                    for (Element fileEntryTypeElement : fileEntryTypeElements) {
157                            DLPortletDataHandler.importFileEntryType(
158                                    portletDataContext, fileEntryTypeElement);
159                    }
160    
161                    Element foldersElement = rootElement.element("folders");
162    
163                    List<Element> folderElements = foldersElement.elements("folder");
164    
165                    for (Element folderElement : folderElements) {
166                            DLPortletDataHandler.importFolder(
167                                    portletDataContext, folderElement);
168                    }
169    
170                    Element fileEntriesElement = rootElement.element("file-entries");
171    
172                    List<Element> fileEntryElements = fileEntriesElement.elements(
173                            "file-entry");
174    
175                    for (Element fileEntryElement : fileEntryElements) {
176                            DLPortletDataHandler.importFileEntry(
177                                    portletDataContext, fileEntryElement);
178                    }
179    
180                    if (portletDataContext.getBooleanParameter(
181                                    DLPortletDataHandler.NAMESPACE, "shortcuts")) {
182    
183                            List<Element> fileShortcutElements = rootElement.element(
184                                    "file-shortcuts").elements("file-shortcut");
185    
186                            for (Element fileShortcutElement : fileShortcutElements) {
187                                    DLPortletDataHandler.importFileShortcut(
188                                            portletDataContext, fileShortcutElement);
189                            }
190                    }
191    
192                    if (portletDataContext.getBooleanParameter(
193                                    DLPortletDataHandler.NAMESPACE, "ranks")) {
194    
195                            Element fileRanksElement = rootElement.element("file-ranks");
196    
197                            List<Element> fileRankElements = fileRanksElement.elements(
198                                    "file-rank");
199    
200                            for (Element fileRankElement : fileRankElements) {
201                                    DLPortletDataHandler.importFileRank(
202                                            portletDataContext, fileRankElement);
203                            }
204                    }
205    
206                    long rootFolderId = GetterUtil.getLong(
207                            rootElement.attributeValue("root-folder-id"));
208                    boolean defaultRepository = GetterUtil.getBoolean(
209                            rootElement.attributeValue("default-repository"), true);
210    
211                    if (rootFolderId > 0) {
212                            Map<Long, Long> folderIds = null;
213    
214                            if (defaultRepository) {
215                                    folderIds =
216                                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
217                                                    DLFolder.class);
218                            }
219                            else {
220                                    folderIds =
221                                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
222                                                    RepositoryEntry.class);
223                            }
224    
225                            rootFolderId = MapUtil.getLong(
226                                    folderIds, rootFolderId, rootFolderId);
227    
228                            portletPreferences.setValue(
229                                    "rootFolderId", String.valueOf(rootFolderId));
230                    }
231    
232                    return portletPreferences;
233            }
234    
235    }