001
014
015 package com.liferay.portal.servlet.filters.etag;
016
017 import com.liferay.portal.kernel.servlet.HttpHeaders;
018 import com.liferay.portal.kernel.util.StringPool;
019 import com.liferay.portal.kernel.util.StringUtil;
020
021 import java.nio.ByteBuffer;
022
023 import javax.servlet.http.HttpServletRequest;
024 import javax.servlet.http.HttpServletResponse;
025
026
030 public class ETagUtil {
031
032 public static boolean processETag(
033 HttpServletRequest request, HttpServletResponse response,
034 byte[] bytes) {
035
036 return _processETag(
037 request, response, _hashCode(bytes, 0, bytes.length));
038 }
039
040 public static boolean processETag(
041 HttpServletRequest request, HttpServletResponse response, byte[] bytes,
042 int length) {
043
044 return _processETag(request, response, _hashCode(bytes, 0, length));
045 }
046
047 public static boolean processETag(
048 HttpServletRequest request, HttpServletResponse response, byte[] bytes,
049 int offset, int length) {
050
051 return _processETag(
052 request, response, _hashCode(bytes, offset, length));
053 }
054
055 public static boolean processETag(
056 HttpServletRequest request, HttpServletResponse response,
057 ByteBuffer byteBuffer) {
058
059 return processETag(
060 request, response, byteBuffer.array(), byteBuffer.position(),
061 byteBuffer.limit());
062 }
063
064 public static boolean processETag(
065 HttpServletRequest request, HttpServletResponse response, String s) {
066
067 return _processETag(request, response, s.hashCode());
068 }
069
070 private static int _hashCode(byte[] data, int offset, int length) {
071 int hashCode = 0;
072
073 for (int i = 0; i < length; i++) {
074 hashCode = 31 * hashCode + data[offset++];
075 }
076
077 return hashCode;
078 }
079
080 private static boolean _processETag(
081 HttpServletRequest request, HttpServletResponse response,
082 int hashCode) {
083
084 String eTag = StringPool.QUOTE.concat(
085 StringUtil.toHexString(hashCode)).concat(StringPool.QUOTE);
086
087 response.setHeader(HttpHeaders.ETAG, eTag);
088
089 String ifNoneMatch = request.getHeader(HttpHeaders.IF_NONE_MATCH);
090
091 if (eTag.equals(ifNoneMatch)) {
092 response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
093 response.setContentLength(0);
094
095 return true;
096 }
097 else {
098 return false;
099 }
100 }
101
102 }