001    /**
002     * Copyright (c) 2000-2013 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.dao.orm.ActionableDynamicQuery;
018    import com.liferay.portal.kernel.lar.BasePortletDataHandler;
019    import com.liferay.portal.kernel.lar.PortletDataContext;
020    import com.liferay.portal.kernel.lar.PortletDataException;
021    import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
022    import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
023    import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil;
024    import com.liferay.portal.kernel.lar.StagedModelType;
025    import com.liferay.portal.kernel.util.StringUtil;
026    import com.liferay.portal.kernel.xml.Element;
027    import com.liferay.portlet.wiki.model.WikiNode;
028    import com.liferay.portlet.wiki.model.WikiPage;
029    import com.liferay.portlet.wiki.service.WikiNodeLocalServiceUtil;
030    import com.liferay.portlet.wiki.service.permission.WikiPermission;
031    import com.liferay.portlet.wiki.service.persistence.WikiNodeExportActionableDynamicQuery;
032    import com.liferay.portlet.wiki.service.persistence.WikiPageExportActionableDynamicQuery;
033    import com.liferay.portlet.wiki.util.WikiCacheThreadLocal;
034    import com.liferay.portlet.wiki.util.WikiCacheUtil;
035    
036    import java.util.List;
037    import java.util.Map;
038    
039    import javax.portlet.PortletPreferences;
040    
041    /**
042     * @author Bruno Farache
043     * @author Jorge Ferrer
044     * @author Marcellus Tavares
045     * @author Juan Fern??ndez
046     * @author Zsolt Berentey
047     * @author Mate Thurzo
048     */
049    public class WikiPortletDataHandler extends BasePortletDataHandler {
050    
051            public static final String NAMESPACE = "wiki";
052    
053            public WikiPortletDataHandler() {
054                    setDataPortletPreferences("hiddenNodes, visibleNodes");
055                    setDeletionSystemEventStagedModelTypes(
056                            new StagedModelType(WikiNode.class),
057                            new StagedModelType(WikiPage.class));
058                    setExportControls(
059                            new PortletDataHandlerBoolean(
060                                    NAMESPACE, "wiki-pages", true, false,
061                                    new PortletDataHandlerControl[] {
062                                            new PortletDataHandlerBoolean(
063                                                    NAMESPACE, "referenced-content")
064                                    },
065                                    WikiPage.class.getName()));
066                    setImportControls(getExportControls());
067            }
068    
069            @Override
070            public PortletPreferences importData(
071                            PortletDataContext portletDataContext, String portletId,
072                            PortletPreferences portletPreferences, String data)
073                    throws PortletDataException {
074    
075                    WikiCacheThreadLocal.setClearCache(false);
076    
077                    try {
078                            return super.importData(
079                                    portletDataContext, portletId, portletPreferences, data);
080                    }
081                    finally {
082                            WikiCacheThreadLocal.setClearCache(true);
083                    }
084            }
085    
086            @Override
087            protected PortletPreferences doDeleteData(
088                            PortletDataContext portletDataContext, String portletId,
089                            PortletPreferences portletPreferences)
090                    throws Exception {
091    
092                    if (portletDataContext.addPrimaryKey(
093                                    WikiPortletDataHandler.class, "deleteData")) {
094    
095                            return portletPreferences;
096                    }
097    
098                    WikiNodeLocalServiceUtil.deleteNodes(
099                            portletDataContext.getScopeGroupId());
100    
101                    return portletPreferences;
102            }
103    
104            @Override
105            protected String doExportData(
106                            final PortletDataContext portletDataContext, String portletId,
107                            PortletPreferences portletPreferences)
108                    throws Exception {
109    
110                    Element rootElement = addExportDataRootElement(portletDataContext);
111    
112                    if (!portletDataContext.getBooleanParameter(NAMESPACE, "wiki-pages")) {
113                            return getExportDataRootElementString(rootElement);
114                    }
115    
116                    portletDataContext.addPortletPermissions(WikiPermission.RESOURCE_NAME);
117    
118                    rootElement.addAttribute(
119                            "group-id", String.valueOf(portletDataContext.getScopeGroupId()));
120    
121                    ActionableDynamicQuery nodeActionableDynamicQuery =
122                            new WikiNodeExportActionableDynamicQuery(portletDataContext);
123    
124                    nodeActionableDynamicQuery.performActions();
125    
126                    ActionableDynamicQuery pageActionableDynamicQuery =
127                            new WikiPageExportActionableDynamicQuery(portletDataContext);
128    
129                    pageActionableDynamicQuery.performActions();
130    
131                    return getExportDataRootElementString(rootElement);
132            }
133    
134            @Override
135            protected PortletPreferences doImportData(
136                            PortletDataContext portletDataContext, String portletId,
137                            PortletPreferences portletPreferences, String data)
138                    throws Exception {
139    
140                    if (!portletDataContext.getBooleanParameter(NAMESPACE, "wiki-pages")) {
141                            return null;
142                    }
143    
144                    portletDataContext.importPortletPermissions(
145                            WikiPermission.RESOURCE_NAME);
146    
147                    Element nodesElement = portletDataContext.getImportDataGroupElement(
148                            WikiNode.class);
149    
150                    List<Element> nodeElements = nodesElement.elements();
151    
152                    for (Element nodeElement : nodeElements) {
153                            StagedModelDataHandlerUtil.importStagedModel(
154                                    portletDataContext, nodeElement);
155                    }
156    
157                    Element pagesElement = portletDataContext.getImportDataGroupElement(
158                            WikiPage.class);
159    
160                    List<Element> pageElements = pagesElement.elements();
161    
162                    for (Element pageElement : pageElements) {
163                            StagedModelDataHandlerUtil.importStagedModel(
164                                    portletDataContext, pageElement);
165                    }
166    
167                    Map<Long, Long> nodeIds =
168                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
169                                    WikiNode.class);
170    
171                    for (long nodeId : nodeIds.values()) {
172                            WikiCacheUtil.clearCache(nodeId);
173                    }
174    
175                    return null;
176            }
177    
178            @Override
179            protected void doPrepareManifestSummary(
180                            PortletDataContext portletDataContext,
181                            PortletPreferences portletPreferences)
182                    throws Exception {
183    
184                    ActionableDynamicQuery nodeActionableDynamicQuery =
185                            new WikiNodeExportActionableDynamicQuery(portletDataContext);
186    
187                    nodeActionableDynamicQuery.performCount();
188    
189                    ActionableDynamicQuery pageExportActionableDynamicQuery =
190                            new WikiPageExportActionableDynamicQuery(portletDataContext);
191    
192                    pageExportActionableDynamicQuery.performCount();
193            }
194    
195            @Override
196            protected PortletPreferences doProcessExportPortletPreferences(
197                            PortletDataContext portletDataContext, String portletId,
198                            PortletPreferences portletPreferences)
199                    throws Exception {
200    
201                    String hiddenNodeNames = portletPreferences.getValue(
202                            "hiddenNodes", null);
203    
204                    for (String hiddenNodeName : StringUtil.split(hiddenNodeNames)) {
205                            WikiNode wikiNode =
206                                    WikiNodeLocalServiceUtil.getNode(
207                                            portletDataContext.getScopeGroupId(), hiddenNodeName);
208    
209                            StagedModelDataHandlerUtil.exportReferenceStagedModel(
210                                    portletDataContext, portletId, wikiNode);
211                    }
212    
213                    String visibleNodeNames = portletPreferences.getValue(
214                            "visibleNodes", null);
215    
216                    for (String visibleNodeName : StringUtil.split(visibleNodeNames)) {
217                            WikiNode wikiNode =
218                                    WikiNodeLocalServiceUtil.getNode(
219                                            portletDataContext.getScopeGroupId(), visibleNodeName);
220    
221                            StagedModelDataHandlerUtil.exportReferenceStagedModel(
222                                    portletDataContext, portletId, wikiNode);
223                    }
224    
225                    return portletPreferences;
226            }
227    
228            @Override
229            protected PortletPreferences doProcessImportPortletPreferences(
230                            PortletDataContext portletDataContext, String portletId,
231                            PortletPreferences portletPreferences)
232                    throws Exception {
233    
234                    StagedModelDataHandlerUtil.importReferenceStagedModels(
235                            portletDataContext, WikiNode.class);
236    
237                    return portletPreferences;
238            }
239    
240    }