package platform.containersregister;
import java.util.Vector;
/**
* Class used by the supervisor in order to manage the list of BCs containers actually created.<br>
* Offers methods to add, find and remove containers.
* @author Dalmau
*/
// Classe utilisee par la PF pour enregistrer les conteneurs crees
// offre des methodes pour :
// enregistrer un conteneur (nom, entree, sortie)
// rechercher dans la liste un conteneur designe par son nom
// supprimer de la liste un conteneur designe par son nom
// changer l'entree d'un conteneur de la liste (deconnexion/reconnexion)
// changer la sortie d'un conteneur de la liste (deconnexion/reconnexion)
public class ComponentsRegistration {
private Vector<OsagaiaContainerDescriptor> conteneurs; // Liste des conteneurs enregistres (osagaia et korrontea)
/**
* Indicator of a not connected input
*/
public static final String DECONNECTE = "NC";
/**
* Construction of a Container list
*/
public ComponentsRegistration() {
conteneurs = new Vector<OsagaiaContainerDescriptor>();
}
/**
* Add a container to the list
*
* @param descriptor the container to be added
*/
public void ajouterConteneur(OsagaiaContainerDescriptor descriptor) {
conteneurs.addElement(descriptor);
}
/**
* Find a container in the list
*
* @param name name of the container to find
* @return The container descriptor (null if no container of this name)
*/
public OsagaiaContainerDescriptor trouverConteneur(String name) {
// Recherche dans la liste le conteneur dont le nom est passe en parametre
int rang = trouverRangConteneur(name);
if (rang != -1) // s'il existe on retourne son descripteur
return conteneurs.elementAt(rang);
else return null; // sinon on retourne null
}
/**
* Remove a container from the list
*
* @param name name of the container to remove
*/
public void enleverConteneur(String name) {
// Enleve de la liste des conteneurs celui dont le nom est passe en parametre
int rang = trouverRangConteneur(name);
if (rang != -1) // s'il existe on l'enleve
conteneurs.removeElementAt(rang);
}
/**
* Change the input of a container
*
* @param name name of the container to change
* @param number number of input
* @param input name of the new input of the container
*/
public void changerEntreeConteneur(String name, int number, String input) {
// Recherche dans la liste des conteneurs celui dont le nom est passe en parametre
OsagaiaContainerDescriptor courant = trouverConteneur(name);
if (courant != null) // s'il existe on modifie son entree
courant.setEntree(number, input);
}
/**
* Change the output of a container
*
* @param name name of the container to change
* @param output name of the new output of the container
*/
public void ajouterSortieConteneur(String name, String output) {
// Recherche dans la liste des conteneurs celui dont le nom est passe en parametre
OsagaiaContainerDescriptor courant = trouverConteneur(name);
if (courant != null) // s'il existe on modifie son entree
courant.addSortie(output);
}
/**
* Update all inputs/outputs of components when a connector is removed
*
* @param nameConnector name of the removed connector
*/
public void deconnecterESConteneur(String nameConnector) {
OsagaiaContainerDescriptor courant=null;
for (int i=0; i<conteneurs.size(); i++) {
courant = conteneurs.elementAt(i);
for (int j=0; j<courant.getEntree().length; j++) {
if (courant.getEntree()[j].equals(nameConnector)) { // le connecteur enleve etait en entree de ce composant
courant.setEntree(j, DECONNECTE); // marquer l'entree comme deconnectee
}
}
courant.removeSortie(nameConnector); // marquer la sortie comme deconnectee si le connecteur etait en sortie
}
}
/**
* Finds the component which input is connected to a given connector
* @param nameConnector connector to find
* @return the name of the connected component and the number of the connected input
*/
public ConnectedInput trouveComposantEntreeSur(String nameConnector) {
OsagaiaContainerDescriptor courant=null;
boolean trouve = false;
int i = 0;
int j = 0;
while ((i<conteneurs.size()) && (!trouve)) {
courant = conteneurs.elementAt(i);
j = 0;
while ((j < courant.getEntree().length) && (!trouve)) {
if (courant.getEntree()[j].equals(nameConnector)) trouve = true;
else j++;
}
if (!trouve) i++;
}
if (trouve) {
return new ConnectedInput(courant.getNom(), j);
}
else return null;
}
private int trouverRangConteneur(String name) {
// Recherche dans la liste des conteneurs celui dont le nom est passe en parametre
int i=0;
boolean trouve=false;
OsagaiaContainerDescriptor courant=null;
while ((!trouve) && (i<conteneurs.size())) {
courant = conteneurs.elementAt(i);
if (courant.getNom().equals(name)) {
trouve=true;
}
else i++;
}
if (trouve) return i; // s'il existe on retourne son rang
else return -1; // sinon on retourne -1
}
/**
* Returns the number of registered components
* @return the number of registered components
*/
public int getComponentsNumber() {
// Renvoie le nombre de composants enregistres
return conteneurs.size();
}
/**
* Returns a registered component
* @param index number of the required component
* @return the required registered component
*/
public OsagaiaContainerDescriptor getComponentAt(int index) {
// Renvoie le indexieme composant
return conteneurs.elementAt(index);
}
}