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