BootstrapResolverImpl.java revision 608:7e06bf1dcb09
1/* 2 * Copyright (c) 2002, 2004, 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.resolver ; 27 28import org.omg.CORBA.portable.InputStream ; 29import org.omg.CORBA.portable.OutputStream ; 30import org.omg.CORBA.portable.ApplicationException ; 31import org.omg.CORBA.portable.RemarshalException ; 32 33import com.sun.corba.se.spi.ior.IOR ; 34import com.sun.corba.se.spi.ior.IORFactories ; 35import com.sun.corba.se.spi.ior.IORTemplate ; 36import com.sun.corba.se.spi.ior.ObjectKey ; 37import com.sun.corba.se.spi.ior.ObjectKeyFactory ; 38import com.sun.corba.se.spi.ior.iiop.IIOPAddress ; 39import com.sun.corba.se.spi.ior.iiop.IIOPProfileTemplate ; 40import com.sun.corba.se.spi.ior.iiop.IIOPFactories ; 41import com.sun.corba.se.spi.ior.iiop.GIOPVersion ; 42import com.sun.corba.se.spi.logging.CORBALogDomains ; 43import com.sun.corba.se.spi.orb.ORB ; 44import com.sun.corba.se.spi.resolver.Resolver ; 45 46import com.sun.corba.se.impl.logging.ORBUtilSystemException ; 47import com.sun.corba.se.impl.orbutil.ORBUtility ; 48 49public class BootstrapResolverImpl implements Resolver { 50 private org.omg.CORBA.portable.Delegate bootstrapDelegate ; 51 private ORBUtilSystemException wrapper ; 52 53 public BootstrapResolverImpl(ORB orb, String host, int port) { 54 wrapper = ORBUtilSystemException.get( orb, 55 CORBALogDomains.ORB_RESOLVER ) ; 56 57 // Create a new IOR with the magic of INIT 58 byte[] initialKey = "INIT".getBytes() ; 59 ObjectKey okey = orb.getObjectKeyFactory().create(initialKey) ; 60 61 IIOPAddress addr = IIOPFactories.makeIIOPAddress( orb, host, port ) ; 62 IIOPProfileTemplate ptemp = IIOPFactories.makeIIOPProfileTemplate( 63 orb, GIOPVersion.V1_0, addr); 64 65 IORTemplate iortemp = IORFactories.makeIORTemplate( okey.getTemplate() ) ; 66 iortemp.add( ptemp ) ; 67 68 IOR initialIOR = iortemp.makeIOR( (com.sun.corba.se.spi.orb.ORB)orb, 69 "", okey.getId() ) ; 70 71 bootstrapDelegate = ORBUtility.makeClientDelegate( initialIOR ) ; 72 } 73 74 /** 75 * For the BootStrap operation we do not expect to have more than one 76 * parameter. We do not want to extend BootStrap protocol any further, 77 * as INS handles most of what BootStrap can handle in a portable way. 78 * 79 * @return InputStream which contains the response from the 80 * BootStrapOperation. 81 */ 82 private InputStream invoke( String operationName, String parameter ) 83 { 84 boolean remarshal = true; 85 86 // Invoke. 87 88 InputStream inStream = null; 89 90 // If there is a location forward then you will need 91 // to invoke again on the updated information. 92 // Just calling this same routine with the same host/port 93 // does not take the location forward info into account. 94 95 while (remarshal) { 96 org.omg.CORBA.Object objref = null ; 97 remarshal = false; 98 99 OutputStream os = (OutputStream) bootstrapDelegate.request( objref, 100 operationName, true); 101 102 if ( parameter != null ) { 103 os.write_string( parameter ); 104 } 105 106 try { 107 // The only reason a null objref is passed is to get the version of 108 // invoke used by streams. Otherwise the PortableInterceptor 109 // call stack will become unbalanced since the version of 110 // invoke which only takes the stream does not call 111 // PortableInterceptor ending points. 112 // Note that the first parameter is ignored inside invoke. 113 114 inStream = bootstrapDelegate.invoke( objref, os); 115 } catch (ApplicationException e) { 116 throw wrapper.bootstrapApplicationException( e ) ; 117 } catch (RemarshalException e) { 118 // XXX log this 119 remarshal = true; 120 } 121 } 122 123 return inStream; 124 } 125 126 public org.omg.CORBA.Object resolve( String identifier ) 127 { 128 InputStream inStream = null ; 129 org.omg.CORBA.Object result = null ; 130 131 try { 132 inStream = invoke( "get", identifier ) ; 133 134 result = inStream.read_Object(); 135 136 // NOTE: do note trap and ignore errors. 137 // Let them flow out. 138 } finally { 139 bootstrapDelegate.releaseReply( null, inStream ) ; 140 } 141 142 return result ; 143 } 144 145 public java.util.Set list() 146 { 147 InputStream inStream = null ; 148 java.util.Set result = new java.util.HashSet() ; 149 150 try { 151 inStream = invoke( "list", null ) ; 152 153 int count = inStream.read_long(); 154 for (int i=0; i < count; i++) 155 result.add( inStream.read_string() ) ; 156 157 // NOTE: do note trap and ignore errors. 158 // Let them flow out. 159 } finally { 160 bootstrapDelegate.releaseReply( null, inStream ) ; 161 } 162 163 return result ; 164 } 165} 166