/* * Copyright (c) 2002, 2004, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.corba.se.impl.resolver ; import org.omg.CORBA.portable.InputStream ; import org.omg.CORBA.portable.OutputStream ; import org.omg.CORBA.portable.ApplicationException ; import org.omg.CORBA.portable.RemarshalException ; import com.sun.corba.se.spi.ior.IOR ; import com.sun.corba.se.spi.ior.IORFactories ; import com.sun.corba.se.spi.ior.IORTemplate ; import com.sun.corba.se.spi.ior.ObjectKey ; import com.sun.corba.se.spi.ior.ObjectKeyFactory ; import com.sun.corba.se.spi.ior.iiop.IIOPAddress ; import com.sun.corba.se.spi.ior.iiop.IIOPProfileTemplate ; import com.sun.corba.se.spi.ior.iiop.IIOPFactories ; import com.sun.corba.se.spi.ior.iiop.GIOPVersion ; import com.sun.corba.se.spi.logging.CORBALogDomains ; import com.sun.corba.se.spi.orb.ORB ; import com.sun.corba.se.spi.resolver.Resolver ; import com.sun.corba.se.impl.logging.ORBUtilSystemException ; import com.sun.corba.se.impl.orbutil.ORBUtility ; public class BootstrapResolverImpl implements Resolver { private org.omg.CORBA.portable.Delegate bootstrapDelegate ; private ORBUtilSystemException wrapper ; public BootstrapResolverImpl(ORB orb, String host, int port) { wrapper = ORBUtilSystemException.get( orb, CORBALogDomains.ORB_RESOLVER ) ; // Create a new IOR with the magic of INIT byte[] initialKey = "INIT".getBytes() ; ObjectKey okey = orb.getObjectKeyFactory().create(initialKey) ; IIOPAddress addr = IIOPFactories.makeIIOPAddress( orb, host, port ) ; IIOPProfileTemplate ptemp = IIOPFactories.makeIIOPProfileTemplate( orb, GIOPVersion.V1_0, addr); IORTemplate iortemp = IORFactories.makeIORTemplate( okey.getTemplate() ) ; iortemp.add( ptemp ) ; IOR initialIOR = iortemp.makeIOR( (com.sun.corba.se.spi.orb.ORB)orb, "", okey.getId() ) ; bootstrapDelegate = ORBUtility.makeClientDelegate( initialIOR ) ; } /** * For the BootStrap operation we do not expect to have more than one * parameter. We do not want to extend BootStrap protocol any further, * as INS handles most of what BootStrap can handle in a portable way. * * @return InputStream which contains the response from the * BootStrapOperation. */ private InputStream invoke( String operationName, String parameter ) { boolean remarshal = true; // Invoke. InputStream inStream = null; // If there is a location forward then you will need // to invoke again on the updated information. // Just calling this same routine with the same host/port // does not take the location forward info into account. while (remarshal) { org.omg.CORBA.Object objref = null ; remarshal = false; OutputStream os = (OutputStream) bootstrapDelegate.request( objref, operationName, true); if ( parameter != null ) { os.write_string( parameter ); } try { // The only reason a null objref is passed is to get the version of // invoke used by streams. Otherwise the PortableInterceptor // call stack will become unbalanced since the version of // invoke which only takes the stream does not call // PortableInterceptor ending points. // Note that the first parameter is ignored inside invoke. inStream = bootstrapDelegate.invoke( objref, os); } catch (ApplicationException e) { throw wrapper.bootstrapApplicationException( e ) ; } catch (RemarshalException e) { // XXX log this remarshal = true; } } return inStream; } public org.omg.CORBA.Object resolve( String identifier ) { InputStream inStream = null ; org.omg.CORBA.Object result = null ; try { inStream = invoke( "get", identifier ) ; result = inStream.read_Object(); // NOTE: do note trap and ignore errors. // Let them flow out. } finally { bootstrapDelegate.releaseReply( null, inStream ) ; } return result ; } public java.util.Set list() { InputStream inStream = null ; java.util.Set result = new java.util.HashSet() ; try { inStream = invoke( "list", null ) ; int count = inStream.read_long(); for (int i=0; i < count; i++) result.add( inStream.read_string() ) ; // NOTE: do note trap and ignore errors. // Let them flow out. } finally { bootstrapDelegate.releaseReply( null, inStream ) ; } return result ; } }