package scs.core.servant;
import java.util.ArrayList;
import java.util.Iterator;
import scs.core.AlreadyConnected;
import scs.core.ConnectionDescription;
import scs.core.ExceededConnectionLimit;
import scs.core.IReceptaclesPOA;
import scs.core.InvalidConnection;
import scs.core.InvalidName;
import scs.core.NoConnection;
import scs.core.ReceptacleDescription;
/**
* Classe abstrata que implementa as caracteristicas comuns aos IReceptacles
* do SCS.
*/
public abstract class IReceptaclesServant extends IReceptaclesPOA {
ArrayList<Receptacle> receptacles = null;
/**
* Contador para gerar o ID da conexao (por instancia)
*/
int connectionCounter = 0;
/**
* Limite de conexoes
*/
int connectionLimit = 0;
/**
* ctor default
*/
public IReceptaclesServant() {
}
/**
* Metodo que retorna o conjunto de receptaculos das classes derivadas
*/
protected abstract ArrayList<Receptacle> createReceptacles();
/**
* Metodo abstrato para as classes concretas implementarem o limite de conexoes
* @return limite de conexoes
*/
protected abstract int getConnectionLimit();
/**
* Metodo abstrato para as classes derivadas validarem as conexoes
* @return status da conexao
*/
protected abstract boolean isValidConnection(org.omg.CORBA.Object obj);
/**
* @param name
* @return
*/
protected Receptacle findReceptacle(String name) {
if( this.receptacles == null )
this.receptacles = this.createReceptacles();
for (Iterator<Receptacle> iter = this.receptacles.iterator(); iter.hasNext();) {
Receptacle rec = iter.next();
if( rec.getName().equals(name) )
return rec;
}
return null;
}
/**
* @param connId
* @return
*/
protected Receptacle findReceptacleByConnection(int connId) {
if( this.receptacles == null )
this.receptacles = this.createReceptacles();
for (Iterator<Receptacle> iter = this.receptacles.iterator(); iter.hasNext();) {
Receptacle rec = iter.next();
ConnectionDescription conn = rec.getConnection(connId);
if( conn != null )
return rec;
}
return null;
}
/* (non-Javadoc)
* @see SCS.IReceptaclesOperations#connect(java.lang.String, org.omg.CORBA.Object)
*/
public int connect(String receptacle, org.omg.CORBA.Object obj) throws InvalidName, InvalidConnection, AlreadyConnected, ExceededConnectionLimit {
if( this.receptacles == null )
this.receptacles = this.createReceptacles();
if( this.connectionLimit != 0 && this.connectionCounter >= this.connectionLimit )
throw new ExceededConnectionLimit();
Receptacle rec = this.findReceptacle(receptacle);
if( rec == null )
throw new InvalidName();
if( !isValidConnection(obj) )
throw new InvalidConnection();
return rec.addConnection(++this.connectionCounter, obj);
}
/* (non-Javadoc)
* @see SCS.IReceptaclesOperations#disconnect(int)
*/
public void disconnect(int id) throws InvalidConnection, NoConnection {
if(id < 0)
throw new InvalidConnection();
Receptacle rec = this.findReceptacleByConnection(id);
if( rec == null )
throw new NoConnection();
rec.removeConnection(id);
}
/* (non-Javadoc)
* @see SCS.IReceptaclesOperations#getConnections(java.lang.String)
*/
public ConnectionDescription[] getConnections(String receptacle) throws InvalidName {
if( this.receptacles == null )
this.receptacles = this.createReceptacles();
ArrayList<ConnectionDescription> connections = new ArrayList<ConnectionDescription>();
for (Iterator<Receptacle> iter = this.receptacles.iterator(); iter.hasNext();) {
Receptacle rec = iter.next();
connections.addAll(rec.getConnections());
}
return connections.toArray(new ConnectionDescription[connections.size()]);
}
/**
* @return
*/
public ArrayList<ReceptacleDescription> getReceptacles() {
if( this.receptacles == null ) {
this.receptacles = this.createReceptacles();
}
ArrayList<ReceptacleDescription> recDesc = new ArrayList<ReceptacleDescription>();
for (Iterator<Receptacle> iter = this.receptacles.iterator(); iter.hasNext();) {
Receptacle rec = iter.next();
recDesc.add(rec.getReceptacleDescription());
}
return recDesc;
}
}