ior.java

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

JAVA
483
字号
/* * @(#)IOR.java	1.95 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. *//* * Licensed Materials - Property of IBM * RMI-IIOP v1.0 * Copyright IBM Corp. 1998 1999  All Rights Reserved * * US Government Users Restricted Rights - Use, duplication or * disclosure restricted by GSA ADP Schedule Contract with IBM Corp. */package com.sun.corba.se.internal.core;import java.io.StringWriter;import java.io.IOException;import java.util.Iterator ;import org.omg.CORBA.SystemException;import org.omg.CORBA.CompletionStatus;import org.omg.CORBA.INTERNAL;import org.omg.CORBA.INV_OBJREF;import org.omg.CORBA.DATA_CONVERSION;import org.omg.CORBA_2_3.portable.InputStream ;import org.omg.CORBA_2_3.portable.OutputStream ;import javax.rmi.CORBA.Util;import com.sun.corba.se.internal.orbutil.HexOutputStream;import com.sun.corba.se.internal.orbutil.MinorCodes;import com.sun.corba.se.internal.util.JDKBridge;import com.sun.corba.se.internal.core.GIOPVersion;import com.sun.corba.se.internal.core.StandardIIOPProfileTemplate;import com.sun.corba.se.internal.orbutil.ORBUtility;import com.sun.corba.se.internal.corba.EncapsInputStream;import com.sun.corba.se.internal.ior.JavaCodebaseComponent ;import com.sun.corba.se.internal.ior.CodeSetsComponent ;import com.sun.corba.se.internal.ior.ObjectKey ;import com.sun.corba.se.internal.ior.ObjectKeyFactory ;import com.sun.corba.se.internal.ior.ObjectKeyTemplate ;import com.sun.corba.se.internal.ior.POAObjectKeyTemplate ;import com.sun.corba.se.internal.ior.ObjectId ;import com.sun.corba.se.internal.ior.POAId ;import com.sun.corba.se.internal.ior.IIOPAddress ;import com.sun.corba.se.internal.ior.IIOPAddressImpl ;import com.sun.corba.se.internal.ior.IIOPProfileTemplate ;import com.sun.corba.se.internal.ior.IIOPProfile ;import com.sun.corba.se.internal.ior.IORTemplate ;import com.sun.corba.se.internal.ior.TaggedComponent ;import com.sun.corba.se.internal.ior.TaggedComponentFactoryFinder ;import com.sun.corba.se.internal.POA.POAORB ;import org.omg.IOP.TAG_JAVA_CODEBASE ;import org.omg.IOP.TAG_INTERNET_IOP ;public class IOR extends com.sun.corba.se.internal.ior.IOR{    public static final IOR NULL = new IOR();    protected ORB factory = null ;    // Cached lookups    protected IIOPProfile iop = null ;    protected String codebase = null ;    protected boolean cachedCodebase = false;    private byte[] objectId = null ;    private boolean lookedForPOAId = false ;    private POAId poaid = null ;    private boolean checkedIsLocal = false ;    private boolean cachedIsLocal = false ;    // initialize-on-demand holder    private static class LocalCodeBaseSingletonHolder {	public static JavaCodebaseComponent comp ;	static {	    String localCodebase = JDKBridge.getLocalCodebase() ;	    if (localCodebase == null)		comp = null ;	    else		comp = new JavaCodebaseComponent( localCodebase ) ;	}    }    private Object cookie ;    public synchronized Object getCookie()    {	return cookie ;    }    public synchronized void setCookie( Object cookie )     {	this.cookie = cookie ;    }    /*     * Only for the NULL instance.     */    private IOR() {	this( (ORB)null ) ;    }    public IOR( ORB factory) {	this( factory, "" ) ;    }    public IOR( ORB factory, String typeId )    {	super( typeId ) ;	this.factory = factory ;    }    public IOR( ORB factory, String typeId, IORTemplate template,	ObjectId id )    {	super( typeId, template, id ) ;	this.factory = factory ;    }    public IOR( ORB factory, String typeId,	String host, int port,	byte[] key ) throws SystemException    {	this( factory, typeId, host, port,            ObjectKeyFactory.get().create(factory, key)) ;    }    public IOR( ORB factory, String typeId,	String host, int port,	ObjectKey key ) throws SystemException    {	this( factory, typeId, host, port, key, null ) ;    }    public IOR( ORB factory, String typeId,	String host, int port,	ObjectKey okey, Object servant ) throws SystemException    {    	this(factory, typeId );	GIOPVersion version = factory.getGIOPVersion() ;	int major = version.getMajor() ;	int minor = version.getMinor() ;	init( host, port, major, minor, okey, servant ) ;    }    public IOR( ORB factory, String typeId,	String host, int port, int major, int minor,	ObjectKey okey, Object servant ) throws SystemException    {    	this(factory, typeId );	init( host, port, major, minor, okey, servant ) ;    }    private void init( String host, int port, int major, int minor,	ObjectKey okey, Object servant )    {	ObjectKeyTemplate ktemp = okey.getTemplate() ;	ObjectId id = okey.getId() ;	IIOPAddress addr = new IIOPAddressImpl( host, port ) ;	IIOPProfileTemplate ptemp = new StandardIIOPProfileTemplate(	    addr, major, minor, ktemp, servant, factory ) ;	IIOPProfile profile = new IIOPProfile( id, ptemp ) ;	add( profile ) ;	makeImmutable() ;    }    /** This constructor is added to create IOR's from the URL based     *  names for the INS. The constructor is same as others except for the     *  Object key which will be a String instead of octets. There will be no     *  conversion of the String to Hexadecimal Bytes.     */    public IOR( ORB factory, String typeId,	String host, int port, int major, int minor,	String asciiBasedKey, Object servant ) throws SystemException    {    	this(factory, typeId, host, port, major, minor,	    ObjectKeyFactory.get().create( factory, asciiBasedKey.getBytes() ),	    servant );    }    private static final int NIBBLES_PER_BYTE = 2 ;    private static final int UN_SHIFT = 4 ; // "UPPER NIBBLE" shift factor for <<    /** This static method takes a Stringified IOR and converts it into IOR object.      * It is the caller's responsibility to only pass strings that start with "IOR:".      */    public static org.omg.CORBA.Object getIORFromString(ORB factory,	String str )    {	// Length must be even for str to be valid	if ( (str.length() & 1) == 1 )	    throw new org.omg.CORBA.DATA_CONVERSION(		MinorCodes.BAD_STRINGIFIED_IOR_LEN,		CompletionStatus.COMPLETED_NO ) ;	byte[] buf = new byte[(str.length() - PREFIX_LENGTH) / NIBBLES_PER_BYTE];	for (int i=PREFIX_LENGTH, j=0; i < str.length(); i +=NIBBLES_PER_BYTE, j++) {	     buf[j] = (byte)((ORBUtility.hexOf(str.charAt(i)) << UN_SHIFT) & 0xF0);	     buf[j] |= (byte)(ORBUtility.hexOf(str.charAt(i+1)) & 0x0F);	}	EncapsInputStream s = new EncapsInputStream(factory, buf, buf.length);	s.consumeEndian();	return s.read_Object() ;    }    public IOR(InputStream s)    {	super( s ) ;	this.factory = (ORB)(s.orb()) ;        cachedCodebase = false;        if (!is_nil()) {            // If there is no codebase in this IOR and there IS a            // java.rmi.server.codebase property set, we need to            // update the IOR with the local codebase.  Note that	    // there is only one instance of the local codebase, but it	    // can be safely shared in multiple IORs since it is immutable.	    if (uncachedGetCodeBase() == null) {		JavaCodebaseComponent jcc = LocalCodeBaseSingletonHolder.comp ;		if (jcc != null) {		    IIOPProfileTemplate temp = getProfile().getTemplate() ;		    temp.add( jcc ) ;                    codebase = jcc.getURLs() ;                    cachedCodebase = true;                }            }        }	makeImmutable() ;    }    private String uncachedGetCodeBase() {	Iterator iter = getProfile().getTemplate().iteratorById(	    TAG_JAVA_CODEBASE.value ) ;	if (iter.hasNext()) {	    JavaCodebaseComponent jcbc = (JavaCodebaseComponent)(iter.next()) ;	    return jcbc.getURLs() ;	}	return null ;    }    public synchronized String getCodebase() {	if (!cachedCodebase) {	    cachedCodebase = true ;	    codebase = uncachedGetCodeBase() ;	}	return codebase ;    }    /** Get the IIOP Profile from this IOR.  We are assuming that there    * can be only one at present.   If more than one IIOP profile is    * present, we will throw an exception here.    */    public IIOPProfile getProfile()    {	if (iop == null) {	    Iterator iter = iteratorById( TAG_INTERNET_IOP.value ) ;	    if (iter.hasNext())		iop = (IIOPProfile)(iter.next()) ;// If there are multiple profile we always return the first one.//	    if (iter.hasNext())//		throw new INTERNAL( MinorCodes.MULT_IIOP_PROF_NOT_SUPPORTED,//		    CompletionStatus.COMPLETED_NO ) ;	}	if (iop != null)	    return iop ;        // if we come to this point then no IIOP Profile        // is present.  Therefore, throw an INV_OBJREF exception.        throw new INV_OBJREF( MinorCodes.NO_PROFILE_PRESENT,			      CompletionStatus.COMPLETED_NO );    }    public synchronized byte[] getObjectId()    {	if (objectId == null) {	    IIOPProfile prof = getProfile() ;	    ObjectId oid = prof.getObjectId() ;	    objectId = oid.getId() ;	}	return objectId ;    }        public synchronized POAId getPOAId()     {	if (!lookedForPOAId) {	    lookedForPOAId = true ;	    IIOPProfile prof = getProfile() ;	    ObjectKeyTemplate oktemp = 		prof.getTemplate().getObjectKeyTemplate() ;	    if (oktemp instanceof POAObjectKeyTemplate) {		POAObjectKeyTemplate poktemp = (POAObjectKeyTemplate)oktemp ;		poaid = poktemp.getPOAId() ;	    }	}	return poaid ;    }    /**     * @return the ORBVersion associated with the object key in the IOR.     */    public ORBVersion getORBVersion() {        return this.getProfile().getTemplate().            getObjectKeyTemplate().getORBVersion();    }    public String stringify()    {        return stringify(factory);    }    public boolean is_nil()    {        //        // The check for typeId length of 0 below is commented out        // as a workaround for a bug in ORBs which send a        // null objref with a non-empty typeId string.        //	return ((size() == 0) /* && (typeId.length() == 0) */);    }    public boolean isEquivalent(IOR ior)    {	return getProfile().isEquivalent(ior.getProfile());    }    public synchronized boolean isLocal()    {	if (factory == null)	    return false ;	if (!checkedIsLocal) {	    checkedIsLocal = true ;	    IIOPProfile iop = getProfile() ;	    IIOPProfileTemplate ptemp = iop.getTemplate() ;	    String host = ptemp.getPrimaryAddress().getHost() ;	    ObjectKeyTemplate ktemp = ptemp.getObjectKeyTemplate() ;	    cachedIsLocal = factory.isLocalHost( host ) && factory.isLocalServerId(		ktemp.getSubcontractId(), ktemp.getServerId() ) && 		factory.isLocalServerPort( ptemp.getPrimaryAddress().getPort( ) );	}	return cachedIsLocal ;    }    /**     * (Compute and) Return GIOPVersion for this IOR     * Requests created against this IOR will be of the     * return Version.     */    public synchronized GIOPVersion getGIOPVersion(){        if (this.giopVersion != null) {            return this.giopVersion;        }        byte major = getProfile().getTemplate().getMajorVersion();        byte minor = getProfile().getTemplate().getMinorVersion();        this.giopVersion = GIOPVersion.getInstance(major, minor);        //REVISIT: Should we be cloning here before a return?        return this.giopVersion;    }    private GIOPVersion giopVersion = null;    public ServerSubcontract getServerSubcontract()    {	ObjectKeyTemplate temp = getProfile().getTemplate().getObjectKeyTemplate() ;	int scid = temp.getSubcontractId() ;	ServerSubcontract sc = factory.getSubcontractRegistry().getServerSubcontract( scid ) ;	return sc ;    }    public com.sun.corba.se.internal.core.IOR addComponent(	org.omg.IOP.TaggedComponent component    )    {	// Get information from IOR	String typeId = getTypeId() ;	IIOPProfile iop = getProfile() ;	// Get Information from IIOPProfile	ObjectId oid = iop.getObjectId() ;	IIOPProfileTemplate ptemp = iop.getTemplate() ;	// Get Information from IIOPProfileTemplate	byte major = ptemp.getMajorVersion() ;	byte minor = ptemp.getMinorVersion() ;	IIOPAddress addr = ptemp.getPrimaryAddress() ;	ObjectKeyTemplate oktemp = ptemp.getObjectKeyTemplate() ;	// Create new IIOPProfileTemplate	IIOPProfileTemplate ptempResult = new IIOPProfileTemplate(	    major, minor, addr, oktemp ) ;	// Add tagged components from old IIOPProfileTemplate to the new one	Iterator iter = ptemp.iterator() ;	while (iter.hasNext()) {	    Object obj = iter.next() ;	    ptempResult.add( obj ) ;	}	// Convert component to ior.TaggedComponent and add to the new	// profile	TaggedComponent comp = TaggedComponentFactoryFinder.getFinder().	    create( factory, component ) ;	ptempResult.add( comp ) ;	// Create new IIOPProfile	IIOPProfile iopResult = new IIOPProfile( oid, ptempResult ) ;	// Create new IOR	IOR result = new IOR( factory, typeId ) ;	result.add( iopResult ) ;	result.makeImmutable() ;	return result ;    }    public void dump( )    {	IIOPProfile prof = getProfile() ;	IIOPProfileTemplate ptemp = prof.getTemplate() ;	ObjectId oid = prof.getObjectId() ;	ObjectKeyTemplate oktemp = ptemp.getObjectKeyTemplate() ;	System.out.println( "Contents of IOR:" ) ;	System.out.println( "\tTypeId = " + getTypeId() ) ;	System.out.println( "\tIIOPProfileTemplate = " ) ;	System.out.println( "\t\tmajor version = " + ptemp.getMajorVersion() ) ;	System.out.println( "\t\tminor version = " + ptemp.getMinorVersion() ) ;	System.out.println( "\t\thost name = " + ptemp.getPrimaryAddress().getHost() ) ;	System.out.println( "\t\tport number = " + ptemp.getPrimaryAddress().getPort() ) ;	System.out.println( "\t\tObject Key Template:" ) ;	System.out.println( "\t\t\tSubcontract id = " + oktemp.getSubcontractId() ) ;	System.out.println( "\t\t\tServer id = " + oktemp.getServerId() ) ;    }    public boolean isTransactional()    {	IIOPProfile prof = getProfile() ;	IIOPProfileTemplate ptemp = prof.getTemplate() ;	ObjectKeyTemplate oktemp = ptemp.getObjectKeyTemplate() ;	int scid = oktemp.getSubcontractId() ;	boolean result = ((scid & 1) == 1) ;	if (factory != null)	    if (((POAORB)factory).subcontractDebugFlag)		System.out.println( "core.IOR.isTransactional returns " +		result ) ;	return result ;    }}

⌨️ 快捷键说明

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