/* * @(#)StubIORImpl.java 1.3 04/07/27 * * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ /* * Licensed Materials - Property of IBM * RMI-IIOP v1.0 * Copyright IBM Corp. 1998 1999 All Rights Reserved * * US Government Users Restricted Rights - Use, duplication or * disclosure restricted by GSA ADP Schedule Contract with IBM Corp. */ package com.sun.corba.se.impl.ior; import java.io.ObjectInputStream ; import java.io.ObjectOutputStream ; import java.io.IOException ; import java.io.StringWriter ; import org.omg.CORBA.ORB ; import org.omg.CORBA.portable.Delegate ; import org.omg.CORBA.portable.InputStream ; import org.omg.CORBA.portable.OutputStream ; // Be very careful: com.sun.corba imports must not depend on // PEORB internal classes in ways that prevent portability to // other vendor's ORBs. import com.sun.corba.se.spi.presentation.rmi.StubAdapter ; import com.sun.corba.se.impl.orbutil.HexOutputStream ; /** * This class implements a very simply IOR representation * which must be completely ORBImpl free so that this class * can be used in the implementation of a portable StubDelegateImpl. */ public class StubIORImpl { // cached hash code private int hashCode; // IOR components private byte[] typeData; private int[] profileTags; private byte[][] profileData; public StubIORImpl() { hashCode = 0 ; typeData = null ; profileTags = null ; profileData = null ; } public String getRepositoryId() { if (typeData == null) return null ; return new String( typeData ) ; } public StubIORImpl( org.omg.CORBA.Object obj ) { // write the IOR to an OutputStream and get an InputStream OutputStream ostr = StubAdapter.getORB( obj ).create_output_stream(); ostr.write_Object(obj); InputStream istr = ostr.create_input_stream(); // read the IOR components back from the stream int typeLength = istr.read_long(); typeData = new byte[typeLength]; istr.read_octet_array(typeData, 0, typeLength); int numProfiles = istr.read_long(); profileTags = new int[numProfiles]; profileData = new byte[numProfiles][]; for (int i = 0; i < numProfiles; i++) { profileTags[i] = istr.read_long(); profileData[i] = new byte[istr.read_long()]; istr.read_octet_array(profileData[i], 0, profileData[i].length); } } public Delegate getDelegate( ORB orb ) { // write the IOR components to an org.omg.CORBA.portable.OutputStream OutputStream ostr = orb.create_output_stream(); ostr.write_long(typeData.length); ostr.write_octet_array(typeData, 0, typeData.length); ostr.write_long(profileTags.length); for (int i = 0; i < profileTags.length; i++) { ostr.write_long(profileTags[i]); ostr.write_long(profileData[i].length); ostr.write_octet_array(profileData[i], 0, profileData[i].length); } InputStream istr = ostr.create_input_stream() ; // read the IOR back from the stream org.omg.CORBA.Object obj = (org.omg.CORBA.Object)istr.read_Object(); return StubAdapter.getDelegate( obj ) ; } public void doRead( java.io.ObjectInputStream stream ) throws IOException, ClassNotFoundException { // read the IOR from the ObjectInputStream int typeLength = stream.readInt(); typeData = new byte[typeLength]; stream.readFully(typeData); int numProfiles = stream.readInt(); profileTags = new int[numProfiles]; profileData = new byte[numProfiles][]; for (int i = 0; i < numProfiles; i++) { profileTags[i] = stream.readInt(); profileData[i] = new byte[stream.readInt()]; stream.readFully(profileData[i]); } } public void doWrite( ObjectOutputStream stream ) throws IOException { // write the IOR to the ObjectOutputStream stream.writeInt(typeData.length); stream.write(typeData); stream.writeInt(profileTags.length); for (int i = 0; i < profileTags.length; i++) { stream.writeInt(profileTags[i]); stream.writeInt(profileData[i].length); stream.write(profileData[i]); } } /** * Returns a hash code value for the object which is the same for all stubs * that represent the same remote object. * @return the hash code value. */ public synchronized int hashCode() { if (hashCode == 0) { // compute the hash code for (int i = 0; i < typeData.length; i++) { hashCode = hashCode * 37 + typeData[i]; } for (int i = 0; i < profileTags.length; i++) { hashCode = hashCode * 37 + profileTags[i]; for (int j = 0; j < profileData[i].length; j++) { hashCode = hashCode * 37 + profileData[i][j]; } } } return hashCode; } private boolean equalArrays( int[] data1, int[] data2 ) { if (data1.length != data2.length) return false ; for (int ctr=0; ctr,[]data, ...]" * @return a string representation of this stub. */ public String toString() { StringBuffer result = new StringBuffer() ; result.append( "SimpleIORImpl[" ) ; String repositoryId = new String( typeData ) ; result.append( repositoryId ) ; for (int ctr=0; ctr