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