/* * @(#)CorbaClientDelegateImpl.java 1.56 04/06/21 * * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package com.sun.corba.se.impl.protocol; import java.util.Iterator; import java.util.HashMap; import javax.rmi.CORBA.Tie; import org.omg.CORBA.CompletionStatus; import org.omg.CORBA.Context; import org.omg.CORBA.ContextList; import org.omg.CORBA.ExceptionList; import org.omg.CORBA.NamedValue; import org.omg.CORBA.NVList; import org.omg.CORBA.Request; import org.omg.CORBA.TypeCode; import org.omg.CORBA.portable.ApplicationException; import org.omg.CORBA.portable.Delegate; import org.omg.CORBA.portable.InputStream; import org.omg.CORBA.portable.OutputStream; import org.omg.CORBA.portable.RemarshalException; import org.omg.CORBA.portable.ServantObject; import com.sun.corba.se.pept.broker.Broker; import com.sun.corba.se.pept.encoding.InputObject; import com.sun.corba.se.pept.encoding.OutputObject; import com.sun.corba.se.pept.protocol.ClientInvocationInfo; import com.sun.corba.se.pept.protocol.ClientRequestDispatcher; import com.sun.corba.se.pept.transport.ContactInfo; import com.sun.corba.se.pept.transport.ContactInfoList; import com.sun.corba.se.pept.transport.ContactInfoListIterator; import com.sun.corba.se.spi.presentation.rmi.StubAdapter; import com.sun.corba.se.spi.ior.IOR; import com.sun.corba.se.spi.logging.CORBALogDomains; import com.sun.corba.se.spi.orb.ORB; import com.sun.corba.se.spi.protocol.CorbaClientDelegate ; import com.sun.corba.se.spi.transport.CorbaContactInfo; import com.sun.corba.se.spi.transport.CorbaContactInfoList; import com.sun.corba.se.spi.transport.CorbaContactInfoListIterator; import com.sun.corba.se.impl.corba.RequestImpl; import com.sun.corba.se.impl.protocol.CorbaInvocationInfo; import com.sun.corba.se.impl.transport.CorbaContactInfoListImpl; import com.sun.corba.se.impl.util.JDKBridge; import com.sun.corba.se.impl.logging.ORBUtilSystemException; // implements com.sun.corba.se.impl.core.ClientRequestDispatcher // so RMI-IIOP Util.isLocal can call ClientRequestDispatcher.useLocalInvocation. /** * @author Harold Carr */ public class CorbaClientDelegateImpl extends CorbaClientDelegate { private ORB orb; private ORBUtilSystemException wrapper ; private CorbaContactInfoList contactInfoList; public CorbaClientDelegateImpl(ORB orb, CorbaContactInfoList contactInfoList) { this.orb = orb; this.wrapper = ORBUtilSystemException.get( orb, CORBALogDomains.RPC_PROTOCOL ) ; this.contactInfoList = contactInfoList; } // // framework.subcontract.Delegate // public Broker getBroker() { return orb; } public ContactInfoList getContactInfoList() { return contactInfoList; } // // CORBA_2_3.portable.Delegate // public OutputStream request(org.omg.CORBA.Object self, String operation, boolean responseExpected) { ClientInvocationInfo invocationInfo = orb.createOrIncrementInvocationInfo(); Iterator contactInfoListIterator = invocationInfo.getContactInfoListIterator(); if (contactInfoListIterator == null) { contactInfoListIterator = contactInfoList.iterator(); invocationInfo.setContactInfoListIterator(contactInfoListIterator); } if (! contactInfoListIterator.hasNext()) { throw ((CorbaContactInfoListIterator)contactInfoListIterator) .getFailureException(); } CorbaContactInfo contactInfo = (CorbaContactInfo) contactInfoListIterator.next(); ClientRequestDispatcher subcontract = contactInfo.getClientRequestDispatcher(); // Remember chosen subcontract for invoke and releaseReply. // NOTE: This is necessary since a stream is not available in // releaseReply if there is a client marshaling error or an // error in _invoke. invocationInfo.setClientRequestDispatcher(subcontract); return (OutputStream) subcontract.beginRequest(self, operation, !responseExpected, contactInfo); } public InputStream invoke(org.omg.CORBA.Object self, OutputStream output) throws ApplicationException, RemarshalException { ClientRequestDispatcher subcontract = getClientRequestDispatcher(); return (InputStream) subcontract.marshalingComplete((Object)self, (OutputObject)output); } public void releaseReply(org.omg.CORBA.Object self, InputStream input) { // NOTE: InputStream may be null (e.g., exception request from PI). ClientRequestDispatcher subcontract = getClientRequestDispatcher(); subcontract.endRequest(orb, self, (InputObject)input); orb.releaseOrDecrementInvocationInfo(); } private ClientRequestDispatcher getClientRequestDispatcher() { return (ClientRequestDispatcher) ((CorbaInvocationInfo)orb.getInvocationInfo()) .getClientRequestDispatcher(); } public org.omg.CORBA.Object get_interface_def(org.omg.CORBA.Object obj) { InputStream is = null; // instantiate the stub org.omg.CORBA.Object stub = null ; try { OutputStream os = request(null, "_interface", true); is = (InputStream) invoke((org.omg.CORBA.Object)null, os); org.omg.CORBA.Object objimpl = (org.omg.CORBA.Object) is.read_Object(); // check if returned object is of correct type if ( !objimpl._is_a("IDL:omg.org/CORBA/InterfaceDef:1.0") ) throw wrapper.wrongInterfaceDef(CompletionStatus.COMPLETED_MAYBE); try { stub = (org.omg.CORBA.Object) JDKBridge.loadClass("org.omg.CORBA._InterfaceDefStub"). newInstance(); } catch (Exception ex) { throw wrapper.noInterfaceDefStub( ex ) ; } org.omg.CORBA.portable.Delegate del = StubAdapter.getDelegate( objimpl ) ; StubAdapter.setDelegate( stub, del ) ; } catch (ApplicationException e) { // This cannot happen. throw wrapper.applicationExceptionInSpecialMethod( e ) ; } catch (RemarshalException e) { return get_interface_def(obj); } finally { releaseReply((org.omg.CORBA.Object)null, (InputStream)is); } return stub; } public boolean is_a(org.omg.CORBA.Object obj, String dest) { // dest is the typeId of the interface to compare against. // repositoryIds is the list of typeIds that the stub knows about. // First we look for an answer using local information. String [] repositoryIds = StubAdapter.getTypeIds( obj ) ; String myid = contactInfoList.getTargetIOR().getTypeId(); if ( dest.equals(myid) ) { return true; } for ( int i=0; i maximum ) return 0; return h; } public Request request(org.omg.CORBA.Object obj, String operation) { return new RequestImpl(orb, obj, null, operation, null, null, null, null); } public Request create_request(org.omg.CORBA.Object obj, Context ctx, String operation, NVList arg_list, NamedValue result) { return new RequestImpl(orb, obj, ctx, operation, arg_list, result, null, null); } public Request create_request(org.omg.CORBA.Object obj, Context ctx, String operation, NVList arg_list, NamedValue result, ExceptionList exclist, ContextList ctxlist) { return new RequestImpl(orb, obj, ctx, operation, arg_list, result, exclist, ctxlist); } public org.omg.CORBA.ORB orb(org.omg.CORBA.Object obj) { return this.orb; } /** * Returns true if this object is implemented by a local servant. * * REVISIT: locatedIOR should be replaced with a method call that * returns the current IOR for this request (e.g. ContactInfoChooser). * * @param self The object reference which delegated to this delegate. * @return true only if the servant incarnating this object is located in * this ORB. */ public boolean is_local(org.omg.CORBA.Object self) { // XXX this need to check isNextCallValid return contactInfoList.getEffectiveTargetIOR().getProfile(). isLocal(); } public ServantObject servant_preinvoke(org.omg.CORBA.Object self, String operation, Class expectedType) { return contactInfoList.getLocalClientRequestDispatcher() .servant_preinvoke(self, operation, expectedType); } public void servant_postinvoke(org.omg.CORBA.Object self, ServantObject servant) { contactInfoList.getLocalClientRequestDispatcher() .servant_postinvoke(self, servant); } // XXX Should this be public? /* Returns the codebase for object reference provided. * @param self the object reference whose codebase needs to be returned. * @return the codebase as a space delimited list of url strings or * null if none. */ public String get_codebase(org.omg.CORBA.Object self) { if (contactInfoList.getTargetIOR() != null) { return contactInfoList.getTargetIOR().getProfile().getCodebase(); } return null; } public String toString(org.omg.CORBA.Object self) { return contactInfoList.getTargetIOR().stringify(); } //////////////////////////////////////////////////// // // java.lang.Object // public int hashCode() { return this.contactInfoList.hashCode(); } } // End of file.