001
014
015 package com.liferay.portlet.wiki.action;
016
017 import com.liferay.portal.kernel.io.unsync.UnsyncStringReader;
018 import com.liferay.portal.kernel.servlet.SessionErrors;
019 import com.liferay.portal.kernel.util.DiffResult;
020 import com.liferay.portal.kernel.util.DiffUtil;
021 import com.liferay.portal.kernel.util.HtmlUtil;
022 import com.liferay.portal.kernel.util.HttpUtil;
023 import com.liferay.portal.kernel.util.ParamUtil;
024 import com.liferay.portal.struts.PortletAction;
025 import com.liferay.portal.theme.ThemeDisplay;
026 import com.liferay.portal.util.WebKeys;
027 import com.liferay.portlet.wiki.NoSuchPageException;
028 import com.liferay.portlet.wiki.model.WikiNode;
029 import com.liferay.portlet.wiki.model.WikiPage;
030 import com.liferay.portlet.wiki.service.WikiPageServiceUtil;
031 import com.liferay.portlet.wiki.util.WikiUtil;
032
033 import java.util.List;
034
035 import javax.portlet.PortletConfig;
036 import javax.portlet.PortletURL;
037 import javax.portlet.RenderRequest;
038 import javax.portlet.RenderResponse;
039
040 import org.apache.struts.action.ActionForm;
041 import org.apache.struts.action.ActionForward;
042 import org.apache.struts.action.ActionMapping;
043
044
048 public class CompareVersionsAction extends PortletAction {
049
050 @Override
051 public ActionForward render(
052 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
053 RenderRequest renderRequest, RenderResponse renderResponse)
054 throws Exception {
055
056 try {
057 ActionUtil.getNode(renderRequest);
058 ActionUtil.getPage(renderRequest);
059
060 compareVersions(renderRequest, renderResponse);
061 }
062 catch (Exception e) {
063 if (e instanceof NoSuchPageException) {
064
065 SessionErrors.add(renderRequest, e.getClass().getName());
066
067 return mapping.findForward("portlet.wiki.error");
068 }
069 else {
070 throw e;
071 }
072 }
073
074 return mapping.findForward("portlet.wiki.compare_versions");
075 }
076
077 protected void compareVersions(
078 RenderRequest renderRequest, RenderResponse renderResponse)
079 throws Exception {
080
081 ThemeDisplay themeDisplay = (ThemeDisplay)renderRequest.getAttribute(
082 WebKeys.THEME_DISPLAY);
083
084 long nodeId = ParamUtil.getLong(renderRequest, "nodeId");
085
086 String title = ParamUtil.getString(renderRequest, "title");
087
088 double sourceVersion = ParamUtil.getDouble(
089 renderRequest, "sourceVersion");
090 double targetVersion = ParamUtil.getDouble(
091 renderRequest, "targetVersion");
092 String type = ParamUtil.getString(renderRequest, "type", "escape");
093
094 WikiPage sourcePage = WikiPageServiceUtil.getPage(
095 nodeId, title, sourceVersion);
096 WikiPage targetPage = WikiPageServiceUtil.getPage(
097 nodeId, title, targetVersion);
098
099 if (type.equals("html")) {
100 WikiNode sourceNode = sourcePage.getNode();
101
102 PortletURL viewPageURL = renderResponse.createRenderURL();
103
104 viewPageURL.setParameter("struts_action", "/wiki/view");
105 viewPageURL.setParameter("nodeName", sourceNode.getName());
106
107 PortletURL editPageURL = renderResponse.createRenderURL();
108
109 editPageURL.setParameter("struts_action", "/wiki/edit_page");
110 editPageURL.setParameter("nodeId", String.valueOf(nodeId));
111 editPageURL.setParameter("title", title);
112
113 String attachmentURLPrefix =
114 themeDisplay.getPathMain() + "/wiki/get_page_attachment?" +
115 "p_l_id=" + themeDisplay.getPlid() + "&nodeId=" + nodeId +
116 "&title=" + HttpUtil.encodeURL(title) + "&fileName=";
117
118 String htmlDiffResult = WikiUtil.diffHtml(
119 sourcePage, targetPage, viewPageURL, editPageURL,
120 attachmentURLPrefix);
121
122 renderRequest.setAttribute(
123 WebKeys.DIFF_HTML_RESULTS, htmlDiffResult);
124 }
125 else {
126 String sourceContent = sourcePage.getContent();
127 String targetContent = targetPage.getContent();
128
129 sourceContent = WikiUtil.processContent(sourceContent);
130 targetContent = WikiUtil.processContent(targetContent);
131
132 if (type.equals("escape")) {
133 sourceContent = HtmlUtil.escape(sourceContent);
134 targetContent = HtmlUtil.escape(targetContent);
135 }
136 else if (type.equals("strip")) {
137 sourceContent = HtmlUtil.extractText(sourceContent);
138 targetContent = HtmlUtil.extractText(targetContent);
139 }
140
141 List<DiffResult>[] diffResults = DiffUtil.diff(
142 new UnsyncStringReader(sourceContent),
143 new UnsyncStringReader(targetContent));
144
145 renderRequest.setAttribute(WebKeys.DIFF_RESULTS, diffResults);
146 }
147
148 renderRequest.setAttribute(WebKeys.WIKI_NODE_ID, nodeId);
149 renderRequest.setAttribute(WebKeys.TITLE, title);
150 renderRequest.setAttribute(WebKeys.SOURCE_VERSION, sourceVersion);
151 renderRequest.setAttribute(WebKeys.TARGET_VERSION, targetVersion);
152 }
153
154 }