/*
* @(#)IIOPProfileImpl.java 1.32 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.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() ;
}
}
|