hessianhandleencoder.java

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

JAVA
247
字号
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the *   Free SoftwareFoundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package com.caucho.ejb.hessian;import com.caucho.config.ConfigException;import com.caucho.ejb.AbstractServer;import com.caucho.ejb.EJBExceptionWrapper;import com.caucho.ejb.protocol.AbstractHandle;import com.caucho.ejb.protocol.AbstractHomeHandle;import com.caucho.ejb.protocol.HandleEncoder;import com.caucho.util.CharBuffer;import javax.ejb.EJBException;import java.lang.reflect.Field;/** * Encodes and decodes handles. */public class HessianHandleEncoder extends HandleEncoder {  private static char []_serverEncode64;  private static int []_serverHash64;  private static char []_serverEncodeH2;  private Class _primaryKeyClass;  private Field []_fields;  private int []_fieldTypes;  public HessianHandleEncoder(AbstractServer server, String serverId,                             Class primaryKeyClass)    throws ConfigException  {    super(serverId);        _primaryKeyClass = primaryKeyClass;    if (_primaryKeyClass == null ||        _primaryKeyClass.isPrimitive() ||        _primaryKeyClass.getName().startsWith("java.lang."))      return;    _fields = _primaryKeyClass.getFields();    _fieldTypes = new int[_fields.length];    for (int i = 0; i < _fields.length; i++)      _fields[i].setAccessible(true);    setServer(server);  }    /**   * Creates a home handle given the server id.   */  public AbstractHomeHandle createHomeHandle()  {    try {      return new HessianHomeHandle(getServer().getEJBHome(), getServerId());    } catch (Throwable e) {      return new HessianHomeHandle(getServerId());    }  }  /**   * Creates a handle given the server id and the object id.   */  public AbstractHandle createHandle(String objectId)  {    HessianHandle handle = new HessianHandle(getURL(objectId), objectId);    return handle;  }  /**   * Creates a random string key which hashes to this server.   */  public String createRandomStringKey()  {    String originalKey = super.createRandomStringKey();    int srun = 0;    int tail = calculateHash(originalKey) * 65521;    CharBuffer cb = CharBuffer.allocate();    cb.append(originalKey);    int d1 = (64 + srun - tail) & 0x3f;    cb.append(_serverEncode64[d1]);    return cb.close();  }  /**   * Returns the hash of a string for load-balancing.   */  private int calculateHash(String key)  {    int hash = 137;    int len = key.length();    for (int i = 0; i < len; i++) {      char ch = key.charAt(i);      hash = 65521 * hash + _serverHash64[ch & 0xff];    }    return hash;  }  /**   * Converts a string object id to the correct key.   */  public Object objectIdToKey(Object objectKey)  {    String objectId = (String) objectKey;    if (_primaryKeyClass == null)      return objectId;    else if (_primaryKeyClass.equals(String.class))      return objectId;    else if (_primaryKeyClass.equals(Integer.class) ||             _primaryKeyClass.equals(int.class))      return new Integer(objectId);    else if (_primaryKeyClass.equals(Long.class) ||             _primaryKeyClass.equals(long.class))      return new Long(objectId);    else if (_primaryKeyClass.equals(Float.class) ||             _primaryKeyClass.equals(float.class))      return new Float(objectId);    else if (_primaryKeyClass.equals(Double.class) ||             _primaryKeyClass.equals(double.class))      return new Double(objectId);    else if (_fields != null) {      Object obj;      try {        obj = _primaryKeyClass.newInstance();        int length = objectId.length();        int j = 0;                CharBuffer cb = new CharBuffer();        for (int i = 0; i < _fields.length; i++) {          cb.clear();          for (; j < length && objectId.charAt(j) != ','; j++)            cb.append(objectId.charAt(j));          j++;          String field = cb.toString();          Class fieldClass = _fields[i].getType();                  if (fieldClass.equals(String.class))            _fields[i].set(obj, field);          else if (fieldClass.equals(int.class))            _fields[i].setInt(obj, Integer.parseInt(field));          else if (fieldClass.equals(Integer.class))            _fields[i].set(obj, new Integer(field));          else if (fieldClass.equals(long.class))            _fields[i].setLong(obj, Long.parseLong(field));          else if (fieldClass.equals(Long.class))            _fields[i].set(obj, new Long(field));          else if (fieldClass.equals(float.class))            _fields[i].setFloat(obj, (float) Double.parseDouble(field));          else if (fieldClass.equals(Float.class))            _fields[i].set(obj, new Float(field));          else if (fieldClass.equals(double.class))            _fields[i].setDouble(obj, Double.parseDouble(field));          else if (fieldClass.equals(Double.class))            _fields[i].set(obj, new Double(field));          else            throw new RuntimeException();        }        j++;      } catch (Exception e) {        throw EJBExceptionWrapper.create(e);      }            return obj;    }    else      throw new EJBException("bad primary key class");  }  /**   * Initialize the server encoding hash.   */  static {    _serverEncode64 = new char[64];    for (int i = 0; i < 26; i++) {      _serverEncode64[i] = (char) ('a' + i);      _serverEncode64[i + 26] = (char) ('A' + i);    }    for (int i = 0; i < 10; i++)      _serverEncode64[i + 52] = (char) ('0' + i);    _serverEncode64[62] = '-';    _serverEncode64[63] = '_';        _serverHash64 = new int[256];        for (int i = 0; i < 26; i++) {      _serverHash64['a' + i] = i;      _serverHash64['A' + i] = i + 26;    }    for (int i = 0; i < 10; i++)      _serverHash64['0' + i] = 52 + i;    _serverHash64['-'] = 62;    _serverHash64['_'] = 63;    int j = 64;    for (int i = 0; i < 256; i++) {      if (_serverHash64[i] == 0)        _serverHash64[i] = j++;    }        _serverEncodeH2 = new char[64];    j = 0;    for (int i = 0; i < 64; i++) {      _serverEncodeH2[j] = _serverEncode64[i];      j = (j + 49) % 64;    }  }}

⌨️ 快捷键说明

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