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.6.4.3 $
022: */package java.rmi.server;
023:
024: import java.io.IOException;
025: import java.io.ObjectInput;
026: import java.io.ObjectOutput;
027: import java.io.Serializable;
028: import java.security.AccessController;
029: import java.security.SecureRandom;
030:
031: import org.apache.harmony.rmi.common.GetBooleanPropAction;
032: import org.apache.harmony.rmi.common.RMIProperties;
033:
034: /**
035: * @com.intel.drl.spec_ref
036: *
037: * @author Mikhail A. Markov
038: * @version $Revision: 1.6.4.3 $
039: */
040: public final class ObjID implements Serializable {
041:
042: private static final long serialVersionUID = -6386392263968365220L;
043:
044: /** @com.intel.drl.spec_ref */
045: public static final int REGISTRY_ID = 0;
046:
047: /** @com.intel.drl.spec_ref */
048: public static final int ACTIVATOR_ID = 1;
049:
050: /** @com.intel.drl.spec_ref */
051: public static final int DGC_ID = 2;
052:
053: private long objNum;
054: private UID space;
055:
056: /*
057: * If true then we should use cryptographically strong random number
058: * generator.
059: */
060: private static final boolean useRandom = ((Boolean) AccessController
061: .doPrivileged(new GetBooleanPropAction(
062: RMIProperties.RANDOMIDS_PROP))).booleanValue();
063:
064: /*
065: * Number generator for initializing objNum fields.
066: */
067: private static final NumberGenerator numGenerator = new NumberGenerator();
068:
069: /**
070: * @com.intel.drl.spec_ref
071: */
072: public ObjID(int num) {
073: objNum = num;
074: space = new UID((short) 0);
075: }
076:
077: /**
078: * @com.intel.drl.spec_ref
079: */
080: public ObjID() {
081: objNum = numGenerator.nextLong();
082: space = new UID();
083: }
084:
085: /**
086: * @com.intel.drl.spec_ref
087: */
088: public String toString() {
089: return "ObjID[" + objNum + ", " + space + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
090: }
091:
092: /**
093: * @com.intel.drl.spec_ref
094: */
095: public boolean equals(Object obj) {
096: if (obj != null && (obj instanceof ObjID)) {
097: ObjID id = (ObjID) obj;
098: return (objNum == id.objNum) && space.equals(id.space);
099: }
100: return false;
101: }
102:
103: /**
104: * @com.intel.drl.spec_ref
105: */
106: public void write(ObjectOutput out) throws IOException {
107: out.writeLong(objNum);
108: space.write(out);
109: }
110:
111: /**
112: * @com.intel.drl.spec_ref
113: */
114: public int hashCode() {
115: return (int) objNum;
116: }
117:
118: /**
119: * @com.intel.drl.spec_ref
120: */
121: public static ObjID read(ObjectInput in) throws IOException {
122: ObjID id = new ObjID(-1);
123: id.objNum = in.readLong();
124: id.space = UID.read(in);
125: return id;
126: }
127:
128: /*
129: * Generator used for obtaining long numbers both in secure and insecure
130: * variants.
131: */
132: private static class NumberGenerator {
133: // Counter to be used in case of insecure mode.
134: static long numCounter = 65536; // 2^16
135:
136: // Secure generator.
137: SecureRandom sGenerator;
138:
139: /*
140: * Constructs NumberGenerator for secure/unsecure variants.
141: */
142: NumberGenerator() {
143: if (useRandom) {
144: sGenerator = new SecureRandom();
145: }
146: }
147:
148: /*
149: * Returns next long number.
150: */
151: synchronized long nextLong() {
152: return useRandom ? sGenerator.nextLong() : numCounter++;
153: }
154: }
155: }
|