01: /*
02: * @(#)RegistryKey.java 1.10 06/10/10
03: *
04: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
05: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
06: *
07: * This program is free software; you can redistribute it and/or
08: * modify it under the terms of the GNU General Public License version
09: * 2 only, as published by the Free Software Foundation.
10: *
11: * This program is distributed in the hope that it will be useful, but
12: * WITHOUT ANY WARRANTY; without even the implied warranty of
13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14: * General Public License version 2 for more details (a copy is
15: * included at /legal/license.txt).
16: *
17: * You should have received a copy of the GNU General Public License
18: * version 2 along with this work; if not, write to the Free Software
19: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20: * 02110-1301 USA
21: *
22: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
23: * Clara, CA 95054 or visit www.sun.com if you need additional
24: * information or have any questions.
25: *
26: */
27:
28: package com.sun.xlet.ixc;
29:
30: import java.rmi.Remote;
31:
32: /**
33: * Key for an object registry, held in a hashtable. This is a weak key that
34: * knows to clean up the hashtable it's in when it is collected. It also
35: * has an efficiency issue: it's equivalent to the remote object it
36: * refers to for hashing purposes. That means you can search for the
37: * referred-to object in the hashtable, without wrapping it in a
38: * RegistryKey instance.
39: * <p>
40: * It's important to note that two keys are equivalent only if the Remote
41: * object to which they refer are <i>identical</i>. Two remote objects
42: * that are != but are .equals() should <i>not</i> be treated as the same
43: * object!
44: */
45:
46: final class RegistryKey extends java.lang.ref.WeakReference {
47: private int hash;
48:
49: RegistryKey(Remote referent) {
50: super (referent);
51: hash = referent.hashCode();
52: }
53:
54: public int hashCode() {
55: return hash;
56: }
57:
58: public boolean equals(Object other) {
59: if (other == this ) {
60: return true;
61: // This isn't just an optimization. The operation of
62: // ImportRegistryImpl.unregisterStub depends on it. Once
63: // the weak ref gets cleared by the GC, the identity test is
64: // the only one that can succeed.
65: }
66: if (other instanceof Remote) {
67: return other == get();
68: } else if (other instanceof RegistryKey) {
69: Object r = get();
70: if (r == null) {
71: return false;
72: } else {
73: return r == (((RegistryKey) other).get());
74: }
75: } else {
76: return false;
77: }
78: }
79: }
|