com.liferay.portlet.wiki.action.CompareVersionsAction.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.portlet.wiki.action.CompareVersionsAction.java

Source

/**
 * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package com.liferay.portlet.wiki.action;

import com.liferay.portal.kernel.io.unsync.UnsyncStringReader;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.util.DiffResult;
import com.liferay.portal.kernel.util.DiffUtil;
import com.liferay.portal.kernel.util.HtmlUtil;
import com.liferay.portal.kernel.util.HttpUtil;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.struts.PortletAction;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.portal.util.WebKeys;
import com.liferay.portlet.wiki.NoSuchPageException;
import com.liferay.portlet.wiki.model.WikiNode;
import com.liferay.portlet.wiki.model.WikiPage;
import com.liferay.portlet.wiki.service.WikiPageServiceUtil;
import com.liferay.portlet.wiki.util.WikiUtil;

import java.util.List;

import javax.portlet.PortletConfig;
import javax.portlet.PortletURL;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

/**
 * @author Bruno Farache
 * @author Julio Camarero
 */
public class CompareVersionsAction extends PortletAction {

    @Override
    public ActionForward render(ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
            RenderRequest renderRequest, RenderResponse renderResponse) throws Exception {

        try {
            ActionUtil.getNode(renderRequest);
            ActionUtil.getPage(renderRequest);

            compareVersions(renderRequest, renderResponse);
        } catch (Exception e) {
            if (e instanceof NoSuchPageException) {

                SessionErrors.add(renderRequest, e.getClass().getName());

                return mapping.findForward("portlet.wiki.error");
            } else {
                throw e;
            }
        }

        return mapping.findForward("portlet.wiki.compare_versions");
    }

    protected void compareVersions(RenderRequest renderRequest, RenderResponse renderResponse) throws Exception {

        ThemeDisplay themeDisplay = (ThemeDisplay) renderRequest.getAttribute(WebKeys.THEME_DISPLAY);

        long nodeId = ParamUtil.getLong(renderRequest, "nodeId");

        String title = ParamUtil.getString(renderRequest, "title");

        double sourceVersion = ParamUtil.getDouble(renderRequest, "sourceVersion");
        double targetVersion = ParamUtil.getDouble(renderRequest, "targetVersion");
        String type = ParamUtil.getString(renderRequest, "type", "escape");

        WikiPage sourcePage = WikiPageServiceUtil.getPage(nodeId, title, sourceVersion);
        WikiPage targetPage = WikiPageServiceUtil.getPage(nodeId, title, targetVersion);

        if (type.equals("html")) {
            WikiNode sourceNode = sourcePage.getNode();

            PortletURL viewPageURL = renderResponse.createRenderURL();

            viewPageURL.setParameter("struts_action", "/wiki/view");
            viewPageURL.setParameter("nodeName", sourceNode.getName());

            PortletURL editPageURL = renderResponse.createRenderURL();

            editPageURL.setParameter("struts_action", "/wiki/edit_page");
            editPageURL.setParameter("nodeId", String.valueOf(nodeId));
            editPageURL.setParameter("title", title);

            String attachmentURLPrefix = themeDisplay.getPathMain() + "/wiki/get_page_attachment?" + "p_l_id="
                    + themeDisplay.getPlid() + "&nodeId=" + nodeId + "&title=" + HttpUtil.encodeURL(title)
                    + "&fileName=";

            String htmlDiffResult = WikiUtil.diffHtml(sourcePage, targetPage, viewPageURL, editPageURL,
                    attachmentURLPrefix);

            renderRequest.setAttribute(WebKeys.DIFF_HTML_RESULTS, htmlDiffResult);
        } else {
            String sourceContent = sourcePage.getContent();
            String targetContent = targetPage.getContent();

            sourceContent = WikiUtil.processContent(sourceContent);
            targetContent = WikiUtil.processContent(targetContent);

            if (type.equals("escape")) {
                sourceContent = HtmlUtil.escape(sourceContent);
                targetContent = HtmlUtil.escape(targetContent);
            } else if (type.equals("strip")) {
                sourceContent = HtmlUtil.extractText(sourceContent);
                targetContent = HtmlUtil.extractText(targetContent);
            }

            List<DiffResult>[] diffResults = DiffUtil.diff(new UnsyncStringReader(sourceContent),
                    new UnsyncStringReader(targetContent));

            renderRequest.setAttribute(WebKeys.DIFF_RESULTS, diffResults);
        }

        renderRequest.setAttribute(WebKeys.WIKI_NODE_ID, nodeId);
        renderRequest.setAttribute(WebKeys.TITLE, title);
        renderRequest.setAttribute(WebKeys.SOURCE_VERSION, sourceVersion);
        renderRequest.setAttribute(WebKeys.TARGET_VERSION, targetVersion);
    }

}