001
014
015 package com.liferay.portlet.documentlibrary.action;
016
017 import com.liferay.portal.kernel.io.unsync.UnsyncByteArrayInputStream;
018 import com.liferay.portal.kernel.repository.model.FileEntry;
019 import com.liferay.portal.kernel.repository.model.FileVersion;
020 import com.liferay.portal.kernel.servlet.SessionErrors;
021 import com.liferay.portal.kernel.util.DiffResult;
022 import com.liferay.portal.kernel.util.DiffUtil;
023 import com.liferay.portal.kernel.util.HtmlUtil;
024 import com.liferay.portal.kernel.util.ParamUtil;
025 import com.liferay.portal.kernel.util.StringPool;
026 import com.liferay.portal.kernel.util.StringUtil;
027 import com.liferay.portal.security.auth.PrincipalException;
028 import com.liferay.portal.struts.PortletAction;
029 import com.liferay.portal.util.WebKeys;
030 import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;
031 import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil;
032 import com.liferay.portlet.documentlibrary.util.DLUtil;
033 import com.liferay.portlet.documentlibrary.util.DocumentConversionUtil;
034
035 import java.io.FileInputStream;
036 import java.io.InputStream;
037 import java.io.InputStreamReader;
038
039 import java.util.List;
040
041 import javax.portlet.PortletConfig;
042 import javax.portlet.RenderRequest;
043 import javax.portlet.RenderResponse;
044
045 import org.apache.struts.action.ActionForm;
046 import org.apache.struts.action.ActionForward;
047 import org.apache.struts.action.ActionMapping;
048
049
052 public class CompareVersionsAction extends PortletAction {
053
054 @Override
055 public ActionForward render(
056 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
057 RenderRequest renderRequest, RenderResponse renderResponse)
058 throws Exception {
059
060 try {
061 compareVersions(renderRequest);
062 }
063 catch (Exception e) {
064 if (e instanceof NoSuchFileEntryException ||
065 e instanceof PrincipalException) {
066
067 SessionErrors.add(renderRequest, e.getClass().getName());
068
069 setForward(renderRequest, "portlet.document_library.error");
070 }
071 else {
072 throw e;
073 }
074 }
075
076 return mapping.findForward("portlet.document_library.compare_versions");
077 }
078
079 protected void compareVersions(RenderRequest renderRequest)
080 throws Exception {
081
082 long fileEntryId = ParamUtil.getLong(renderRequest, "fileEntryId");
083
084 String sourceVersion = ParamUtil.getString(
085 renderRequest, "sourceVersion");
086 String targetVersion = ParamUtil.getString(
087 renderRequest, "targetVersion");
088
089 FileEntry fileEntry = DLAppServiceUtil.getFileEntry(fileEntryId);
090
091 String extension = fileEntry.getExtension();
092
093 FileVersion sourceFileVersion = fileEntry.getFileVersion(sourceVersion);
094
095 String sourceTitle = sourceFileVersion.getTitle();
096
097 FileVersion targetFileVersion = fileEntry.getFileVersion(targetVersion);
098
099 String targetTitle = targetFileVersion.getTitle();
100
101 InputStream sourceIs = fileEntry.getContentStream(sourceVersion);
102 InputStream targetIs = fileEntry.getContentStream(targetVersion);
103
104 if (extension.equals("htm") || extension.equals("html") ||
105 extension.equals("xml")) {
106
107 String escapedSource = HtmlUtil.escape(StringUtil.read(sourceIs));
108 String escapedTarget = HtmlUtil.escape(StringUtil.read(targetIs));
109
110 sourceIs = new UnsyncByteArrayInputStream(
111 escapedSource.getBytes(StringPool.UTF8));
112 targetIs = new UnsyncByteArrayInputStream(
113 escapedTarget.getBytes(StringPool.UTF8));
114 }
115
116 if (DocumentConversionUtil.isEnabled() &&
117 DocumentConversionUtil.isConvertBeforeCompare(extension)) {
118
119 String sourceTempFileId = DLUtil.getTempFileId(
120 fileEntryId, sourceVersion);
121 String targetTempFileId = DLUtil.getTempFileId(
122 fileEntryId, targetVersion);
123
124 sourceIs = new FileInputStream(
125 DocumentConversionUtil.convert(
126 sourceTempFileId, sourceIs, extension, "txt"));
127 targetIs = new FileInputStream(
128 DocumentConversionUtil.convert(
129 targetTempFileId, targetIs, extension, "txt"));
130 }
131
132 List<DiffResult>[] diffResults = DiffUtil.diff(
133 new InputStreamReader(sourceIs), new InputStreamReader(targetIs));
134
135 renderRequest.setAttribute(
136 WebKeys.SOURCE_NAME,
137 sourceTitle + StringPool.SPACE + sourceVersion);
138 renderRequest.setAttribute(
139 WebKeys.TARGET_NAME,
140 targetTitle + StringPool.SPACE + targetVersion);
141 renderRequest.setAttribute(WebKeys.DIFF_RESULTS, diffResults);
142 }
143
144 }