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.wiki.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.PortletDataException;
020    import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
021    import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
022    import com.liferay.portal.kernel.log.Log;
023    import com.liferay.portal.kernel.log.LogFactoryUtil;
024    import com.liferay.portal.kernel.util.GetterUtil;
025    import com.liferay.portal.kernel.util.MapUtil;
026    import com.liferay.portal.kernel.util.StringPool;
027    import com.liferay.portal.kernel.util.Validator;
028    import com.liferay.portal.kernel.xml.Document;
029    import com.liferay.portal.kernel.xml.Element;
030    import com.liferay.portal.kernel.xml.SAXReaderUtil;
031    import com.liferay.portlet.journal.lar.JournalPortletDataHandlerImpl;
032    import com.liferay.portlet.wiki.NoSuchNodeException;
033    import com.liferay.portlet.wiki.model.WikiNode;
034    import com.liferay.portlet.wiki.model.WikiPage;
035    import com.liferay.portlet.wiki.service.persistence.WikiNodeUtil;
036    import com.liferay.portlet.wiki.util.WikiCacheThreadLocal;
037    import com.liferay.portlet.wiki.util.WikiCacheUtil;
038    
039    import java.util.Map;
040    
041    import javax.portlet.PortletPreferences;
042    
043    /**
044     * @author Marcellus Tavares
045     */
046    public class WikiDisplayPortletDataHandlerImpl extends BasePortletDataHandler {
047    
048            @Override
049            public PortletDataHandlerControl[] getExportControls() {
050                    return new PortletDataHandlerControl[] {
051                            _nodesAndPages
052                    };
053            }
054    
055            @Override
056            public PortletDataHandlerControl[] getExportMetadataControls() {
057                    return new PortletDataHandlerControl[] {
058                            new PortletDataHandlerBoolean(
059                                    _NAMESPACE, "wiki-pages", true,
060                                    WikiPortletDataHandlerImpl.getMetadataControls()
061                            )
062                    };
063            }
064    
065            @Override
066            public PortletDataHandlerControl[] getImportControls() {
067                    return new PortletDataHandlerControl[] {
068                            _nodesAndPages
069                    };
070            }
071    
072            @Override
073            public PortletDataHandlerControl[] getImportMetadataControls() {
074                    return new PortletDataHandlerControl[] {
075                            new PortletDataHandlerBoolean(
076                                    _NAMESPACE, "wiki-pages", true,
077                                    WikiPortletDataHandlerImpl.getMetadataControls()
078                            )
079                    };
080            }
081    
082            @Override
083            public PortletPreferences importData(
084                            PortletDataContext portletDataContext, String portletId,
085                            PortletPreferences portletPreferences, String data)
086                    throws PortletDataException {
087    
088                    WikiCacheThreadLocal.setClearCache(false);
089    
090                    try {
091                            return super.importData(
092                                    portletDataContext, portletId, portletPreferences, data);
093                    }
094                    finally {
095                            WikiCacheThreadLocal.setClearCache(true);
096                    }
097            }
098    
099            @Override
100            protected PortletPreferences doDeleteData(
101                            PortletDataContext portletDataContext, String portletId,
102                            PortletPreferences portletPreferences)
103                    throws Exception {
104    
105                    portletPreferences.setValue("title", StringPool.BLANK);
106                    portletPreferences.setValue("nodeId", StringPool.BLANK);
107    
108                    return portletPreferences;
109            }
110    
111            @Override
112            protected String doExportData(
113                            PortletDataContext portletDataContext, String portletId,
114                            PortletPreferences portletPreferences)
115                    throws Exception {
116    
117                    long nodeId = GetterUtil.getLong(
118                            portletPreferences.getValue("nodeId", StringPool.BLANK));
119    
120                    if (nodeId <= 0) {
121                            if (_log.isWarnEnabled()) {
122                                    _log.warn(
123                                            "No node id found in preferences of portlet " + portletId);
124                            }
125    
126                            return StringPool.BLANK;
127                    }
128    
129                    String title = portletPreferences.getValue("title", null);
130    
131                    if (title == null) {
132                            if (_log.isWarnEnabled()) {
133                                    _log.warn(
134                                            "No title found in preferences of portlet " + portletId);
135                            }
136    
137                            return StringPool.BLANK;
138                    }
139    
140                    WikiNode node = null;
141    
142                    try {
143                            node = WikiNodeUtil.findByPrimaryKey(nodeId);
144                    }
145                    catch (NoSuchNodeException nsne) {
146                            if (_log.isWarnEnabled()) {
147                                    _log.warn(nsne, nsne);
148                            }
149    
150                            return StringPool.BLANK;
151                    }
152    
153                    portletDataContext.addPermissions(
154                            "com.liferay.portlet.wiki", portletDataContext.getScopeGroupId());
155    
156                    Document document = SAXReaderUtil.createDocument();
157    
158                    Element rootElement = document.addElement("wiki-display-data");
159    
160                    rootElement.addAttribute(
161                            "group-id", String.valueOf(portletDataContext.getScopeGroupId()));
162    
163                    Element nodesElement = rootElement.addElement("nodes");
164                    Element pagesElement = rootElement.addElement("pages");
165    
166                    WikiPortletDataHandlerImpl.exportNode(
167                            portletDataContext, nodesElement, pagesElement, node);
168    
169                    return document.formattedString();
170            }
171    
172            @Override
173            protected PortletPreferences doImportData(
174                            PortletDataContext portletDataContext, String portletId,
175                            PortletPreferences portletPreferences, String data)
176                    throws Exception {
177    
178                    portletDataContext.importPermissions(
179                            "com.liferay.portlet.wiki", portletDataContext.getSourceGroupId(),
180                            portletDataContext.getScopeGroupId());
181    
182                    if (Validator.isNull(data)) {
183                            return null;
184                    }
185    
186                    Document document = SAXReaderUtil.read(data);
187    
188                    Element rootElement = document.getRootElement();
189    
190                    Element nodesElement = rootElement.element("nodes");
191    
192                    for (Element nodeElement : nodesElement.elements("node")) {
193                            String path = nodeElement.attributeValue("path");
194    
195                            if (!portletDataContext.isPathNotProcessed(path)) {
196                                    continue;
197                            }
198    
199                            WikiNode node = (WikiNode)portletDataContext.getZipEntryAsObject(
200                                    path);
201    
202                            WikiPortletDataHandlerImpl.importNode(portletDataContext, node);
203                    }
204    
205                    Element pagesElement = rootElement.element("pages");
206    
207                    JournalPortletDataHandlerImpl.importReferencedData(
208                            portletDataContext, pagesElement);
209    
210                    for (Element pageElement : pagesElement.elements("page")) {
211                            String path = pageElement.attributeValue("path");
212    
213                            if (!portletDataContext.isPathNotProcessed(path)) {
214                                    continue;
215                            }
216    
217                            WikiPage page = (WikiPage)portletDataContext.getZipEntryAsObject(
218                                    path);
219    
220                            WikiPortletDataHandlerImpl.importPage(
221                                    portletDataContext, pageElement, page);
222                    }
223    
224                    Map<Long, Long> nodePKs =
225                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
226                                    WikiNode.class);
227    
228                    for (long nodeId : nodePKs.values()) {
229                            WikiCacheUtil.clearCache(nodeId);
230                    }
231    
232                    long nodeId = GetterUtil.getLong(
233                            portletPreferences.getValue("nodeId", StringPool.BLANK));
234    
235                    if (nodeId > 0) {
236                            nodeId = MapUtil.getLong(nodePKs, nodeId, nodeId);
237    
238                            portletPreferences.setValue("nodeId", String.valueOf(nodeId));
239                    }
240    
241                    return portletPreferences;
242            }
243    
244            private static final String _NAMESPACE = "wiki";
245    
246            private static Log _log = LogFactoryUtil.getLog(
247                    WikiDisplayPortletDataHandlerImpl.class);
248    
249            private static PortletDataHandlerBoolean _nodesAndPages =
250                    new PortletDataHandlerBoolean(
251                            _NAMESPACE, "wikis-and-pages", true, true);
252    
253    }