/*
* JacORB - a free Java ORB
*
* Copyright (C) 1997-2014 Gerald Brose / The JacORB Team.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.jacorb.orb.giop;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.jacorb.config.Configurable;
import org.jacorb.config.Configuration;
import org.jacorb.config.ConfigurationException;
import org.jacorb.util.ObjectUtil;
import org.slf4j.Logger;
/**
* @author Nicolas Noffke
*/
public class GIOPConnectionManager
implements Configurable
{
/** the configuration object */
private org.jacorb.config.Configuration configuration = null;
/** configuration properties */
private Logger logger = null;
//private List client_giop_connections = null;
private final List server_giop_connections;
private int max_server_giop_connections = 0;
private Class statistics_provider_class = null;
private SelectionStrategy selection_strategy = null;
private int wait_for_idle_interval = 0;
public GIOPConnectionManager()
{
server_giop_connections = new LinkedList();
}
/**
* configures the GIOPConnectionManager
*/
public void configure(Configuration myConfiguration)
throws ConfigurationException
{
this.configuration = (org.jacorb.config.Configuration)myConfiguration;
logger =
configuration.getLogger("org.jacorb.orb.giop.conn");
max_server_giop_connections =
configuration.getAttributeAsInteger("jacorb.connection.max_server_connections",
Integer.MAX_VALUE );
selection_strategy = (SelectionStrategy)
configuration.getAttributeAsObject(
"jacorb.connection.selection_strategy_class" );
wait_for_idle_interval =
configuration.getAttributeAsInteger(
"jacorb.connection.wait_for_idle_interval", 500 );
String statProviderClass = configuration.getAttribute ("jacorb.connection.statistics_provider_class", "");
if (statProviderClass.length () > 0)
{
try
{
statistics_provider_class = ObjectUtil.classForName (statProviderClass);
}
catch( Exception e )
{
if (logger.isErrorEnabled())
{
logger.error( "Unable to create statistics_provider_class from property >" + statProviderClass + "<: " + e.toString() );
}
}
}
}
public ServerGIOPConnection createServerGIOPConnection(org.omg.ETF.Profile profile,
org.omg.ETF.Connection transport,
RequestListener request_listener,
ReplyListener reply_listener )
{
//if too many open connections, shut one down
if( server_giop_connections.size() >= max_server_giop_connections )
{
if (selection_strategy == null)
{
//reject new connections
if (logger.isWarnEnabled())
{
logger.warn( "Number of max server giop connections reached and no SelectionStrategy present - Rejecting new connection" );
}
return null;
}
else
{
while( server_giop_connections.size() >= max_server_giop_connections )
{
ServerGIOPConnection to_close = null;
synchronized( server_giop_connections )
{
to_close =
selection_strategy.selectForClose( server_giop_connections );
}
if( to_close != null &&
to_close.tryClose() )
{
break;
}
try
{
Thread.sleep( wait_for_idle_interval );
}
catch( InterruptedException e )
{
// ignored
}
}
}
}
ServerGIOPConnection connection =
new ServerGIOPConnection( profile,
transport,
request_listener,
reply_listener,
getStatisticsProvider(),
this);
try
{
connection.configure( configuration );
}
catch( ConfigurationException ce )
{
logger.warn("ConfigurationException", ce);
}
synchronized( server_giop_connections )
{
server_giop_connections.add( connection );
}
if (logger.isDebugEnabled())
{
logger.debug ("GIOPConnectionManager: created new " + connection.toString());
}
return connection;
}
public void unregisterServerGIOPConnection(
ServerGIOPConnection connection )
{
synchronized( server_giop_connections )
{
server_giop_connections.remove( connection );
}
}
public GIOPConnection createClientGIOPConnection(
org.omg.ETF.Profile profile,
org.omg.ETF.Connection transport,
RequestListener request_listener,
ReplyListener reply_listener )
{
ClientGIOPConnection connection =
new ClientGIOPConnection( profile,
transport,
request_listener,
reply_listener,
null );
try
{
connection.configure( configuration );
}
catch( ConfigurationException ce )
{
logger.warn("ConfigurationException", ce);
}
return connection;
}
/**
* Closes all server-side GIOP connections.
*/
public void shutdown()
{
List connections = null;
synchronized (server_giop_connections)
{
connections = new ArrayList (server_giop_connections);
}
if (logger.isDebugEnabled())
{
logger.debug ("GIOPConnectionManager.shutdown(), " +
connections.size() + " connections");
}
for (Iterator i=connections.iterator(); i.hasNext();)
{
ServerGIOPConnection connection = (ServerGIOPConnection)i.next();
connection.tryClose();
}
}
private StatisticsProvider getStatisticsProvider()
{
StatisticsProvider result = null;
if( statistics_provider_class != null )
{
try
{
result = (StatisticsProvider)
statistics_provider_class.newInstance();
}
catch( Exception e )
{
if (logger.isErrorEnabled())
{
logger.error( "Unable to create instance from Class >" +
statistics_provider_class + '<');
}
}
}
return result;
}
}// GIOPConnectionManager