001
014
015 package com.liferay.portlet.wiki.action;
016
017 import com.liferay.portal.kernel.portlet.LiferayPortletResponse;
018 import com.liferay.portal.kernel.servlet.SessionErrors;
019 import com.liferay.portal.kernel.util.ParamUtil;
020 import com.liferay.portal.struts.PortletAction;
021 import com.liferay.portal.theme.ThemeDisplay;
022 import com.liferay.portal.util.PortalUtil;
023 import com.liferay.portal.util.WebKeys;
024 import com.liferay.portlet.wiki.NoSuchPageException;
025 import com.liferay.portlet.wiki.model.WikiNode;
026 import com.liferay.portlet.wiki.model.WikiPage;
027 import com.liferay.portlet.wiki.service.WikiPageServiceUtil;
028 import com.liferay.portlet.wiki.util.WikiUtil;
029
030 import javax.portlet.PortletConfig;
031 import javax.portlet.PortletContext;
032 import javax.portlet.PortletRequest;
033 import javax.portlet.PortletRequestDispatcher;
034 import javax.portlet.PortletResponse;
035 import javax.portlet.PortletURL;
036 import javax.portlet.RenderRequest;
037 import javax.portlet.RenderResponse;
038 import javax.portlet.ResourceRequest;
039 import javax.portlet.ResourceResponse;
040
041 import org.apache.struts.action.ActionForm;
042 import org.apache.struts.action.ActionForward;
043 import org.apache.struts.action.ActionMapping;
044
045
049 public class CompareVersionsAction extends PortletAction {
050
051 @Override
052 public ActionForward render(
053 ActionMapping actionMapping, ActionForm actionForm,
054 PortletConfig portletConfig, RenderRequest renderRequest,
055 RenderResponse renderResponse)
056 throws Exception {
057
058 try {
059 ActionUtil.getNode(renderRequest);
060 ActionUtil.getPage(renderRequest);
061
062 compareVersions(renderRequest, renderResponse);
063 }
064 catch (Exception e) {
065 if (e instanceof NoSuchPageException) {
066 SessionErrors.add(renderRequest, e.getClass());
067
068 return actionMapping.findForward("portlet.wiki.error");
069 }
070 else {
071 throw e;
072 }
073 }
074
075 return actionMapping.findForward("portlet.wiki.compare_versions");
076 }
077
078 @Override
079 public void serveResource(
080 ActionMapping actionMapping, ActionForm actionForm,
081 PortletConfig portletConfig, ResourceRequest resourceRequest,
082 ResourceResponse resourceResponse)
083 throws Exception {
084
085 double sourceVersion = ParamUtil.getDouble(
086 resourceRequest, "filterSourceVersion");
087 double targetVersion = ParamUtil.getDouble(
088 resourceRequest, "filterTargetVersion");
089
090 String htmlDiffResult = getHtmlDiffResult(
091 sourceVersion, targetVersion, resourceRequest, resourceResponse);
092
093 resourceRequest.setAttribute(WebKeys.DIFF_HTML_RESULTS, htmlDiffResult);
094
095 PortletContext portletContext = portletConfig.getPortletContext();
096
097 PortletRequestDispatcher portletRequestDispatcher =
098 portletContext.getRequestDispatcher(
099 "/html/taglib/ui/diff_version_comparator/diff_html.jsp");
100
101 portletRequestDispatcher.include(resourceRequest, resourceResponse);
102 }
103
104 protected void compareVersions(
105 RenderRequest renderRequest, RenderResponse renderResponse)
106 throws Exception {
107
108 long nodeId = ParamUtil.getLong(renderRequest, "nodeId");
109 String title = ParamUtil.getString(renderRequest, "title");
110 double sourceVersion = ParamUtil.getDouble(
111 renderRequest, "sourceVersion");
112 double targetVersion = ParamUtil.getDouble(
113 renderRequest, "targetVersion");
114
115 String htmlDiffResult = getHtmlDiffResult(
116 sourceVersion, targetVersion, renderRequest, renderResponse);
117
118 renderRequest.setAttribute(WebKeys.DIFF_HTML_RESULTS, htmlDiffResult);
119 renderRequest.setAttribute(WebKeys.SOURCE_VERSION, sourceVersion);
120 renderRequest.setAttribute(WebKeys.TARGET_VERSION, targetVersion);
121 renderRequest.setAttribute(WebKeys.TITLE, title);
122 renderRequest.setAttribute(WebKeys.WIKI_NODE_ID, nodeId);
123 }
124
125 protected String getHtmlDiffResult(
126 double sourceVersion, double targetVersion,
127 PortletRequest portletRequest, PortletResponse portletResponse)
128 throws Exception {
129
130 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
131 WebKeys.THEME_DISPLAY);
132
133 long nodeId = ParamUtil.getLong(portletRequest, "nodeId");
134 String title = ParamUtil.getString(portletRequest, "title");
135
136 WikiPage sourcePage = WikiPageServiceUtil.getPage(
137 nodeId, title, sourceVersion);
138 WikiPage targetPage = WikiPageServiceUtil.getPage(
139 nodeId, title, targetVersion);
140
141 LiferayPortletResponse liferayPortletResponse =
142 PortalUtil.getLiferayPortletResponse(portletResponse);
143
144 PortletURL viewPageURL = liferayPortletResponse.createRenderURL();
145
146 viewPageURL.setParameter("struts_action", "/wiki/view");
147
148 WikiNode sourceNode = sourcePage.getNode();
149
150 viewPageURL.setParameter("nodeName", sourceNode.getName());
151
152 PortletURL editPageURL = liferayPortletResponse.createRenderURL();
153
154 editPageURL.setParameter("struts_action", "/wiki/edit_page");
155 editPageURL.setParameter("nodeId", String.valueOf(nodeId));
156 editPageURL.setParameter("title", title);
157
158 String attachmentURLPrefix = WikiUtil.getAttachmentURLPrefix(
159 themeDisplay.getPathMain(), themeDisplay.getPlid(), nodeId, title);
160
161 return WikiUtil.diffHtml(
162 sourcePage, targetPage, viewPageURL, editPageURL,
163 attachmentURLPrefix);
164 }
165
166 }