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.Folder;
022    import com.liferay.portal.kernel.util.GetterUtil;
023    import com.liferay.portal.kernel.util.MapUtil;
024    import com.liferay.portal.kernel.util.StringPool;
025    import com.liferay.portal.kernel.xml.Document;
026    import com.liferay.portal.kernel.xml.Element;
027    import com.liferay.portal.kernel.xml.SAXReaderUtil;
028    import com.liferay.portal.util.PropsValues;
029    import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
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 DLDisplayPortletDataHandlerImpl extends BasePortletDataHandler {
040    
041            @Override
042            public PortletDataHandlerControl[] getExportControls() {
043                    return new PortletDataHandlerControl[] {
044                            _foldersAndDocuments, _shortcuts, _ranks, _comments, _ratings, _tags
045                    };
046            }
047    
048            @Override
049            public PortletDataHandlerControl[] getImportControls() {
050                    return new PortletDataHandlerControl[] {
051                            _foldersAndDocuments, _shortcuts, _ranks, _comments, _ratings, _tags
052                    };
053            }
054    
055            @Override
056            public boolean isPublishToLiveByDefault() {
057                    return PropsValues.DL_PUBLISH_TO_LIVE_BY_DEFAULT;
058            }
059    
060            @Override
061            protected PortletPreferences doDeleteData(
062                            PortletDataContext portletDataContext, String portletId,
063                            PortletPreferences portletPreferences)
064                    throws Exception {
065    
066                    portletPreferences.setValue("rootFolderId", StringPool.BLANK);
067                    portletPreferences.setValue("showFoldersSearch", StringPool.BLANK);
068                    portletPreferences.setValue("showSubfolders", StringPool.BLANK);
069                    portletPreferences.setValue("foldersPerPage", StringPool.BLANK);
070                    portletPreferences.setValue("folderColumns", StringPool.BLANK);
071                    portletPreferences.setValue("fileEntriesPerPage", StringPool.BLANK);
072                    portletPreferences.setValue("fileEntryColumns", StringPool.BLANK);
073                    portletPreferences.setValue("enable-comment-ratings", StringPool.BLANK);
074    
075                    return portletPreferences;
076            }
077    
078            @Override
079            protected String doExportData(
080                            PortletDataContext portletDataContext, String portletId,
081                            PortletPreferences portletPreferences)
082                    throws Exception {
083    
084                    portletDataContext.addPermissions(
085                            "com.liferay.portlet.documentlibrary",
086                            portletDataContext.getScopeGroupId());
087    
088                    long rootFolderId = GetterUtil.getLong(
089                            portletPreferences.getValue("rootFolderId", null));
090    
091                    Document document = SAXReaderUtil.createDocument();
092    
093                    Element rootElement = document.addElement(
094                            "documentlibrary-display-data");
095    
096                    Element fileEntryTypesElement = rootElement.addElement(
097                            "file-entry-types");
098                    Element foldersElement = rootElement.addElement("folders");
099                    Element fileEntriesElement = rootElement.addElement("file-entries");
100                    Element fileShortcutsElement = rootElement.addElement("file-shortcuts");
101                    Element fileRanksElement = rootElement.addElement("file-ranks");
102    
103                    if (rootFolderId == DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
104                            List<Folder> folders = FolderUtil.findByRepositoryId(
105                                    portletDataContext.getScopeGroupId());
106    
107                            for (Folder folder : folders) {
108                                    DLPortletDataHandlerImpl.exportFolder(
109                                            portletDataContext, fileEntryTypesElement, foldersElement,
110                                            fileEntriesElement, fileShortcutsElement, fileRanksElement,
111                                            folder, false);
112                            }
113                    }
114                    else {
115                            Folder folder = FolderUtil.findByPrimaryKey(rootFolderId);
116    
117                            rootElement.addAttribute(
118                                    "root-folder-id", String.valueOf(folder.getFolderId()));
119    
120                            DLPortletDataHandlerImpl.exportFolder(
121                                    portletDataContext, fileEntryTypesElement, foldersElement,
122                                    fileEntriesElement, fileShortcutsElement, fileRanksElement,
123                                    folder, true);
124                    }
125    
126                    return document.formattedString();
127            }
128    
129            @Override
130            protected PortletPreferences doImportData(
131                            PortletDataContext portletDataContext, String portletId,
132                            PortletPreferences portletPreferences, String data)
133                    throws Exception {
134    
135                    portletDataContext.importPermissions(
136                            "com.liferay.portlet.documentlibrary",
137                            portletDataContext.getSourceGroupId(),
138                            portletDataContext.getScopeGroupId());
139    
140                    Document document = SAXReaderUtil.read(data);
141    
142                    Element rootElement = document.getRootElement();
143    
144                    Element fileEntryTypesElement = rootElement.element("file-entry-types");
145    
146                    List<Element> fileEntryTypeElements = fileEntryTypesElement.elements(
147                            "file-entry-type");
148    
149                    for (Element fileEntryTypeElement : fileEntryTypeElements) {
150                            DLPortletDataHandlerImpl.importFileEntryType(
151                                    portletDataContext, fileEntryTypeElement);
152                    }
153    
154                    Element foldersElement = rootElement.element("folders");
155    
156                    List<Element> folderElements = foldersElement.elements("folder");
157    
158                    for (Element folderElement : folderElements) {
159                            DLPortletDataHandlerImpl.importFolder(
160                                    portletDataContext, folderElement);
161                    }
162    
163                    Element fileEntriesElement = rootElement.element("file-entries");
164    
165                    List<Element> fileEntryElements = fileEntriesElement.elements(
166                            "file-entry");
167    
168                    for (Element fileEntryElement : fileEntryElements) {
169                            DLPortletDataHandlerImpl.importFileEntry(
170                                    portletDataContext, fileEntryElement);
171                    }
172    
173                    if (portletDataContext.getBooleanParameter(_NAMESPACE, "shortcuts")) {
174                            List<Element> fileShortcutElements = rootElement.element(
175                                    "file-shortcuts").elements("file-shortcut");
176    
177                            for (Element fileShortcutElement : fileShortcutElements) {
178                                    DLPortletDataHandlerImpl.importFileShortcut(
179                                            portletDataContext, fileShortcutElement);
180                            }
181                    }
182    
183                    if (portletDataContext.getBooleanParameter(_NAMESPACE, "ranks")) {
184                            Element fileRanksElement = rootElement.element("file-ranks");
185    
186                            List<Element> fileRankElements = fileRanksElement.elements(
187                                    "file-rank");
188    
189                            for (Element fileRankElement : fileRankElements) {
190                                    DLPortletDataHandlerImpl.importFileRank(
191                                            portletDataContext, fileRankElement);
192                            }
193                    }
194    
195                    long rootFolderId = GetterUtil.getLong(
196                            rootElement.attributeValue("root-folder-id"));
197    
198                    if (rootFolderId > 0) {
199                            Map<Long, Long> folderPKs =
200                                    (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
201                                            Folder.class);
202    
203                            rootFolderId = MapUtil.getLong(
204                                    folderPKs, rootFolderId, rootFolderId);
205    
206                            portletPreferences.setValue(
207                                    "rootFolderId", String.valueOf(rootFolderId));
208                    }
209    
210                    return portletPreferences;
211            }
212    
213            private static final String _NAMESPACE = "document_library";
214    
215            private static PortletDataHandlerBoolean _comments =
216                    new PortletDataHandlerBoolean(_NAMESPACE, "comments");
217    
218            private static PortletDataHandlerBoolean _foldersAndDocuments =
219                    new PortletDataHandlerBoolean(
220                            _NAMESPACE, "folders-and-documents", true, true);
221    
222            private static PortletDataHandlerBoolean _ranks =
223                    new PortletDataHandlerBoolean(_NAMESPACE, "ranks");
224    
225            private static PortletDataHandlerBoolean _ratings =
226                    new PortletDataHandlerBoolean(_NAMESPACE, "ratings");
227    
228            private static PortletDataHandlerBoolean _shortcuts=
229                    new PortletDataHandlerBoolean(_NAMESPACE, "shortcuts");
230    
231            private static PortletDataHandlerBoolean _tags =
232                    new PortletDataHandlerBoolean(_NAMESPACE, "tags");
233    
234    }