package org.jacorb.imr;
/*
* 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.
*/
import java.io.Serializable;
import java.util.Enumeration;
import java.util.Hashtable;
import org.jacorb.imr.AdminPackage.DuplicateServerName;
/**
* This class represents the server table of the implementation repository.
* It contains all servers, POAs and hosts, and is serialized on shutdown,
* deserialized on startup.
* <br> It provides methods for adding, deleting and listing servers,
* POAs and hosts.
*
* @author Nicolas Noffke
*
*/
public class ServerTable
implements Serializable
{
private Hashtable servers;
private transient ResourceLock servers_lock;
private Hashtable poas;
private transient ResourceLock poas_lock;
private Hashtable hosts;
private transient ResourceLock hosts_lock;
public transient ResourceLock table_lock;
public ServerTable()
{
servers = new Hashtable();
poas = new Hashtable();
hosts = new Hashtable();
initTransient();
}
/**
* This method initializes all transient attributes.
*/
private void initTransient()
{
// The table lock is a special case. It is used to gain
// exclusive access to the server table on serialization. That
// means the exclusive lock is set on serialization and, if it
// was not transient, would be serialized as well. On startup
// of the repository, if the table is deserialized, the lock
// is still set, und must be realeased. That means that we
// have to distinguish between a new table and a deserialized
// one. So its cheaper to instanciate the lock on
// deserialization time again.
table_lock = new ResourceLock();
// The locks are needed, because the hashtables have to be
// copied to arrays sometimes (usually on command of the
// user), and that is done via Enumerations. Unfortunately
// Enumerations get messed up when altering the underlying
// structure while reading from them.
servers_lock = new ResourceLock();
poas_lock = new ResourceLock();
hosts_lock = new ResourceLock();
}
/**
* This method tests, if a server is known.
*
* @param name the servers name.
* @return true, if a server with the specified name has already
* been registered.
*/
public boolean hasServer( String name )
{
return servers.containsKey(name);
}
/**
* This method gets a server for a specified name.
*
* @param name the servers name.
* @return ImRServerInfo the ImRServerInfo object with name <code>name</code>.
* @exception UnknownServerName thrown if the table does not contain
* an entry for <code>name</code>.
*/
public ImRServerInfo getServer(String name)
throws UnknownServerName
{
ImRServerInfo _tmp = (ImRServerInfo) servers.get(name);
if (_tmp == null)
throw new UnknownServerName(name);
return _tmp;
}
/**
* Adds a server to the server table.
*
* @param name the servers name.
* @param server the servers corresponding ImRServerInfo object.
* @exception DuplicateServerName thrown if <code>name</code> is already
* in the table.
*/
public void putServer(String name, ImRServerInfo server)
throws DuplicateServerName
{
if (servers.containsKey(name))
throw new DuplicateServerName(name);
table_lock.gainSharedLock();
servers_lock.gainSharedLock();
servers.put(name, server);
servers_lock.releaseSharedLock();
table_lock.releaseSharedLock();
}
/**
* Remove a server from the server table.
*
* @param name the servers name.
* @exception UnknownServerName thrown if no server with <code>name</code>
* is found in the table.
*/
public void removeServer(String name)
throws UnknownServerName
{
table_lock.gainSharedLock();
servers_lock.gainSharedLock();
Object _obj = servers.remove(name);
servers_lock.releaseSharedLock();
table_lock.releaseSharedLock();
if (_obj == null)
throw new UnknownServerName(name);
}
public boolean poa_enp_reused (String name, String host, int port)
{
POAInfo[] poas = getPOAs();
for (int i = 0; i < poas.length; i++)
{
if (poas[i].name.equals (name))
continue;
if (poas[i].host.equals (host) && poas[i].port == port && poas[i].active == true)
return true;
}
return false;
}
/**
* Get the ImRPOAInfo object of a POA.
*
* @param name the POAs name.
* @return the ImRPOAInfo object for <code>name</code>,
* null if <code>name</code> not in the table.
*/
public ImRPOAInfo getPOA (String name)
{
return (ImRPOAInfo) poas.get(name);
}
/**
* Add a POA to the server table.
*
* @param name the POAs name.
* @param poa the POAs ImRPOAInfo object.
*/
public void putPOA(String name, ImRPOAInfo poa)
{
table_lock.gainSharedLock();
poas_lock.gainSharedLock();
poas.put(name, poa);
poas_lock.releaseSharedLock();
table_lock.releaseSharedLock();
}
/**
* Remove a POA from the server table.
*
* @param name the POAs name.
*/
public void removePOA(String name)
{
table_lock.gainSharedLock();
poas_lock.gainSharedLock();
poas.remove(name);
poas_lock.releaseSharedLock();
table_lock.releaseSharedLock();
}
/**
* List all servers in the table.
*
* @return a ServerInfo array containing all servers.
* Used by the CORBA interface of the repository.
*/
public ServerInfo[] getServers()
{
table_lock.gainSharedLock();
servers_lock.gainExclusiveLock();
//build array
ServerInfo[] _servers = new ServerInfo[servers.size()];
Enumeration _server_enum = servers.elements();
//copy elements from vector to array
int _i = 0;
while (_server_enum.hasMoreElements())
_servers[_i++] = ((ImRServerInfo) _server_enum.nextElement()).toServerInfo();
servers_lock.releaseExclusiveLock();
table_lock.releaseSharedLock();
return _servers;
}
/**
* List all hosts in the table.
*
* @return a HostInfo array containing all hosts.
* Used by the CORBA interface of the repository.
*/
public HostInfo[] getHosts()
{
table_lock.gainSharedLock();
hosts_lock.gainExclusiveLock();
//build array
HostInfo[] _hosts = new HostInfo[hosts.size()];
Enumeration _host_enum = hosts.elements();
//copy elements from vector to array
int _i = 0;
while (_host_enum.hasMoreElements())
_hosts[_i++] = ((ImRHostInfo) _host_enum.nextElement()).toHostInfo();
hosts_lock.releaseExclusiveLock();
table_lock.releaseSharedLock();
return _hosts;
}
/**
* List all POAs in the table.
*
* @return a POAInfo array containing all POAs.
* Used by the CORBA interface of the repository.
*/
public POAInfo[] getPOAs()
{
table_lock.gainSharedLock();
poas_lock.gainExclusiveLock();
//build array
POAInfo[] _poas = new POAInfo[poas.size()];
Enumeration _poa_enum = poas.elements();
//copy elements from vector to array
int _i = 0;
while (_poa_enum.hasMoreElements())
_poas[_i++] = ((ImRPOAInfo) _poa_enum.nextElement()).toPOAInfo();
poas_lock.releaseExclusiveLock();
table_lock.releaseSharedLock();
return _poas;
}
/**
* Add a host to the table. If an entry for <code>name</code> is already
* in the table it is overwritten.
*
* @param name the hosts name.
* @param host the hosts ImRHostInfo object.
*/
public void putHost(String name, ImRHostInfo host)
{
table_lock.gainSharedLock();
hosts_lock.gainSharedLock();
hosts.put(name, host);
hosts_lock.releaseSharedLock();
table_lock.releaseSharedLock();
}
/**
* Remove a host from the table.
*
* @param name the hosts name.
*/
public Object removeHost(String name)
{
return hosts.remove(name);
}
/**
* Get the ImRHostInfo object of a host.
*
* @param name the hosts name.
* @return the ImRHostInfo object for <code>name</code>, null
* if <code>name</code> not in the table.
*/
public ImRHostInfo getHost(String name)
{
return (ImRHostInfo) hosts.get(name);
}
/**
* Implemented from the Serializable interface. For
* automatic initializing after deserialization.
*/
private void readObject(java.io.ObjectInputStream in)
throws java.io.IOException, java.io.NotActiveException,
ClassNotFoundException
{
in.defaultReadObject();
initTransient();
}
} // ServerTable