1
22
23 package com.liferay.portlet.wiki.action;
24
25 import com.liferay.portal.kernel.servlet.SessionErrors;
26 import com.liferay.portal.kernel.util.DiffResult;
27 import com.liferay.portal.kernel.util.DiffUtil;
28 import com.liferay.portal.kernel.util.HtmlUtil;
29 import com.liferay.portal.kernel.util.ParamUtil;
30 import com.liferay.portal.kernel.util.StringPool;
31 import com.liferay.portal.struts.PortletAction;
32 import com.liferay.portal.util.WebKeys;
33 import com.liferay.portlet.wiki.NoSuchPageException;
34 import com.liferay.portlet.wiki.model.WikiPage;
35 import com.liferay.portlet.wiki.service.WikiPageServiceUtil;
36 import com.liferay.portlet.wiki.util.WikiUtil;
37
38 import java.io.StringReader;
39
40 import java.util.List;
41
42 import javax.portlet.PortletConfig;
43 import javax.portlet.RenderRequest;
44 import javax.portlet.RenderResponse;
45
46 import org.apache.struts.action.ActionForm;
47 import org.apache.struts.action.ActionForward;
48 import org.apache.struts.action.ActionMapping;
49
50
55 public class CompareVersionsAction extends PortletAction {
56
57 public ActionForward render(
58 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
59 RenderRequest renderRequest, RenderResponse renderResponse)
60 throws Exception {
61
62 try {
63 ActionUtil.getNode(renderRequest);
64 ActionUtil.getPage(renderRequest);
65
66 compareVersions(renderRequest);
67 }
68 catch (Exception e) {
69 if (e instanceof NoSuchPageException) {
70
71 SessionErrors.add(renderRequest, e.getClass().getName());
72
73 return mapping.findForward("portlet.wiki.error");
74 }
75 else {
76 throw e;
77 }
78 }
79
80 return mapping.findForward("portlet.wiki.compare_versions");
81 }
82
83 protected void compareVersions(RenderRequest renderRequest)
84 throws Exception {
85
86 long nodeId = ParamUtil.getLong(renderRequest, "nodeId");
87
88 String title = ParamUtil.getString(renderRequest, "title");
89
90 double sourceVersion = ParamUtil.getDouble(
91 renderRequest, "sourceVersion");
92 double targetVersion = ParamUtil.getDouble(
93 renderRequest, "targetVersion");
94 String type = ParamUtil.getString(renderRequest, "type", "escape");
95
96 WikiPage sourcePage = WikiPageServiceUtil.getPage(
97 nodeId, title, sourceVersion);
98 WikiPage targetPage = WikiPageServiceUtil.getPage(
99 nodeId, title, targetVersion);
100
101 String sourceContent = sourcePage.getContent();
102 String targetContent = targetPage.getContent();
103
104 sourceContent = WikiUtil.processContent(sourceContent);
105 targetContent = WikiUtil.processContent(targetContent);
106
107 if (type.equals("escape")) {
108 sourceContent = HtmlUtil.escape(sourceContent);
109 targetContent = HtmlUtil.escape(targetContent);
110 }
111 else if (type.equals("strip")) {
112 sourceContent = HtmlUtil.extractText(sourceContent);
113 targetContent = HtmlUtil.extractText(targetContent);
114 }
115
116 List<DiffResult>[] diffResults = DiffUtil.diff(
117 new StringReader(sourceContent), new StringReader(targetContent));
118
119 renderRequest.setAttribute(
120 WebKeys.SOURCE_NAME, title + StringPool.SPACE + sourceVersion);
121 renderRequest.setAttribute(
122 WebKeys.TARGET_NAME, title + StringPool.SPACE + targetVersion);
123 renderRequest.setAttribute(WebKeys.DIFF_RESULTS, diffResults);
124 }
125
126 }