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.BasePortletDataHandler;
018    import com.liferay.portal.kernel.lar.PortletDataContext;
019    import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
020    import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
021    import com.liferay.portal.kernel.repository.model.FileEntry;
022    import com.liferay.portal.kernel.repository.model.Folder;
023    import com.liferay.portal.kernel.util.GetterUtil;
024    import com.liferay.portal.kernel.util.MapUtil;
025    import com.liferay.portal.kernel.util.StringPool;
026    import com.liferay.portal.kernel.xml.Document;
027    import com.liferay.portal.kernel.xml.Element;
028    import com.liferay.portal.kernel.xml.SAXReaderUtil;
029    import com.liferay.portal.model.RepositoryEntry;
030    import com.liferay.portal.util.PropsValues;
031    import com.liferay.portlet.documentlibrary.model.DLFolder;
032    import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
033    import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
034    
035    import java.util.List;
036    import java.util.Map;
037    
038    import javax.portlet.PortletPreferences;
039    
040    /**
041     * @author Raymond Augé
042     */
043    public class DLDisplayPortletDataHandlerImpl extends BasePortletDataHandler {
044    
045            @Override
046            public String[] getDataPortletPreferences() {
047                    return new String[] {"rootFolderId"};
048            }
049    
050            @Override
051            public PortletDataHandlerControl[] getExportControls() {
052                    return new PortletDataHandlerControl[] {
053                            _foldersAndDocuments, _shortcuts, _previewsAndThumbnails, _ranks
054                    };
055            }
056    
057            @Override
058            public PortletDataHandlerControl[] getExportMetadataControls() {
059                    return new PortletDataHandlerControl[] {
060                            new PortletDataHandlerBoolean(
061                                    _NAMESPACE, "folders-and-documents", true,
062                                    DLPortletDataHandlerImpl.getMetadataControls())
063                    };
064            }
065    
066            @Override
067            public PortletDataHandlerControl[] getImportControls() {
068                    return new PortletDataHandlerControl[] {
069                            _foldersAndDocuments, _shortcuts, _previewsAndThumbnails, _ranks
070                    };
071            }
072    
073            @Override
074            public PortletDataHandlerControl[] getImportMetadataControls() {
075                    return new PortletDataHandlerControl[] {
076                            new PortletDataHandlerBoolean(
077                                    _NAMESPACE, "folders-and-documents", true,
078                                    DLPortletDataHandlerImpl.getMetadataControls())
079                    };
080            }
081    
082            @Override
083            public boolean isDataLocalized() {
084                    return _DATA_LOCALIZED;
085            }
086    
087            @Override
088            public boolean isPublishToLiveByDefault() {
089                    return PropsValues.DL_PUBLISH_TO_LIVE_BY_DEFAULT;
090            }
091    
092            @Override
093            protected PortletPreferences doDeleteData(
094                            PortletDataContext portletDataContext, String portletId,
095                            PortletPreferences portletPreferences)
096                    throws Exception {
097    
098                    if (portletPreferences == null) {
099                            return portletPreferences;
100                    }
101    
102                    portletPreferences.setValue("rootFolderId", StringPool.BLANK);
103                    portletPreferences.setValue("showFoldersSearch", StringPool.BLANK);
104                    portletPreferences.setValue("showSubfolders", StringPool.BLANK);
105                    portletPreferences.setValue("foldersPerPage", StringPool.BLANK);
106                    portletPreferences.setValue("folderColumns", StringPool.BLANK);
107                    portletPreferences.setValue("fileEntriesPerPage", StringPool.BLANK);
108                    portletPreferences.setValue("fileEntryColumns", StringPool.BLANK);
109                    portletPreferences.setValue("enable-comment-ratings", StringPool.BLANK);
110    
111                    return portletPreferences;
112            }
113    
114            @Override
115            protected String doExportData(
116                            PortletDataContext portletDataContext, String portletId,
117                            PortletPreferences portletPreferences)
118                    throws Exception {
119    
120                    portletDataContext.addPermissions(
121                            "com.liferay.portlet.documentlibrary",
122                            portletDataContext.getScopeGroupId());
123    
124                    long rootFolderId = GetterUtil.getLong(
125                            portletPreferences.getValue("rootFolderId", null));
126    
127                    Document document = SAXReaderUtil.createDocument();
128    
129                    Element rootElement = document.addElement(
130                            "documentlibrary-display-data");
131    
132                    Element fileEntryTypesElement = rootElement.addElement(
133                            "file-entry-types");
134                    Element foldersElement = rootElement.addElement("folders");
135                    Element fileEntriesElement = rootElement.addElement("file-entries");
136                    Element fileShortcutsElement = rootElement.addElement("file-shortcuts");
137                    Element fileRanksElement = rootElement.addElement("file-ranks");
138                    Element repositoriesElement = rootElement.addElement("repositories");
139                    Element repositoryEntriesElement = rootElement.addElement(
140                            "repository-entries");
141    
142                    if (rootFolderId == DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
143                            List<Folder> folders = FolderUtil.findByRepositoryId(
144                                    portletDataContext.getScopeGroupId());
145    
146                            for (Folder folder : folders) {
147                                    DLPortletDataHandlerImpl.exportFolder(
148                                            portletDataContext, fileEntryTypesElement, foldersElement,
149                                            fileEntriesElement, fileShortcutsElement, fileRanksElement,
150                                            repositoriesElement, repositoryEntriesElement, folder,
151                                            false);
152                            }
153    
154                            List<FileEntry> fileEntries = FileEntryUtil.findByR_F(
155                                    portletDataContext.getScopeGroupId(),
156                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
157    
158                            for (FileEntry fileEntry : fileEntries) {
159                                    DLPortletDataHandlerImpl.exportFileEntry(
160                                            portletDataContext, fileEntryTypesElement, foldersElement,
161                                            fileEntriesElement, fileRanksElement, repositoriesElement,
162                                            repositoryEntriesElement, fileEntry, true);
163                            }
164                    }
165                    else {
166                            Folder folder = DLAppLocalServiceUtil.getFolder(rootFolderId);
167    
168                            rootElement.addAttribute(
169                                    "root-folder-id", String.valueOf(folder.getFolderId()));
170                            rootElement.addAttribute(
171                                    "default-repository",
172                                    String.valueOf(folder.isDefaultRepository()));
173    
174                            DLPortletDataHandlerImpl.exportFolder(
175                                    portletDataContext, fileEntryTypesElement, foldersElement,
176                                    fileEntriesElement, fileShortcutsElement, fileRanksElement,
177                                    repositoriesElement, repositoryEntriesElement, folder, true);
178                    }
179    
180                    return document.formattedString();
181            }
182    
183            @Override
184            protected PortletPreferences doImportData(
185                            PortletDataContext portletDataContext, String portletId,
186                            PortletPreferences portletPreferences, String data)
187                    throws Exception {
188    
189                    portletDataContext.importPermissions(
190                            "com.liferay.portlet.documentlibrary",
191                            portletDataContext.getSourceGroupId(),
192                            portletDataContext.getScopeGroupId());
193    
194                    Document document = SAXReaderUtil.read(data);
195    
196                    Element rootElement = document.getRootElement();
197    
198                    Element fileEntryTypesElement = rootElement.element("file-entry-types");
199    
200                    List<Element> fileEntryTypeElements = fileEntryTypesElement.elements(
201                            "file-entry-type");
202    
203                    for (Element fileEntryTypeElement : fileEntryTypeElements) {
204                            DLPortletDataHandlerImpl.importFileEntryType(
205                                    portletDataContext, fileEntryTypeElement);
206                    }
207    
208                    Element foldersElement = rootElement.element("folders");
209    
210                    List<Element> folderElements = foldersElement.elements("folder");
211    
212                    for (Element folderElement : folderElements) {
213                            DLPortletDataHandlerImpl.importFolder(
214                                    portletDataContext, folderElement);
215                    }
216    
217                    Element fileEntriesElement = rootElement.element("file-entries");
218    
219                    List<Element> fileEntryElements = fileEntriesElement.elements(
220                            "file-entry");
221    
222                    for (Element fileEntryElement : fileEntryElements) {
223                            DLPortletDataHandlerImpl.importFileEntry(
224                                    portletDataContext, fileEntryElement);
225                    }
226    
227                    if (portletDataContext.getBooleanParameter(_NAMESPACE, "shortcuts")) {
228                            List<Element> fileShortcutElements = rootElement.element(
229                                    "file-shortcuts").elements("file-shortcut");
230    
231                            for (Element fileShortcutElement : fileShortcutElements) {
232                                    DLPortletDataHandlerImpl.importFileShortcut(
233                                            portletDataContext, fileShortcutElement);
234                            }
235                    }
236    
237                    if (portletDataContext.getBooleanParameter(_NAMESPACE, "ranks")) {
238                            Element fileRanksElement = rootElement.element("file-ranks");
239    
240                            List<Element> fileRankElements = fileRanksElement.elements(
241                                    "file-rank");
242    
243                            for (Element fileRankElement : fileRankElements) {
244                                    DLPortletDataHandlerImpl.importFileRank(
245                                            portletDataContext, fileRankElement);
246                            }
247                    }
248    
249                    long rootFolderId = GetterUtil.getLong(
250                            rootElement.attributeValue("root-folder-id"));
251                    boolean defaultRepository = GetterUtil.getBoolean(
252                            rootElement.attributeValue("default-repository"), true);
253    
254                    if (rootFolderId > 0) {
255                            Map<Long, Long> folderIds = null;
256    
257                            if (defaultRepository) {
258                                    folderIds =
259                                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
260                                                    DLFolder.class);
261                            }
262                            else {
263                                    folderIds =
264                                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
265                                                    RepositoryEntry.class);
266                            }
267    
268                            rootFolderId = MapUtil.getLong(
269                                    folderIds, rootFolderId, rootFolderId);
270    
271                            portletPreferences.setValue(
272                                    "rootFolderId", String.valueOf(rootFolderId));
273                    }
274    
275                    return portletPreferences;
276            }
277    
278            private static final boolean _DATA_LOCALIZED = true;
279    
280            private static final String _NAMESPACE = "document_library";
281    
282            private static PortletDataHandlerBoolean _foldersAndDocuments =
283                    new PortletDataHandlerBoolean(
284                            _NAMESPACE, "folders-and-documents", true, true);
285    
286            private static PortletDataHandlerBoolean _previewsAndThumbnails =
287                    new PortletDataHandlerBoolean(_NAMESPACE, "previews-and-thumbnails");
288    
289            private static PortletDataHandlerBoolean _ranks =
290                    new PortletDataHandlerBoolean(_NAMESPACE, "ranks");
291    
292            private static PortletDataHandlerBoolean _shortcuts=
293                    new PortletDataHandlerBoolean(_NAMESPACE, "shortcuts");
294    
295    }