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 26 package com.sun.corba.se.impl.ior; 27 28 import org.omg.CORBA.OctetSeqHolder ; 29 30 import org.omg.CORBA_2_3.portable.OutputStream ; 31 import org.omg.CORBA_2_3.portable.InputStream ; 32 33 import com.sun.corba.se.spi.protocol.CorbaServerRequestDispatcher ; 34 35 import com.sun.corba.se.spi.ior.ObjectKeyTemplate ; 36 import com.sun.corba.se.spi.ior.ObjectId ; 37 import com.sun.corba.se.spi.ior.ObjectAdapterId ; 38 39 import com.sun.corba.se.spi.orb.ORB ; 40 import com.sun.corba.se.spi.orb.ORBVersion ; 41 import com.sun.corba.se.spi.orb.ORBVersionFactory ; 42 43 import com.sun.corba.se.spi.logging.CORBALogDomains ; 44 45 import com.sun.corba.se.impl.orbutil.ORBConstants ; 46 47 import com.sun.corba.se.impl.encoding.CDRInputStream ; 48 49 import com.sun.corba.se.impl.logging.IORSystemException ; 50 51 /** 52 * @author Ken Cavanaugh 53 */ 54 public class WireObjectKeyTemplate implements ObjectKeyTemplate 55 { 56 private ORB orb ; 57 private IORSystemException wrapper ; 58 59 public boolean equals( Object obj ) 60 { 61 if (obj == null) 62 return false ; 63 64 return obj instanceof WireObjectKeyTemplate ; 65 } 66 67 public int hashCode() 68 { 69 return 53 ; // All WireObjectKeyTemplates are the same, so they should 70 // have the same hashCode. 71 } 72 73 private byte[] getId( InputStream is ) 74 { 75 CDRInputStream cis = (CDRInputStream)is ; 76 int len = cis.getBufferLength() ; 77 byte[] result = new byte[ len ] ; 78 cis.read_octet_array( result, 0, len ) ; 79 return result ; 80 } 81 82 public WireObjectKeyTemplate( ORB orb ) 83 { 84 initORB( orb ) ; 85 } 86 87 public WireObjectKeyTemplate( InputStream is, OctetSeqHolder osh ) 88 { 89 osh.value = getId( is ) ; 90 initORB( (ORB)(is.orb())) ; 91 } 92 93 private void initORB( ORB orb ) 94 { 95 this.orb = orb ; 96 wrapper = IORSystemException.get( orb, 97 CORBALogDomains.OA_IOR ) ; 98 } 99 100 public void write( ObjectId id, OutputStream os ) 101 { 102 byte[] key = id.getId() ; 103 os.write_octet_array( key, 0, key.length ) ; 104 } 105 106 public void write( OutputStream os ) 107 { 108 // Does nothing 109 } 110 111 public int getSubcontractId() 112 { 113 return ORBConstants.DEFAULT_SCID ; 114 } 115 116 /** While it might make sense to throw an exception here, this causes 117 * problems since we need to check whether unusual object references 118 * are local or not. It seems that the easiest way to handle this is 119 * to return an invalid server id. 120 */ 121 public int getServerId() 122 { 123 return -1 ; 124 } 125 126 public String getORBId() 127 { 128 throw wrapper.orbIdNotAvailable() ; 129 } 130 131 public ObjectAdapterId getObjectAdapterId() 132 { 133 throw wrapper.objectAdapterIdNotAvailable() ; 134 } 135 136 /** Adapter ID is not available, since our 137 * ORB did not implement the object carrying this key. 138 */ 139 public byte[] getAdapterId() 140 { 141 throw wrapper.adapterIdNotAvailable() ; 142 } 143 144 public ORBVersion getORBVersion() 145 { 146 return ORBVersionFactory.getFOREIGN() ; 147 } 148 149 public CorbaServerRequestDispatcher getServerRequestDispatcher( ORB orb, ObjectId id ) 150 { 151 byte[] bid = id.getId() ; 152 String str = new String( bid ) ; 153 return orb.getRequestDispatcherRegistry().getServerRequestDispatcher( str ) ; 154 } 155 }