package scs.core.servant;
import java.util.ArrayList;
import java.util.Iterator;
import org.omg.CORBA.Object;
import scs.core.FacetDescription;
import scs.core.IComponentPOA;
import scs.core.ShutdownFailed;
import scs.core.StartupFailed;
import scs.core.ComponentId;
/**
* Servant generico de um IComponent, que serve de classe abstrata para
* os demais IComponents
*
* Implementa as caracteristicas comuns a todos os IComponents.
*
* Enquanto o startup nao for chamado, nao retorna nenhuma faceta para o cliente.
*/
public abstract class IComponentServant extends IComponentPOA {
/**
* Flag para controlar a ativacao do componente apos o startup
*/
private boolean isActive = false;
/**
* Container de facetas do IComponent
*/
ArrayList<FacetDescription> facets = null;
/**
* ComponentId do componente
*/
protected ComponentId cpId = null;
/**
* Metodo abstrato para criar as facetas nas classes derivadas
* @return container de facetas
*/
protected abstract ArrayList<FacetDescription> createFacets();
/**
* Metodo abstrato para implementar o shutdown nas classes derivadas
* @return status da operacao
*/
protected abstract boolean doShutdown();
/**
* Metodo abstrato para implementar o startup nas classes derivadas
* @return status da operacao
*/
protected abstract boolean doStartup();
/**
* Metodo que retorna o servant que implementa uma interface associada a uma faceta do componente
* @param facet_interface String que representa o nome da interface associada a faceta
*/
public org.omg.CORBA.Object getFacet(String facet_interface) {
if(!isActive) {
return null;
}
for (Iterator<FacetDescription> iter = this.facets.iterator(); iter.hasNext();) {
FacetDescription f = iter.next();
if( f.interface_name.equals(facet_interface)) {
return f.facet_ref;
}
}
return null;
}
/**
* Metodo que retorna o servant que implementa uma faceta do componente
* @param facet String que representa o nome da faceta
*/
public org.omg.CORBA.Object getFacetByName(String facet) {
if(!isActive)
return null;
for (Iterator<FacetDescription> iter = this.facets.iterator(); iter.hasNext();) {
FacetDescription f = iter.next();
if( f.name.equals(facet) )
return f.facet_ref;
}
return null;
}
/**
* Chama o metodo doShutdown das classes derivadas para permitir que elas
* facam alguma coisa durante o termino do ICOmponent
*/
public void shutdown() throws ShutdownFailed {
if( !this.doShutdown() )
throw new ShutdownFailed();
this.isActive = false;
}
/**
* Chama o metodo doStartup das classes derivadas para permitir que elas
* facam alguma coisa durante a inicializacao do ICOmponent
*/
public void startup() throws StartupFailed {
this.facets = this.createFacets();
if( !this.doStartup() )
throw new StartupFailed();
this.isActive = true;
}
/**
* Retorna todas as facetas do componente
* @return FacetDescription[] Array contendo a descricao das facetas
*/
public FacetDescription[] getFacets() {
return this.facets.toArray(new FacetDescription[this.facets.size()]);
}
/** Metodo para prover o ComponentId nas classes derivadas
* @param ComponentId contendo nome e versao do componente
*/
public void createComponentId(ComponentId id) {
this.cpId = id;
}
/**
* Retorna o ComponentId do componente
* @return ComponentId Nome e versão do componente
*/
public ComponentId getComponentId() {
return this.cpId;
}
}