001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: *
015: * See the License for the specific language governing permissions and
016: * limitations under the License.
017: */
018:
019: /**
020: * @author Mikhail A. Markov
021: * @version $Revision: 1.7.4.2 $
022: */package java.rmi.dgc;
023:
024: import java.io.Serializable;
025: import java.io.IOException;
026: import java.io.ObjectInput;
027: import java.io.ObjectOutput;
028: import java.net.InetAddress;
029: import java.rmi.server.UID;
030: import java.security.AccessController;
031: import java.security.PrivilegedAction;
032: import java.util.Arrays;
033:
034: /**
035: * @com.intel.drl.spec_ref
036: *
037: * @author Mikhail A. Markov
038: * @version $Revision: 1.7.4.2 $
039: */
040: public final class VMID implements Serializable {
041: private static final long serialVersionUID = -538642295484486218L;
042: private byte[] addr;
043: private UID uid;
044:
045: /*
046: * If true then we successfully obtained host address and this VMID could
047: * be treated as unique.
048: */
049: private static boolean unique = true;
050:
051: /*
052: * This VM local address. If it was successfully obtained then isUnique()
053: * method for VMIDs created in this VM will return true, otherwise addr
054: * fields will be set to address 127.0.0.1 and isUnique() method will
055: * return false.
056: */
057: private static byte[] localAddr = (byte[]) AccessController
058: .doPrivileged(new PrivilegedAction() {
059: public Object run() {
060: try {
061: return InetAddress.getLocalHost().getAddress();
062: } catch (Exception ex) {
063: unique = false;
064: return new byte[] { 127, 0, 0, 1 };
065: }
066: }
067: });
068:
069: /**
070: * @com.intel.drl.spec_ref
071: */
072: public VMID() {
073: addr = localAddr;
074: uid = new UID();
075: }
076:
077: /**
078: * @com.intel.drl.spec_ref
079: * It returns hexadecimal representation of address with 2 positions for
080: * each byte.
081: */
082: public String toString() {
083: String str = "VMID["; //$NON-NLS-1$
084:
085: for (int i = 0; i < addr.length; ++i) {
086: int ibyte = addr[i] & 255; // quick way to have a module of the byte
087:
088: str += ((ibyte < 16) ? "0" : "") + Integer.toString(ibyte, 16); //$NON-NLS-1$ //$NON-NLS-2$
089: }
090: return str + ", " + uid + "]"; //$NON-NLS-1$ //$NON-NLS-2$
091: }
092:
093: /**
094: * @com.intel.drl.spec_ref
095: */
096: public boolean equals(Object obj) {
097: if (obj == null || !(obj instanceof VMID)) {
098: return false;
099: }
100: VMID vmid = (VMID) obj;
101: return uid.equals(vmid.uid) && Arrays.equals(addr, vmid.addr);
102: }
103:
104: /**
105: * @com.intel.drl.spec_ref
106: */
107: public int hashCode() {
108: return uid.hashCode();
109: }
110:
111: /**
112: * @com.intel.drl.spec_ref
113: * @deprecated VMID's are unique in overwhelming majority of cases
114: */
115: @Deprecated
116: public static boolean isUnique() {
117: return unique;
118: }
119:
120: private void readObject(ObjectInput in) throws IOException,
121: ClassNotFoundException {
122: addr = (byte[]) in.readObject();
123: uid = UID.read(in);
124: }
125:
126: private void writeObject(ObjectOutput out) throws IOException {
127: out.writeObject(addr);
128: uid.write(out);
129: }
130: }
|