/*
* @(#)CorbaTransportManagerImpl.java 1.13 03/12/19
*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.sun.corba.se.impl.transport;
import java.net.ServerSocket;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.omg.CORBA.INITIALIZE;
import org.omg.CORBA.INTERNAL;
import org.omg.CORBA.CompletionStatus;
import com.sun.corba.se.pept.transport.Acceptor;
import com.sun.corba.se.pept.transport.ByteBufferPool;
import com.sun.corba.se.pept.transport.ContactInfo;
import com.sun.corba.se.pept.transport.InboundConnectionCache;
import com.sun.corba.se.pept.transport.OutboundConnectionCache;
import com.sun.corba.se.pept.transport.Selector;
import com.sun.corba.se.spi.ior.IORTemplate;
import com.sun.corba.se.spi.ior.ObjectAdapterId;
import com.sun.corba.se.spi.orb.ORB;
import com.sun.corba.se.spi.transport.CorbaAcceptor;
import com.sun.corba.se.spi.transport.CorbaTransportManager;
// REVISIT - impl/poa specific:
import com.sun.corba.se.impl.oa.poa.Policies;
import com.sun.corba.se.impl.orbutil.ORBUtility;
/**
* @author Harold Carr
*/
public class CorbaTransportManagerImpl
implements
CorbaTransportManager
{
protected ORB orb;
protected List acceptors;
protected Map outboundConnectionCaches;
protected Map inboundConnectionCaches;
protected Selector selector;
public CorbaTransportManagerImpl(ORB orb)
{
this.orb = orb;
acceptors = new ArrayList();
outboundConnectionCaches = new HashMap();
inboundConnectionCaches = new HashMap();
selector = new SelectorImpl(orb);
}
////////////////////////////////////////////////////
//
// pept TransportManager
//
public ByteBufferPool getByteBufferPool(int id)
{
throw new RuntimeException();
}
public OutboundConnectionCache getOutboundConnectionCache(
ContactInfo contactInfo)
{
synchronized (contactInfo) {
if (contactInfo.getConnectionCache() == null) {
OutboundConnectionCache connectionCache = null;
synchronized (outboundConnectionCaches) {
connectionCache = (OutboundConnectionCache)
outboundConnectionCaches.get(
contactInfo.getConnectionCacheType());
if (connectionCache == null) {
// REVISIT: Would like to be able to configure
// the connection cache type used.
connectionCache =
new CorbaOutboundConnectionCacheImpl(orb,
contactInfo);
outboundConnectionCaches.put(
contactInfo.getConnectionCacheType(),
connectionCache);
}
}
contactInfo.setConnectionCache(connectionCache);
}
return contactInfo.getConnectionCache();
}
}
public Collection getOutboundConnectionCaches()
{
return outboundConnectionCaches.values();
}
public InboundConnectionCache getInboundConnectionCache(
Acceptor acceptor)
{
synchronized (acceptor) {
if (acceptor.getConnectionCache() == null) {
InboundConnectionCache connectionCache = null;
synchronized (inboundConnectionCaches) {
connectionCache = (InboundConnectionCache)
inboundConnectionCaches.get(
acceptor.getConnectionCacheType());
if (connectionCache == null) {
// REVISIT: Would like to be able to configure
// the connection cache type used.
connectionCache =
new CorbaInboundConnectionCacheImpl(orb,
acceptor);
inboundConnectionCaches.put(
acceptor.getConnectionCacheType(),
connectionCache);
}
}
acceptor.setConnectionCache(connectionCache);
}
return acceptor.getConnectionCache();
}
}
public Collection getInboundConnectionCaches()
{
return inboundConnectionCaches.values();
}
public Selector getSelector(int id)
{
return selector;
}
public synchronized void registerAcceptor(Acceptor acceptor)
{
if (orb.transportDebugFlag) {
dprint(".registerAcceptor->: " + acceptor);
}
acceptors.add(acceptor);
if (orb.transportDebugFlag) {
dprint(".registerAcceptor<-: " + acceptor);
}
}
public Collection getAcceptors()
{
return getAcceptors(null, null);
}
public synchronized void unregisterAcceptor(Acceptor acceptor)
{
acceptors.remove(acceptor);
}
public void close()
{
try {
if (orb.transportDebugFlag) {
dprint(".close->");
}
getSelector(0).close();
} finally {
if (orb.transportDebugFlag) {
dprint(".close<-");
}
}
}
////////////////////////////////////////////////////
//
// CorbaTransportManager
//
public Collection getAcceptors(String objectAdapterManagerId,
ObjectAdapterId objectAdapterId)
{
// REVISIT - need to filter based on arguments.
// REVISIT - initialization will be moved to OA.
// Lazy initialization of acceptors.
Iterator iterator = acceptors.iterator();
while (iterator.hasNext()) {
Acceptor acceptor = (Acceptor) iterator.next();
if (acceptor.initialize()) {
if (acceptor.shouldRegisterAcceptEvent()) {
orb.getTransportManager().getSelector(0)
.registerForEvent(acceptor.getEventHandler());
}
}
}
return acceptors;
}
// REVISIT - POA specific policies
public void addToIORTemplate(IORTemplate iorTemplate,
Policies policies,
String codebase,
String objectAdapterManagerId,
ObjectAdapterId objectAdapterId)
{
Iterator iterator =
getAcceptors(objectAdapterManagerId, objectAdapterId).iterator();
while (iterator.hasNext()) {
CorbaAcceptor acceptor = (CorbaAcceptor) iterator.next();
acceptor.addToIORTemplate(iorTemplate, policies, codebase);
}
}
////////////////////////////////////////////////////
//
// implemenation
//
protected void dprint(String msg)
{
ORBUtility.dprint("CorbaTransportManagerImpl", msg);
}
}
// End of file.
|