corbaclientdelegateimpl.java

来自「JAVA 所有包」· Java 代码 · 共 427 行

JAVA
427
字号
/* * @(#)CorbaClientDelegateImpl.java	1.57 05/11/17 *  * Copyright 2006 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<repositoryIds.length; i++ ) {            if ( dest.equals(repositoryIds[i]) ) {		return true;	    }	}        // But repositoryIds may not be complete, so it may be necessary to        // go to server.	InputStream is = null;        try {            OutputStream os = request(null, "_is_a", true);            os.write_string(dest);            is = (InputStream) invoke((org.omg.CORBA.Object) null, os);	    return is.read_boolean();        } catch (ApplicationException e) {	    // This cannot happen.	    throw wrapper.applicationExceptionInSpecialMethod( e ) ;	} catch (RemarshalException e) {	    return is_a(obj, dest);	} finally {	    releaseReply((org.omg.CORBA.Object)null, (InputStream)is);        }    }        public boolean non_existent(org.omg.CORBA.Object obj)     {	InputStream is = null;        try {            OutputStream os = request(null, "_non_existent", true);            is = (InputStream) invoke((org.omg.CORBA.Object)null, os);	    return is.read_boolean();	} catch (ApplicationException e) {	    // This cannot happen.	    throw wrapper.applicationExceptionInSpecialMethod( e ) ;	} catch (RemarshalException e) {	    return non_existent(obj);	} finally {	    releaseReply((org.omg.CORBA.Object)null, (InputStream)is);        }    }        public org.omg.CORBA.Object duplicate(org.omg.CORBA.Object obj)     {	return obj;    }        public void release(org.omg.CORBA.Object obj)     {	// DO NOT clear out internal variables to release memory	// This delegate may be pointed-to by other objrefs.    }    // obj._get_delegate() == this due to the argument passing conventions in    // portable.ObjectImpl, so we just ignore obj here.    public boolean is_equivalent(org.omg.CORBA.Object obj,				 org.omg.CORBA.Object ref)    {	if ( ref == null )	    return false;	// If ref is a local object, it is not a Stub!	if (!StubAdapter.isStub(ref))	    return false ;	Delegate del = StubAdapter.getDelegate(ref) ;	if (del == null)	    return false ;	// Optimize the x.is_equivalent( x ) case	if (del == this)	    return true;	// If delegate was created by a different ORB, return false	if (!(del instanceof CorbaClientDelegateImpl))	    return false ;	CorbaClientDelegateImpl corbaDelegate = (CorbaClientDelegateImpl)del ;	CorbaContactInfoList ccil = 	    (CorbaContactInfoList)corbaDelegate.getContactInfoList() ;	return this.contactInfoList.getTargetIOR().isEquivalent( 	    ccil.getTargetIOR() );    }    /**     * This method overrides the org.omg.CORBA.portable.Delegate.equals method,     * and does the equality check based on IOR equality.     */    public boolean equals(org.omg.CORBA.Object self, java.lang.Object other)     {	if (other == null)	    return false ;        if (!StubAdapter.isStub(other)) {            return false;           }        	Delegate delegate = StubAdapter.getDelegate( other ) ;	if (delegate == null)	    return false ;        if (delegate instanceof CorbaClientDelegateImpl) {            CorbaClientDelegateImpl otherDel = (CorbaClientDelegateImpl)		delegate ;            IOR otherIor = otherDel.contactInfoList.getTargetIOR();            return this.contactInfoList.getTargetIOR().equals(otherIor);        } 	// Come here if other is not implemented by our ORB.        return false;    }    public int hashCode(org.omg.CORBA.Object obj)    {	return this.hashCode() ;    }    public int hash(org.omg.CORBA.Object obj, int maximum)     {	int h = this.hashCode();	if ( h > 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.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?