001
014
015 package com.liferay.portlet.documentlibrary.action;
016
017 import com.liferay.portal.kernel.diff.DiffResult;
018 import com.liferay.portal.kernel.diff.DiffUtil;
019 import com.liferay.portal.kernel.io.unsync.UnsyncByteArrayInputStream;
020 import com.liferay.portal.kernel.repository.model.FileVersion;
021 import com.liferay.portal.kernel.servlet.SessionErrors;
022 import com.liferay.portal.kernel.util.HtmlUtil;
023 import com.liferay.portal.kernel.util.ParamUtil;
024 import com.liferay.portal.kernel.util.StringPool;
025 import com.liferay.portal.kernel.util.StringUtil;
026 import com.liferay.portal.security.auth.PrincipalException;
027 import com.liferay.portal.struts.PortletAction;
028 import com.liferay.portal.util.WebKeys;
029 import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;
030 import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
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 actionMapping, ActionForm actionForm,
057 PortletConfig portletConfig, RenderRequest renderRequest,
058 RenderResponse renderResponse)
059 throws Exception {
060
061 try {
062 compareVersions(renderRequest);
063 }
064 catch (Exception e) {
065 if (e instanceof NoSuchFileEntryException ||
066 e instanceof PrincipalException) {
067
068 SessionErrors.add(renderRequest, e.getClass());
069
070 setForward(renderRequest, "portlet.document_library.error");
071 }
072 else {
073 throw e;
074 }
075 }
076
077 return actionMapping.findForward(
078 "portlet.document_library.compare_versions");
079 }
080
081 protected void compareVersions(RenderRequest renderRequest)
082 throws Exception {
083
084 long sourceFileVersionId = ParamUtil.getLong(
085 renderRequest, "sourceFileVersionId");
086 long targetFileVersionId = ParamUtil.getLong(
087 renderRequest, "targetFileVersionId");
088
089 FileVersion sourceFileVersion = DLAppServiceUtil.getFileVersion(
090 sourceFileVersionId);
091
092 InputStream sourceIs = sourceFileVersion.getContentStream(false);
093
094 String sourceExtension = sourceFileVersion.getExtension();
095
096 if (sourceExtension.equals("css") || sourceExtension.equals("htm") ||
097 sourceExtension.equals("html") || sourceExtension.equals("js") ||
098 sourceExtension.equals("txt") || sourceExtension.equals("xml")) {
099
100 String sourceContent = HtmlUtil.escape(StringUtil.read(sourceIs));
101
102 sourceIs = new UnsyncByteArrayInputStream(
103 sourceContent.getBytes(StringPool.UTF8));
104 }
105
106 FileVersion targetFileVersion = DLAppLocalServiceUtil.getFileVersion(
107 targetFileVersionId);
108
109 InputStream targetIs = targetFileVersion.getContentStream(false);
110
111 String targetExtension = targetFileVersion.getExtension();
112
113 if (targetExtension.equals("css") || targetExtension.equals("htm") ||
114 targetExtension.equals("html") || targetExtension.equals("js") ||
115 targetExtension.equals("txt") || targetExtension.equals("xml")) {
116
117 String targetContent = HtmlUtil.escape(StringUtil.read(targetIs));
118
119 targetIs = new UnsyncByteArrayInputStream(
120 targetContent.getBytes(StringPool.UTF8));
121 }
122
123 if (DocumentConversionUtil.isEnabled()) {
124 if (DocumentConversionUtil.isConvertBeforeCompare(
125 sourceExtension)) {
126
127 String sourceTempFileId = DLUtil.getTempFileId(
128 sourceFileVersion.getFileEntryId(),
129 sourceFileVersion.getVersion());
130
131 sourceIs = new FileInputStream(
132 DocumentConversionUtil.convert(
133 sourceTempFileId, sourceIs, sourceExtension, "txt"));
134 }
135
136 if (DocumentConversionUtil.isConvertBeforeCompare(
137 targetExtension)) {
138
139 String targetTempFileId = DLUtil.getTempFileId(
140 targetFileVersion.getFileEntryId(),
141 targetFileVersion.getVersion());
142
143 targetIs = new FileInputStream(
144 DocumentConversionUtil.convert(
145 targetTempFileId, targetIs, targetExtension, "txt"));
146 }
147 }
148
149 List<DiffResult>[] diffResults = DiffUtil.diff(
150 new InputStreamReader(sourceIs), new InputStreamReader(targetIs));
151
152 renderRequest.setAttribute(
153 WebKeys.SOURCE_NAME,
154 sourceFileVersion.getTitle() + StringPool.SPACE +
155 sourceFileVersion.getVersion());
156 renderRequest.setAttribute(
157 WebKeys.TARGET_NAME,
158 targetFileVersion.getTitle() + StringPool.SPACE +
159 targetFileVersion.getVersion());
160 renderRequest.setAttribute(WebKeys.DIFF_RESULTS, diffResults);
161 }
162
163 }