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.PortletDataContext;
018    import com.liferay.portal.kernel.log.Log;
019    import com.liferay.portal.kernel.log.LogFactoryUtil;
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.util.Validator;
024    import com.liferay.portal.kernel.xml.Document;
025    import com.liferay.portal.kernel.xml.Element;
026    import com.liferay.portal.kernel.xml.SAXReaderUtil;
027    import com.liferay.portlet.journal.lar.JournalPortletDataHandler;
028    import com.liferay.portlet.wiki.NoSuchNodeException;
029    import com.liferay.portlet.wiki.model.WikiNode;
030    import com.liferay.portlet.wiki.model.WikiPage;
031    import com.liferay.portlet.wiki.service.persistence.WikiNodeUtil;
032    import com.liferay.portlet.wiki.util.WikiCacheUtil;
033    
034    import java.util.Map;
035    
036    import javax.portlet.PortletPreferences;
037    
038    /**
039     * @author Marcellus Tavares
040     */
041    public class WikiDisplayPortletDataHandler extends WikiPortletDataHandler {
042    
043            public WikiDisplayPortletDataHandler() {
044                    setDataPortletPreferences("title", "nodeId");
045            }
046    
047            @Override
048            protected PortletPreferences doDeleteData(
049                            PortletDataContext portletDataContext, String portletId,
050                            PortletPreferences portletPreferences)
051                    throws Exception {
052    
053                    if (portletPreferences == null) {
054                            return portletPreferences;
055                    }
056    
057                    portletPreferences.setValue("title", StringPool.BLANK);
058                    portletPreferences.setValue("nodeId", StringPool.BLANK);
059    
060                    return portletPreferences;
061            }
062    
063            @Override
064            protected String doExportData(
065                            PortletDataContext portletDataContext, String portletId,
066                            PortletPreferences portletPreferences)
067                    throws Exception {
068    
069                    long nodeId = GetterUtil.getLong(
070                            portletPreferences.getValue("nodeId", StringPool.BLANK));
071    
072                    if (nodeId <= 0) {
073                            if (_log.isWarnEnabled()) {
074                                    _log.warn(
075                                            "No node id found in preferences of portlet " + portletId);
076                            }
077    
078                            return StringPool.BLANK;
079                    }
080    
081                    String title = portletPreferences.getValue("title", null);
082    
083                    if (title == null) {
084                            if (_log.isWarnEnabled()) {
085                                    _log.warn(
086                                            "No title found in preferences of portlet " + portletId);
087                            }
088    
089                            return StringPool.BLANK;
090                    }
091    
092                    WikiNode node = null;
093    
094                    try {
095                            node = WikiNodeUtil.findByPrimaryKey(nodeId);
096                    }
097                    catch (NoSuchNodeException nsne) {
098                            if (_log.isWarnEnabled()) {
099                                    _log.warn(nsne, nsne);
100                            }
101    
102                            return StringPool.BLANK;
103                    }
104    
105                    portletDataContext.addPermissions(
106                            "com.liferay.portlet.wiki", portletDataContext.getScopeGroupId());
107    
108                    Element rootElement = addExportRootElement();
109    
110                    rootElement.addAttribute(
111                            "group-id", String.valueOf(portletDataContext.getScopeGroupId()));
112    
113                    Element nodesElement = rootElement.addElement("nodes");
114                    Element pagesElement = rootElement.addElement("pages");
115    
116                    WikiPortletDataHandler.exportNode(
117                            portletDataContext, nodesElement, pagesElement, node);
118    
119                    return rootElement.formattedString();
120            }
121    
122            @Override
123            protected PortletPreferences doImportData(
124                            PortletDataContext portletDataContext, String portletId,
125                            PortletPreferences portletPreferences, String data)
126                    throws Exception {
127    
128                    portletDataContext.importPermissions(
129                            "com.liferay.portlet.wiki", portletDataContext.getSourceGroupId(),
130                            portletDataContext.getScopeGroupId());
131    
132                    if (Validator.isNull(data)) {
133                            return null;
134                    }
135    
136                    Document document = SAXReaderUtil.read(data);
137    
138                    Element rootElement = document.getRootElement();
139    
140                    Element nodesElement = rootElement.element("nodes");
141    
142                    for (Element nodeElement : nodesElement.elements("node")) {
143                            String path = nodeElement.attributeValue("path");
144    
145                            if (!portletDataContext.isPathNotProcessed(path)) {
146                                    continue;
147                            }
148    
149                            WikiNode node = (WikiNode)portletDataContext.getZipEntryAsObject(
150                                    path);
151    
152                            WikiPortletDataHandler.importNode(portletDataContext, node);
153                    }
154    
155                    Element pagesElement = rootElement.element("pages");
156    
157                    JournalPortletDataHandler.importReferencedData(
158                            portletDataContext, pagesElement);
159    
160                    for (Element pageElement : pagesElement.elements("page")) {
161                            String path = pageElement.attributeValue("path");
162    
163                            if (!portletDataContext.isPathNotProcessed(path)) {
164                                    continue;
165                            }
166    
167                            WikiPage page = (WikiPage)portletDataContext.getZipEntryAsObject(
168                                    path);
169    
170                            WikiPortletDataHandler.importPage(
171                                    portletDataContext, pageElement, page);
172                    }
173    
174                    Map<Long, Long> nodeIds =
175                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
176                                    WikiNode.class);
177    
178                    for (long nodeId : nodeIds.values()) {
179                            WikiCacheUtil.clearCache(nodeId);
180                    }
181    
182                    long nodeId = GetterUtil.getLong(
183                            portletPreferences.getValue("nodeId", StringPool.BLANK));
184    
185                    if (nodeId > 0) {
186                            nodeId = MapUtil.getLong(nodeIds, nodeId, nodeId);
187    
188                            portletPreferences.setValue("nodeId", String.valueOf(nodeId));
189                    }
190    
191                    return portletPreferences;
192            }
193    
194            private static Log _log = LogFactoryUtil.getLog(
195                    WikiDisplayPortletDataHandler.class);
196    
197    }