/*
* AdaptorListener.java
*
* Created on 24 de Outubro de 2003, 10:10
*/
package org.jacorb.orb.miop;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.jacorb.config.Configuration;
import org.jacorb.config.ConfigurationException;
import org.omg.CORBA.BAD_INV_ORDER;
import org.omg.CORBA.NO_IMPLEMENT;
import org.omg.ETF.Connection;
import org.omg.GIOP.Version;
/**
* This ORB group MIOP listener. Manages the server connections listening to the
* groups multicast sockets.
*
* @author Alysson Neves Bessani
* @version 1.0
* @see MIOPFactories ServerMIOPConnection
*/
public class MIOPListener extends org.jacorb.orb.etf.ListenerBase
{
/**
* The table with active connections
*/
private Map<Short, Connection> connections = new HashMap<Short, Connection> ();
/**
* Configure this object.
*
* @param configuration the object configuration
* @throws ConfigurationException if any problem with the configuration is
* detected
*/
public void configure (Configuration configuration) throws ConfigurationException
{
super.configure (configuration);
profile = new MIOPProfile ("225.0.0.1", (short)10925, "default", 1, new Version ((byte)1,
(byte)0), 1, null);
}
/**
* Destroy this listener.
*/
public void destroy ()
{
for (Iterator<Short> i = connections.keySet ().iterator (); i.hasNext ();)
{
removeGroupConnection (i.next ());
}
super.destroy ();
}
/**
* Wait for a upcoming connection.
*
* @return the new server connection
*/
public Connection accept ()
{
if (up != null)
{
throw new BAD_INV_ORDER ("Must not call accept() when a Handle has been set");
}
else
{
Connection result = super.accept ();
if (result != null)
{
MIOPProfile profile = (MIOPProfile)result.get_server_profile ();
connections.put (Short.valueOf (profile.getUIPMCProfile ().the_port), result);
}
return result;
}
}
/**
* Not implemented.
*
* @param connection
*/
public void completed_data (Connection connection)
{
throw new NO_IMPLEMENT ();
}
/**
* Create a connection to a specified group.
*
* @param profile the group miop profile.
*/
public void addGroupConnection (MIOPProfile profile)
{
ServerMIOPConnection c = new ServerMIOPConnection ();
try
{
c.configure (configuration);
}
catch (ConfigurationException ce)
{
throw new org.omg.CORBA.INTERNAL ("ConfigurationException: " + ce.toString ());
}
c.connect (profile, 0);
deliverConnection (c);
}
/**
* Destroy a group connection.
*
* @param port the group port number.
*/
public void removeGroupConnection (short port)
{
ServerMIOPConnection c = (ServerMIOPConnection)connections.remove (new Short (port));
if (c != null)
{
c.close ();
}
}
/**
* Tests if this port is used for some group.
*
* @param port the port number.
* @return boolean
*/
public boolean haveGroupConnection (short port)
{
return connections.containsKey (new Short (port));
}
}