subcontractregistry.java

来自「java jdk 1.4的源码」· Java 代码 · 共 222 行

JAVA
222
字号
/* * @(#)SubcontractRegistry.java	1.43 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.corba.se.internal.core;import java.util.*;import org.omg.IOP.TAG_INTERNET_IOP ;import com.sun.corba.se.internal.ior.ObjectKey ;import com.sun.corba.se.internal.ior.ObjectKeyTemplate ;import com.sun.corba.se.internal.ior.ObjectKeyFactory ;import com.sun.corba.se.internal.ior.IORTemplate ;import com.sun.corba.se.internal.ior.IIOPProfileTemplate ;import com.sun.corba.se.internal.ior.WireObjectKeyTemplate ;import com.sun.corba.se.internal.ior.ObjectId ;import com.sun.corba.se.internal.corba.INSSubcontract;import com.sun.corba.se.internal.orbutil.MinorCodes ;import com.sun.corba.se.internal.orbutil.ORBConstants ;import org.omg.CORBA.BAD_PARAM ;import org.omg.CORBA.INTERNAL ;import org.omg.CORBA.CompletionStatus ;import org.omg.CORBA.ORB ;/** * This is a registry of all client subcontract classes and * server subcontract instances. * * In order to allow reuse of this in more than one context * (that is, ORBs), we try not to throw any CORBA specific * exceptions. Most of the methods either throw Java exceptions * or return nulls or false on failure. */public class SubcontractRegistry {    protected ORB orb;    protected int size;    protected ServerSubcontract[] serverRegistry;    protected Class[] clientFactory;    protected int defaultId;    private INSSubcontract insSubcontract = null;    public void dumpServers()    {	System.out.println( "Dump of registered server subcontracts:" ) ;	for (int ctr=0; ctr<serverRegistry.length; ctr++ ) {	    ServerSubcontract sc = serverRegistry[ctr] ;	    if (sc != null)		System.out.println( "serverRegistry[" + ctr + "] = " + sc ) ;	}    }    public SubcontractRegistry(ORB orb, int defaultId) {        this(orb, defaultId, 256);    }    public SubcontractRegistry(ORB orb, int defaultId, int size) {	this.orb = orb;        this.size = size;        this.defaultId = defaultId;        serverRegistry = new ServerSubcontract[size];        clientFactory = new Class[size];    }    public synchronized boolean registerClient(Class clientSC,					       int scid)    {        if (scid < size) {            clientFactory[scid] = clientSC;	    return true;	}	return false;    }    public synchronized boolean registerServer(ServerSubcontract sc,					       int scid) {        if (scid < size) {	    serverRegistry[scid] = sc;	    return true;        }	return false;    }    // REVISIT replace this with a more general registration mechanism    protected ServerSubcontract bootstrapServer = null;    public void registerBootstrapServer(ServerSubcontract sc)    {	this.bootstrapServer = sc;    }    // **************************************************    // Methods to find the subcontract side subcontract    // **************************************************    public ServerSubcontract getServerSubcontract(int scid)    {	ServerSubcontract sc=null;        if ((scid >= 0) && (scid < size))            sc = serverRegistry[scid];	if ( sc == null )	    return serverRegistry[defaultId];	else	    return sc;    }    /** Find a server subcontract based on the object key.    * This is a key method in the server side dispatch of    * requests.  This method is called from the ORB process method    * in response to an incoming request.    * <p>    * Note that we should probably at some point replace the fixed    * names with a name registry for subcontracts whose entire    * object key is a name.    */    public ServerSubcontract getServerSubcontract(ObjectKey objKey)    {	ObjectKeyTemplate oktemp = objKey.getTemplate() ;	if (oktemp instanceof WireObjectKeyTemplate) {	    String okstring = new String( objKey.getBytes(orb) );	    // The orginal (circa 1997) bootstrap protocol used a 32 bit int	    // corresponding to the characters "INIT".  We allow for this	    // to be marshalled either big endian or little endian here.	    // If it had always been a string, we would not need to do this.	    if (okstring.equals( "INIT" ) || okstring.equals( "TINI" ))		return bootstrapServer ;            // INS Object Key strings will be in the ASCII format, Like            // for example NameService. If we are successful in finding            // the subcontract based on the key then just return that, else            // there is an error.            INSObjectKeyEntry keyEntry =                 INSObjectKeyMap.getInstance( ).getEntry(okstring);            if( keyEntry != null ) {                return getINSSubcontract( );            }	} else {	    int scid = oktemp.getSubcontractId();	    return getServerSubcontract( scid );	}	throw new INTERNAL( MinorCodes.NO_SERVER_SUBCONTRACT,	    CompletionStatus.COMPLETED_NO ) ;    }     private synchronized INSSubcontract getINSSubcontract ( ) {        if( insSubcontract == null ) {            insSubcontract = new INSSubcontract( orb );        }        return insSubcontract;    }    // **************************************************    // Methods to find the client side subcontract    // **************************************************    public ClientSubcontract getClientSubcontract(ObjectKey key)    {	return getClientSubcontract( key.getTemplate() ) ;    }    public ClientSubcontract getClientSubcontract( IORTemplate temp )    {	// REVISIT we eventually need to fix this if we need to handle	// multi-profile IORs.  For now, it only returns a subcontract	// if the template has exactly one IIOP profile template and no	// other templates.  In this case, we simply delegate to	// getClientSubcontract( ObjectKeyTemplate ).	//	// Note that this is the place to insert a lookup for subcontracts	// for fault tolerance or client side load balancing.	if (temp.size() != 1)	    throw new INTERNAL( MinorCodes.SERVER_SC_TEMP_SIZE,		CompletionStatus.COMPLETED_NO ) ;	Iterator iter = temp.iteratorById( TAG_INTERNET_IOP.value ) ;	Object obj = iter.next() ;	if (!(obj instanceof IIOPProfileTemplate))	    throw new INTERNAL( MinorCodes.SERVER_SC_NO_IIOP_PROFILE,		CompletionStatus.COMPLETED_NO ) ;	IIOPProfileTemplate iptemp = (IIOPProfileTemplate)(obj) ;	return getClientSubcontract( iptemp.getObjectKeyTemplate() ) ;    }    public ClientSubcontract getClientSubcontract( ObjectKeyTemplate temp )    {	int scid = temp.getSubcontractId() ;	return getClientSubcontract( scid ) ;    }    public ClientSubcontract getClientSubcontract( int scid )    {	Class repClass = null ;	ClientSubcontract rep = null ;	if ((scid >= 0) && (scid < size))	    repClass = clientFactory[scid] ;	if (repClass == null) {	    scid = defaultId ;	    repClass = clientFactory[scid] ;	}	try {	    rep = (ClientSubcontract)(repClass.newInstance()) ;        } catch (Exception e1){	    // Serious error: could not create instance of class.	    // Should not happen.	    throw new INTERNAL( MinorCodes.NO_CLIENT_SC_CLASS,		CompletionStatus.COMPLETED_NO ) ;        }	rep.setId( scid ) ;	return rep ;    }}

⌨️ 快捷键说明

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