cachekey.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 361 行

JAVA
361
字号
/* * The Apache Software License, Version 1.1 * * Copyright (c) 2001-2004 Caucho Technology, Inc.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. * * 3. The end-user documentation included with the redistribution, if *    any, must include the following acknowlegement: *       "This product includes software developed by the *        Caucho Technology (http://www.caucho.com/)." *    Alternately, this acknowlegement may appear in the software itself, *    if and wherever such third-party acknowlegements normally appear. * * 4. The names "Hessian", "Resin", and "Caucho" must not be used to *    endorse or promote products derived from this software without prior *    written permission. For written permission, please contact *    info@caucho.com. * * 5. Products derived from this software may not be called "Resin" *    nor may "Resin" appear in their names without prior written *    permission of Caucho Technology. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED.  IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Sam */package com.caucho.portal.generic;import javax.portlet.PortletMode;import javax.portlet.WindowState;import java.util.Locale;/** * XXX: Cache implementation currently not complete. * * The  ConnectionContext should start building a CacheKey * as soon as it sees a window with expiration-cache != 0. * It should do this in the action stage, because each window is * seen in the action stage.  * It should add parameters for every child namespace encountered, to whatever * depth. * * Then when it gets to the render stage, it can use the CacheKey  * to see if a cached value is available. * * If not, it inserts a CachingPortletWriteStream, and fills the cache.  */public class CacheKey {  private String _namespace;  private int _namespaceValue;  private PortletMode _portletMode;  private int _portletModeValue;  private WindowState _windowState;  private int _windowStateValue;  private long _value1, _value2; // parameters  private String _contentType;  private int _contentTypeValue;  private Locale _locale;  private int _localeValue;  private boolean _isPrivate = true;  private String _sessionId;  private String _stringValue;  public void setNamespace(String namespace)  {    _stringValue = null;    _namespace = namespace;    _namespaceValue = namespace.hashCode();  }  public void setPortletMode(PortletMode portletMode)  {    _stringValue = null;    _portletMode = portletMode;    _portletModeValue = portletMode.hashCode();  }  public void setWindowState(WindowState windowState)  {    _stringValue = null;    _windowState = windowState;    _windowStateValue = windowState.hashCode();  }  private void add(String name, String value)   {    _stringValue = null;    int v = (name == null ? 65353 : name.hashCode());    _value1 += v;    _value2 += v + (value == null ? 65353 : value.hashCode());  }  public void addParameter(String name, String[] values)   {    _stringValue = null;    if (values == null || values.length == 0)      add(name, null);    else {      int i = values.length;      while (i-- > 0)        add(name, values[i]);    }  }  public void setContentType(String contentType)  {    _stringValue = null;    _contentType = contentType;    _contentTypeValue = contentType.hashCode();  }  /**   * When a cache key is created to check for a cached response the locale   * is set to the value of request.getLocale().   * A cache should first check the cache for an entry with the cacheKey    * as it is received, and then call cacheKey.setLocale(null) and try again.    *   * When a cache key is created to cache a response the locale is only set in   * the cache key if a portlet has called request.getLocale() or    * request.getLocales() or request.setLocale() method. It is set to the locale   * set by the portlet with response.setLocale(), or if the portlet does not   * call response.setLocale(), the value of request.getLocale().   */  public void setLocale(Locale locale)  {    _stringValue = null;    _locale = locale;    _localeValue = locale.hashCode();  }  public void setPrivate(boolean isPrivate)  {    _isPrivate = isPrivate;  }  public void setRequestedSessionId(String sessionId)  {    _stringValue = null;    _sessionId = sessionId;  }  public boolean isPrivate()  {    return _isPrivate;  }  public String getNamespace()  {    return _namespace;  }  public PortletMode getPortletMode()  {    return _portletMode;  }  public WindowState getWindowState()  {    return _windowState;  }  public String getContentType()  {    return _contentType;  }  public Locale getLocale()  {    return _locale;  }  /**   * Return a session id if isPrivate() is true, null if isPrivate() is false.   */   public String getRequestedSessionId()  {    return _isPrivate ? _sessionId : null;  }  /**   * Reset to a state similar to that following construction.   */  public void reset()  {    _stringValue = null;    _namespace = null;    _namespaceValue = 0;    _portletMode = null;    _portletModeValue = 0;    _windowState = null;    _windowStateValue = 0;    _value1 = 0;    _value2 = 0;    _localeValue = 0;    _locale = null;    _contentTypeValue = 0;    _contentType = null;    _isPrivate = true;    _sessionId = null;  }  public int hashCode()  {     int isPrivateValue = _isPrivate ? 31 : 33331;    int sessionIdValue = _isPrivate && _sessionId != null                          ? _sessionId.hashCode()                          : 7331;    return (int)       ((long) _namespaceValue               * _portletModeValue               * _windowStateValue               * _localeValue               * _contentTypeValue               * isPrivateValue              * sessionIdValue              * _value1               * _value2);  }  public boolean equals(Object o)  {    if (o == null || !(o instanceof CacheKey))      return false;    CacheKey other = (CacheKey) o;    return       (_namespaceValue == other._namespaceValue)      && (_portletModeValue == other._portletModeValue)      && (_windowStateValue == other._windowStateValue)       && (_value1 == other._value1)       && (_value2 == other._value2)      && (_localeValue == other._localeValue)       && (_contentTypeValue == other._contentTypeValue)      && (_isPrivate == other._isPrivate)      && (_isPrivate ? _sessionId != null : true)      && (_isPrivate ? _sessionId.equals(other._sessionId) : true);  }  static private void encode(long number, StringBuffer buf)  {    int code;    char ch = '-';    do {      code = ((int) number) & 0x3f; // 6 bits      if (code < 26)        ch =  (char) ('a' + code);      else if (code < 52)        ch =  (char) ('A' + code - 26);      else if (code < 62)        ch =  (char) ('0' + code - 52);      else if (code == 62 || code == 63)        ch =  '_';      else        ch =  'z';      number = number >> 6;    } while (number != 0);  }  /**   * Return a string that uniquely identifies this CacheKey.   * The set of characters that form the string is "A-Z a-z 0-9 _".   * That means the returned string is suitable as a file name, for example.    */  public String toString()  {    if (_stringValue != null)      return _stringValue;    StringBuffer buf = new StringBuffer();    encode(_value1, buf);    encode(_value2, buf);    int valuesIndex = buf.length();    encode(_namespaceValue, buf);    encode(_portletModeValue, buf);    encode(_windowStateValue, buf);    encode(_localeValue, buf);    encode(_contentTypeValue, buf);    if (_isPrivate)      buf.append(getRequestedSessionId());         // mix up the string so that if it is truncated by the cache     // there is less likelyhood of significant loss        int len = buf.length();    int half = len / 2;    int i = valuesIndex;    int j = len - 1;    while (i < half) {      char ch = buf.charAt(i);      buf.setCharAt(i, buf.charAt(j));      buf.setCharAt(j, ch);      i += 3;      j -= 3;    }    i = valuesIndex;    j = half > i ? half : len;    while (j < len) {      char ch = buf.charAt(i);      buf.setCharAt(i, buf.charAt(j));      buf.setCharAt(j, ch);      i += 5;      j += 5;    }    // return the string    _stringValue = buf.toString();    return _stringValue;  }} // CacheKey

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?