xidimpl.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 252 行
JAVA
252 行
/* * 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.transaction;import com.caucho.util.Alarm;import com.caucho.util.CharBuffer;import com.caucho.util.L10N;import javax.transaction.xa.Xid;/** * Transaction identifier implementation. */public class XidImpl implements Xid { private static L10N L = new L10N(XidImpl.class); public static final int GLOBAL_LENGTH = 28; private byte []_global; private byte []_local; /** * Creates a new transaction id. * * @param id the 64 bit number for the id. */ public XidImpl(long serverId, long randomId) { _global = new byte[GLOBAL_LENGTH]; _local = new byte[4]; _local[0] = 1; // the global id has the requirement of being globally unique // first 4 identify as Resin. _global[0] = 'R'; _global[1] = 'e'; _global[2] = 's'; _global[3] = 'n'; // next 8 is the crc64 of the caucho.server-id _global[4] = (byte) (serverId >> 56); _global[5] = (byte) (serverId >> 48); _global[6] = (byte) (serverId >> 40); _global[7] = (byte) (serverId >> 32); _global[8] = (byte) (serverId >> 24); _global[9] = (byte) (serverId >> 16); _global[10] = (byte) (serverId >> 8); _global[11] = (byte) (serverId); // next 8 is the current timestamp long timestamp = Alarm.getCurrentTime(); _global[12] = (byte) (timestamp >> 56); _global[13] = (byte) (timestamp >> 48); _global[14] = (byte) (timestamp >> 40); _global[15] = (byte) (timestamp >> 32); _global[16] = (byte) (timestamp >> 24); _global[17] = (byte) (timestamp >> 16); _global[18] = (byte) (timestamp >> 8); _global[19] = (byte) (timestamp); // next 8 is a 64-bit random long _global[20] = (byte) (randomId >> 56); _global[21] = (byte) (randomId >> 48); _global[22] = (byte) (randomId >> 40); _global[23] = (byte) (randomId >> 32); _global[24] = (byte) (randomId >> 24); _global[25] = (byte) (randomId >> 16); _global[26] = (byte) (randomId >> 8); _global[27] = (byte) (randomId); } XidImpl(XidImpl base, int branch) { _global = new byte[base._global.length]; _local = new byte[4]; _local[0] = (byte) (branch); System.arraycopy(base._global, 0, _global, 0, _global.length); } public XidImpl(byte []global, byte []local) { _global = new byte[global.length]; _local = new byte[local.length]; System.arraycopy(global, 0, _global, 0, global.length); System.arraycopy(local, 0, _local, 0, local.length); } XidImpl(byte []global) { _global = new byte[global.length]; _local = new byte[4]; System.arraycopy(global, 0, _global, 0, global.length); _local[0] = 1; } XidImpl(byte []global, int length) { _global = new byte[length]; _local = new byte[4]; System.arraycopy(global, 0, _global, 0, length); _local[0] = 1; } public int getFormatId() { return 1234; } public byte []getBranchQualifier() { return _local; } public byte []getGlobalTransactionId() { return _global; } /** * Clones the xid. */ public Object clone() { return new XidImpl(_global, _local); } /** * Returns hashCode. */ public int hashCode() { byte []global = _global; int hash = 37; for (int i = global.length - 1; i >= 0; i--) hash = 65521 * hash + global[i]; return hash; } /** * Returns equality. */ public boolean equals(Object o) { if (! (o instanceof Xid)) return false; Xid xid = (Xid) o; byte []global = xid.getGlobalTransactionId(); byte []local = xid.getBranchQualifier(); if (global.length != _global.length) return false; byte []selfGlobal = _global; byte []selfLocal = _local; for (int i = global.length - 1; i >= 0; i--) { if (global[i] != selfGlobal[i]) return false; } for (int i = local.length - 1; i >= 0; i--) { if (local[i] != selfLocal[i]) return false; } return true; } /** * Printable version of the transaction id. */ public String toString() { CharBuffer cb = CharBuffer.allocate(); cb.append("Xid["); byte []branch = getBranchQualifier(); addByte(cb, branch[0]); cb.append(":"); byte []global = getGlobalTransactionId(); for (int i = 24; i < 28; i++) addByte(cb, global[i]); cb.append("]"); return cb.close(); } /** * Adds hex for debug * * @param cb the character buffer for the new value * @param b the byte value */ static private void addByte(CharBuffer cb, int b) { int h = (b / 16) & 0xf; int l = b & 0xf; if (h >= 10) cb.append((char) ('a' + h - 10)); else cb.append((char) ('0' + h)); if (l >= 10) cb.append((char) ('a' + l - 10)); else cb.append((char) ('0' + l)); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?