ObjectKeyTemplateBase.java revision 672:2bb058ce572e
1/* 2 * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26package com.sun.corba.se.impl.ior; 27 28import java.util.Iterator ; 29 30import org.omg.CORBA_2_3.portable.InputStream ; 31import org.omg.CORBA_2_3.portable.OutputStream ; 32 33import com.sun.corba.se.spi.protocol.CorbaServerRequestDispatcher ; 34 35import com.sun.corba.se.spi.ior.ObjectId ; 36import com.sun.corba.se.spi.ior.ObjectAdapterId ; 37import com.sun.corba.se.spi.ior.ObjectKeyTemplate ; 38 39import com.sun.corba.se.spi.orb.ORB ; 40import com.sun.corba.se.spi.orb.ORBVersion ; 41 42import com.sun.corba.se.spi.logging.CORBALogDomains ; 43 44 45import com.sun.corba.se.impl.encoding.EncapsOutputStream ; 46 47import com.sun.corba.se.impl.logging.IORSystemException ; 48 49 50public abstract class ObjectKeyTemplateBase implements ObjectKeyTemplate 51{ 52 // Fixed constants for Java IDL object key template forms 53 public static final String JIDL_ORB_ID = "" ; 54 private static final String[] JIDL_OAID_STRINGS = { "TransientObjectAdapter" } ; 55 public static final ObjectAdapterId JIDL_OAID = new ObjectAdapterIdArray( JIDL_OAID_STRINGS ) ; 56 57 private ORB orb ; 58 protected IORSystemException wrapper ; 59 private ORBVersion version ; 60 private int magic ; 61 private int scid ; 62 private int serverid ; 63 private String orbid ; 64 private ObjectAdapterId oaid ; 65 66 private byte[] adapterId ; 67 68 public byte[] getAdapterId() 69 { 70 return (byte[])(adapterId.clone()) ; 71 } 72 73 private byte[] computeAdapterId() 74 { 75 // write out serverid, orbid, oaid 76 ByteBuffer buff = new ByteBuffer() ; 77 78 buff.append( getServerId() ) ; 79 buff.append( orbid ) ; 80 81 buff.append( oaid.getNumLevels() ) ; 82 Iterator iter = oaid.iterator() ; 83 while (iter.hasNext()) { 84 String comp = (String)(iter.next()) ; 85 buff.append( comp ) ; 86 } 87 88 buff.trimToSize() ; 89 90 return buff.toArray() ; 91 } 92 93 public ObjectKeyTemplateBase( ORB orb, int magic, int scid, int serverid, 94 String orbid, ObjectAdapterId oaid ) 95 { 96 this.orb = orb ; 97 this.wrapper = IORSystemException.get( orb, 98 CORBALogDomains.OA_IOR ) ; 99 this.magic = magic ; 100 this.scid = scid ; 101 this.serverid = serverid ; 102 this.orbid = orbid ; 103 this.oaid = oaid ; 104 105 adapterId = computeAdapterId() ; 106 } 107 108 public boolean equals( Object obj ) 109 { 110 if (!(obj instanceof ObjectKeyTemplateBase)) 111 return false ; 112 113 ObjectKeyTemplateBase other = (ObjectKeyTemplateBase)obj ; 114 115 return (magic == other.magic) && (scid == other.scid) && 116 (serverid == other.serverid) && (version.equals( other.version ) && 117 orbid.equals( other.orbid ) && oaid.equals( other.oaid )) ; 118 } 119 120 public int hashCode() 121 { 122 int result = 17 ; 123 result = 37*result + magic ; 124 result = 37*result + scid ; 125 result = 37*result + serverid ; 126 result = 37*result + version.hashCode() ; 127 result = 37*result + orbid.hashCode() ; 128 result = 37*result + oaid.hashCode() ; 129 return result ; 130 } 131 132 public int getSubcontractId() 133 { 134 return scid ; 135 } 136 137 public int getServerId() 138 { 139 return serverid ; 140 } 141 142 public String getORBId() 143 { 144 return orbid ; 145 } 146 147 public ObjectAdapterId getObjectAdapterId() 148 { 149 return oaid ; 150 } 151 152 public void write(ObjectId objectId, OutputStream os) 153 { 154 writeTemplate( os ) ; 155 objectId.write( os ) ; 156 } 157 158 public void write( OutputStream os ) 159 { 160 writeTemplate( os ) ; 161 } 162 163 abstract protected void writeTemplate( OutputStream os ) ; 164 165 protected int getMagic() 166 { 167 return magic ; 168 } 169 170 // All subclasses should set the version in their constructors. 171 // Public so it can be used in a white-box test. 172 public void setORBVersion( ORBVersion version ) 173 { 174 this.version = version ; 175 } 176 177 public ORBVersion getORBVersion() 178 { 179 return version ; 180 } 181 182 protected byte[] readObjectKey( InputStream is ) 183 { 184 int len = is.read_long() ; 185 byte[] result = new byte[len] ; 186 is.read_octet_array( result, 0, len ) ; 187 return result ; 188 } 189 190 public CorbaServerRequestDispatcher getServerRequestDispatcher( ORB orb, ObjectId id ) 191 { 192 return orb.getRequestDispatcherRegistry().getServerRequestDispatcher( scid ) ; 193 } 194} 195