📄 iiopprofileimpl.java
字号:
/* * @(#)IIOPProfileImpl.java 1.33 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.ior.iiop;import java.util.List ;import java.util.Iterator ;import org.omg.CORBA.SystemException ;import org.omg.CORBA_2_3.portable.OutputStream ;import org.omg.CORBA_2_3.portable.InputStream ;import org.omg.IOP.TAG_ALTERNATE_IIOP_ADDRESS ;import org.omg.IOP.TAG_INTERNET_IOP;import org.omg.IOP.TAG_JAVA_CODEBASE;import com.sun.corba.se.spi.protocol.RequestDispatcherRegistry ;import com.sun.corba.se.spi.oa.ObjectAdapter ;import com.sun.corba.se.spi.oa.ObjectAdapterFactory ;import com.sun.corba.se.spi.ior.ObjectId ;import com.sun.corba.se.spi.ior.ObjectAdapterId ;import com.sun.corba.se.spi.ior.TaggedProfile ;import com.sun.corba.se.spi.ior.TaggedProfileTemplate ;import com.sun.corba.se.spi.ior.ObjectKey ;import com.sun.corba.se.spi.ior.ObjectKeyTemplate ;import com.sun.corba.se.spi.ior.TaggedComponent ;import com.sun.corba.se.spi.ior.IdentifiableBase ;import com.sun.corba.se.spi.ior.IORFactories ;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.IIOPProfile ;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.ior.iiop.JavaCodebaseComponent ;import com.sun.corba.se.spi.orb.ORB ;import com.sun.corba.se.spi.orb.ORBVersion ;import com.sun.corba.se.spi.logging.CORBALogDomains ;import com.sun.corba.se.impl.ior.EncapsulationUtility ;import com.sun.corba.se.impl.encoding.EncapsInputStream ;import com.sun.corba.se.impl.encoding.EncapsOutputStream ;import com.sun.corba.se.impl.util.JDKBridge;import com.sun.corba.se.impl.logging.IORSystemException;/** * @author */public class IIOPProfileImpl extends IdentifiableBase implements IIOPProfile{ private ORB orb ; private IORSystemException wrapper ; private ObjectId oid; private IIOPProfileTemplate proftemp; private ObjectKeyTemplate oktemp ; // Cached lookups protected String codebase = null ; protected boolean cachedCodebase = false; 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 = IIOPFactories.makeJavaCodebaseComponent( localCodebase ) ; } } private GIOPVersion giopVersion = null; public boolean equals( Object obj ) { if (!(obj instanceof IIOPProfileImpl)) return false ; IIOPProfileImpl other = (IIOPProfileImpl)obj ; return oid.equals( other.oid ) && proftemp.equals( other.proftemp ) && oktemp.equals( other.oktemp ) ; } public int hashCode() { return oid.hashCode() ^ proftemp.hashCode() ^ oktemp.hashCode() ; } public ObjectId getObjectId() { return oid ; } public TaggedProfileTemplate getTaggedProfileTemplate() { return proftemp ; } public ObjectKeyTemplate getObjectKeyTemplate() { return oktemp ; } private IIOPProfileImpl( ORB orb ) { this.orb = orb ; wrapper = IORSystemException.get( orb, CORBALogDomains.OA_IOR ) ; } public IIOPProfileImpl( ORB orb, ObjectKeyTemplate oktemp, ObjectId oid, IIOPProfileTemplate proftemp ) { this( orb ) ; this.oktemp = oktemp ; this.oid = oid ; this.proftemp = proftemp ; } public IIOPProfileImpl( InputStream is ) { this( (ORB)(is.orb()) ) ; init( is ) ; } public IIOPProfileImpl( ORB orb, org.omg.IOP.TaggedProfile profile) { this( orb ) ; if (profile == null || profile.tag != TAG_INTERNET_IOP.value || profile.profile_data == null) { throw wrapper.invalidTaggedProfile() ; } EncapsInputStream istr = new EncapsInputStream((ORB)orb, profile.profile_data, profile.profile_data.length); istr.consumeEndian(); init( istr ) ; } private void init( InputStream istr ) { // First, read all of the IIOP IOR data GIOPVersion version = new GIOPVersion() ; version.read( istr ) ; IIOPAddress primary = new IIOPAddressImpl( istr ) ; byte[] key = EncapsulationUtility.readOctets( istr ) ; ObjectKey okey = orb.getObjectKeyFactory().create( key ) ; oktemp = okey.getTemplate() ; oid = okey.getId() ; proftemp = IIOPFactories.makeIIOPProfileTemplate( orb, version, primary ) ; // Handle any tagged components (if applicable) if (version.getMinor() > 0) EncapsulationUtility.readIdentifiableSequence( proftemp, orb.getTaggedComponentFactoryFinder(), istr ) ; // 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) { if (version.getMinor() > 0) proftemp.add( jcc ) ; codebase = jcc.getURLs() ; } // Whether codebase is null or not, we have it, // and so getCodebase ned never call uncachedGetCodebase. cachedCodebase = true; } } public void writeContents(OutputStream os) { proftemp.write( oktemp, oid, os ) ; } public int getId() { return proftemp.getId() ; } public boolean isEquivalent( TaggedProfile prof ) { if (!(prof instanceof IIOPProfile)) return false ; IIOPProfile other = (IIOPProfile)prof ; return oid.equals( other.getObjectId() ) && proftemp.isEquivalent( other.getTaggedProfileTemplate() ) && oktemp.equals( other.getObjectKeyTemplate() ) ; } public ObjectKey getObjectKey() { ObjectKey result = IORFactories.makeObjectKey( oktemp, oid ) ; return result ; } public org.omg.IOP.TaggedProfile getIOPProfile() { EncapsOutputStream os = new EncapsOutputStream( orb ) ; os.write_long( getId() ) ; write( os ) ; InputStream is = (InputStream)(os.create_input_stream()) ; return org.omg.IOP.TaggedProfileHelper.read( is ) ; } private String uncachedGetCodeBase() { Iterator iter = proftemp.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 ; } /** * @return the ORBVersion associated with the object key in the IOR. */ public ORBVersion getORBVersion() { return oktemp.getORBVersion(); } public synchronized boolean isLocal() { if (!checkedIsLocal) { checkedIsLocal = true ; String host = proftemp.getPrimaryAddress().getHost() ; cachedIsLocal = orb.isLocalHost(host) && orb.isLocalServerId(oktemp.getSubcontractId(), oktemp.getServerId()) && orb.getLegacyServerSocketManager() .legacyIsLocalServerPort( proftemp.getPrimaryAddress().getPort()); } return cachedIsLocal ; } /** Return the servant for this IOR, if it is local AND if the OA that * implements this objref supports direct access to servants outside of an * invocation. * XXX revisit: do we want this at all? If we do, it might move to the * ObjectKeyTemplate instead. */ public java.lang.Object getServant() { if (!isLocal()) return null ; RequestDispatcherRegistry scr = orb.getRequestDispatcherRegistry() ; ObjectAdapterFactory oaf = scr.getObjectAdapterFactory( oktemp.getSubcontractId() ) ; ObjectAdapterId oaid = oktemp.getObjectAdapterId() ; ObjectAdapter oa = null ; try { oa = oaf.find( oaid ) ; } catch (SystemException exc) { // Could not find the OA, so just return null. // This usually happens when POAs are being deleted, // and the POA always return null for getLocalServant anyway. wrapper.getLocalServantFailure( exc, oaid.toString() ) ; return null ; } byte[] boid = oid.getId() ; java.lang.Object servant = oa.getLocalServant( boid ) ; return servant ; } /** * Return GIOPVersion for this IOR. * Requests created against this IOR will be of the * return Version. */ public synchronized GIOPVersion getGIOPVersion() { return proftemp.getGIOPVersion() ; } public void makeImmutable() { proftemp.makeImmutable() ; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -