001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
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.ExportImportThreadLocal;
020    import com.liferay.portal.kernel.lar.PortletDataContext;
021    import com.liferay.portal.kernel.lar.PortletDataException;
022    import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
023    import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
024    import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil;
025    import com.liferay.portal.kernel.lar.StagedModelType;
026    import com.liferay.portal.kernel.log.Log;
027    import com.liferay.portal.kernel.log.LogFactoryUtil;
028    import com.liferay.portal.kernel.util.StringUtil;
029    import com.liferay.portal.kernel.xml.Element;
030    import com.liferay.portal.model.Group;
031    import com.liferay.portal.service.GroupLocalServiceUtil;
032    import com.liferay.portlet.wiki.model.WikiNode;
033    import com.liferay.portlet.wiki.model.WikiPage;
034    import com.liferay.portlet.wiki.service.WikiNodeLocalServiceUtil;
035    import com.liferay.portlet.wiki.service.permission.WikiPermission;
036    import com.liferay.portlet.wiki.service.persistence.WikiNodeExportActionableDynamicQuery;
037    import com.liferay.portlet.wiki.service.persistence.WikiPageExportActionableDynamicQuery;
038    import com.liferay.portlet.wiki.util.WikiCacheThreadLocal;
039    import com.liferay.portlet.wiki.util.WikiCacheUtil;
040    
041    import java.util.List;
042    import java.util.Map;
043    
044    import javax.portlet.PortletPreferences;
045    
046    /**
047     * @author Bruno Farache
048     * @author Jorge Ferrer
049     * @author Marcellus Tavares
050     * @author Juan Fern??ndez
051     * @author Zsolt Berentey
052     * @author Mate Thurzo
053     */
054    public class WikiPortletDataHandler extends BasePortletDataHandler {
055    
056            public static final String NAMESPACE = "wiki";
057    
058            public WikiPortletDataHandler() {
059                    setDataPortletPreferences("hiddenNodes, visibleNodes");
060                    setDeletionSystemEventStagedModelTypes(
061                            new StagedModelType(WikiNode.class),
062                            new StagedModelType(WikiPage.class));
063                    setExportControls(
064                            new PortletDataHandlerBoolean(
065                                    NAMESPACE, "wiki-pages", true, false,
066                                    new PortletDataHandlerControl[] {
067                                            new PortletDataHandlerBoolean(
068                                                    NAMESPACE, "referenced-content")
069                                    },
070                                    WikiPage.class.getName()));
071                    setImportControls(getExportControls());
072            }
073    
074            @Override
075            public PortletPreferences importData(
076                            PortletDataContext portletDataContext, String portletId,
077                            PortletPreferences portletPreferences, String data)
078                    throws PortletDataException {
079    
080                    WikiCacheThreadLocal.setClearCache(false);
081    
082                    try {
083                            return super.importData(
084                                    portletDataContext, portletId, portletPreferences, data);
085                    }
086                    finally {
087                            WikiCacheThreadLocal.setClearCache(true);
088                    }
089            }
090    
091            @Override
092            protected PortletPreferences doDeleteData(
093                            PortletDataContext portletDataContext, String portletId,
094                            PortletPreferences portletPreferences)
095                    throws Exception {
096    
097                    if (portletDataContext.addPrimaryKey(
098                                    WikiPortletDataHandler.class, "deleteData")) {
099    
100                            return portletPreferences;
101                    }
102    
103                    WikiNodeLocalServiceUtil.deleteNodes(
104                            portletDataContext.getScopeGroupId());
105    
106                    return portletPreferences;
107            }
108    
109            @Override
110            protected String doExportData(
111                            final PortletDataContext portletDataContext, String portletId,
112                            PortletPreferences portletPreferences)
113                    throws Exception {
114    
115                    Element rootElement = addExportDataRootElement(portletDataContext);
116    
117                    if (!portletDataContext.getBooleanParameter(NAMESPACE, "wiki-pages")) {
118                            return getExportDataRootElementString(rootElement);
119                    }
120    
121                    portletDataContext.addPortletPermissions(WikiPermission.RESOURCE_NAME);
122    
123                    rootElement.addAttribute(
124                            "group-id", String.valueOf(portletDataContext.getScopeGroupId()));
125    
126                    ActionableDynamicQuery nodeActionableDynamicQuery =
127                            new WikiNodeExportActionableDynamicQuery(portletDataContext);
128    
129                    nodeActionableDynamicQuery.performActions();
130    
131                    ActionableDynamicQuery pageActionableDynamicQuery =
132                            new WikiPageExportActionableDynamicQuery(portletDataContext);
133    
134                    pageActionableDynamicQuery.performActions();
135    
136                    return getExportDataRootElementString(rootElement);
137            }
138    
139            @Override
140            protected PortletPreferences doImportData(
141                            PortletDataContext portletDataContext, String portletId,
142                            PortletPreferences portletPreferences, String data)
143                    throws Exception {
144    
145                    if (!portletDataContext.getBooleanParameter(NAMESPACE, "wiki-pages")) {
146                            return null;
147                    }
148    
149                    portletDataContext.importPortletPermissions(
150                            WikiPermission.RESOURCE_NAME);
151    
152                    Element nodesElement = portletDataContext.getImportDataGroupElement(
153                            WikiNode.class);
154    
155                    List<Element> nodeElements = nodesElement.elements();
156    
157                    for (Element nodeElement : nodeElements) {
158                            StagedModelDataHandlerUtil.importStagedModel(
159                                    portletDataContext, nodeElement);
160                    }
161    
162                    Element pagesElement = portletDataContext.getImportDataGroupElement(
163                            WikiPage.class);
164    
165                    List<Element> pageElements = pagesElement.elements();
166    
167                    for (Element pageElement : pageElements) {
168                            StagedModelDataHandlerUtil.importStagedModel(
169                                    portletDataContext, pageElement);
170                    }
171    
172                    Map<Long, Long> nodeIds =
173                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
174                                    WikiNode.class);
175    
176                    for (long nodeId : nodeIds.values()) {
177                            WikiCacheUtil.clearCache(nodeId);
178                    }
179    
180                    return null;
181            }
182    
183            @Override
184            protected void doPrepareManifestSummary(
185                            PortletDataContext portletDataContext,
186                            PortletPreferences portletPreferences)
187                    throws Exception {
188    
189                    ActionableDynamicQuery nodeActionableDynamicQuery =
190                            new WikiNodeExportActionableDynamicQuery(portletDataContext);
191    
192                    nodeActionableDynamicQuery.performCount();
193    
194                    ActionableDynamicQuery pageExportActionableDynamicQuery =
195                            new WikiPageExportActionableDynamicQuery(portletDataContext);
196    
197                    pageExportActionableDynamicQuery.performCount();
198            }
199    
200            @Override
201            protected PortletPreferences doProcessExportPortletPreferences(
202                            PortletDataContext portletDataContext, String portletId,
203                            PortletPreferences portletPreferences)
204                    throws Exception {
205    
206                    Group group = GroupLocalServiceUtil.fetchGroup(
207                            portletDataContext.getGroupId());
208    
209                    String hiddenNodeNames = portletPreferences.getValue(
210                            "hiddenNodes", null);
211    
212                    for (String hiddenNodeName : StringUtil.split(hiddenNodeNames)) {
213                            exportNode(portletDataContext, portletId, group, hiddenNodeName);
214                    }
215    
216                    String visibleNodeNames = portletPreferences.getValue(
217                            "visibleNodes", null);
218    
219                    for (String visibleNodeName : StringUtil.split(visibleNodeNames)) {
220                            exportNode(portletDataContext, portletId, group, visibleNodeName);
221                    }
222    
223                    return portletPreferences;
224            }
225    
226            @Override
227            protected PortletPreferences doProcessImportPortletPreferences(
228                            PortletDataContext portletDataContext, String portletId,
229                            PortletPreferences portletPreferences)
230                    throws Exception {
231    
232                    StagedModelDataHandlerUtil.importReferenceStagedModels(
233                            portletDataContext, WikiNode.class);
234    
235                    return portletPreferences;
236            }
237    
238            protected void exportNode(
239                            PortletDataContext portletDataContext, String portletId,
240                            Group group, String nodeName)
241                    throws Exception {
242    
243                    if (ExportImportThreadLocal.isStagingInProcess() &&
244                            !group.isStagedPortlet(portletId)) {
245    
246                            return;
247                    }
248    
249                    WikiNode node = WikiNodeLocalServiceUtil.fetchNode(
250                            portletDataContext.getScopeGroupId(), nodeName);
251    
252                    if (node == null) {
253                            if (_log.isWarnEnabled()) {
254                                    _log.warn("Unable to export referenced wiki node " + nodeName);
255                            }
256    
257                            return;
258                    }
259    
260                    StagedModelDataHandlerUtil.exportReferenceStagedModel(
261                            portletDataContext, portletId, node);
262            }
263    
264            private static Log _log = LogFactoryUtil.getLog(
265                    WikiPortletDataHandler.class);
266    
267    }