1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portal.servlet.filters.etag;
16  
17  import com.liferay.portal.kernel.io.unsync.UnsyncByteArrayOutputStream;
18  import com.liferay.portal.kernel.servlet.HttpHeaders;
19  import com.liferay.portal.kernel.servlet.StringServletResponse;
20  
21  import javax.servlet.http.HttpServletRequest;
22  import javax.servlet.http.HttpServletResponse;
23  
24  /**
25   * <a href="ETagUtil.java.html"><b><i>View Source</i></b></a>
26   *
27   * @author Brian Wing Shun Chan
28   * @author Shuyang Zhou
29   */
30  public class ETagUtil {
31  
32      public static boolean processETag(
33          HttpServletRequest request, HttpServletResponse response,
34          byte[] bytes) {
35  
36          return _processETag(
37              request, response, _hashCode(bytes, 0, bytes.length));
38      }
39  
40      public static boolean processETag(
41          HttpServletRequest request, HttpServletResponse response, byte[] bytes,
42          int length) {
43  
44          return _processETag(request, response, _hashCode(bytes, 0, length));
45      }
46  
47      public static boolean processETag(
48          HttpServletRequest request, HttpServletResponse response, byte[] bytes,
49          int offset, int length) {
50  
51          return _processETag(
52              request, response, _hashCode(bytes, offset, length));
53      }
54  
55      public static boolean processETag(
56          HttpServletRequest request, HttpServletResponse response, String s) {
57  
58          return _processETag(request, response, s.hashCode());
59      }
60  
61      public static boolean processETag(
62          HttpServletRequest request, HttpServletResponse response,
63          StringServletResponse stringResponse) {
64  
65          if (stringResponse.isCalledGetOutputStream()) {
66              UnsyncByteArrayOutputStream unsyncByteArrayOutputStream =
67                  stringResponse.getUnsyncByteArrayOutputStream();
68  
69              return processETag(
70                  request, response,
71                  unsyncByteArrayOutputStream.unsafeGetByteArray(),
72                  unsyncByteArrayOutputStream.size());
73          }
74          else {
75              return processETag(request, response, stringResponse.getString());
76          }
77      }
78  
79      private static int _hashCode(byte[] data, int offset, int length) {
80          int hashCode = 0;
81  
82          for (int i = 0; i < length; i++) {
83              hashCode = 31 * hashCode + data[offset++];
84          }
85  
86          return hashCode;
87      }
88  
89      private static boolean _processETag(
90          HttpServletRequest request, HttpServletResponse response,
91          int hashCode) {
92  
93          String eTag = Integer.toHexString(hashCode);
94  
95          response.setHeader(HttpHeaders.ETAG, eTag);
96  
97          String ifNoneMatch = request.getHeader(HttpHeaders.IF_NONE_MATCH);
98  
99          if (eTag.equals(ifNoneMatch)) {
100             response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
101             response.setContentLength(0);
102 
103             return true;
104         }
105         else {
106             return false;
107         }
108     }
109 
110 }