package scs.event_service.servant;
import java.util.ArrayList;
import org.omg.PortableServer.POAPackage.ServantNotActive;
import org.omg.PortableServer.POAPackage.WrongPolicy;
import scs.core.ComponentId;
import scs.core.FacetDescription;
import scs.core.IMetaInterface;
import scs.core.IMetaInterfaceHelper;
import scs.core.ShutdownFailed;
import scs.core.servant.IComponentServant;
import scs.core.servant.IMetaInterfaceServant;
import scs.core.servant.IReceptaclesServant;
import scs.event_service.ChannelCollection;
import scs.event_service.ChannelDescr;
import scs.event_service.ChannelFactory;
import scs.event_service.ChannelFactoryHelper;
import scs.event_service.ChannelManagement;
import scs.event_service.ChannelManagementHelper;
import scs.event_service.EventSink;
import scs.event_service.EventSinkHelper;
/**
* @author Eduardo Fonseca/Luiz Marques
*
*/
public class EventManagerServant extends IComponentServant {
/**
* Inner class contendo a descricao das interfaces de EventManager
*/
private class EvMgrMetaInterface extends IMetaInterfaceServant {
IComponentServant icompServant = null;
public EvMgrMetaInterface(IComponentServant ics) {
this.icompServant = ics;
}
@Override
public IComponentServant getIComponentServant() {
return this.icompServant;
}
@Override
public ArrayList<IReceptaclesServant> getIReceptaclesServants() {
return null;
}
}
private static final String FACET_CHFACTORY = "ChannelFactory";
private static final String IFACE_CHFACTORY = "scs::event_service::ChannelFactory";
private static final String FACET_CHCOLLECTION = "ChannelCollection";
private static final String IFACE_CHCOLLECTION = "scs::event_service::ChannelCollection";
private static final String FACET_CHMANAGEMENT = "ChannelManagement";
private static final String IFACE_CHMANAGEMENT = "scs::event_service::ChannelManagement";
private static final String FACET_IMETAIFACE = "IMetaInterface";
private static final String IFACE_IMETAIFACE = "scs::core::IMetaInterface";
ChannelFactoryServant factoryServant = null;
ChannelFactory factory = null;
ChannelManagementServant managementServant = null;
ChannelManagement management = null;
EvMgrMetaInterface metaInterfaceServant = null;
IMetaInterface metaInterface = null;
/**
* @return Collection contento todos os canais j� criados
*/
private ChannelCollection getCollection() {
return this.factoryServant.getCollection();
}
/**
* @return F�brica de canais, para a cria��o de novos
*/
private ChannelFactory getFactory() {
if( this.factoryServant == null )
{
factoryServant = new ChannelFactoryServant();
try {
this.factory = ChannelFactoryHelper.narrow( this._poa().servant_to_reference(factoryServant));
} catch (ServantNotActive e) {
e.printStackTrace();
} catch (WrongPolicy e) {
e.printStackTrace();
}
}
return this.factory;
}
/**
* @return Gerente de Canal para subscri��o, notifica��o e cancelamento
*/
private ChannelManagement getManagement() {
if( this.managementServant == null )
{
managementServant = new ChannelManagementServant(this);
try {
this.management = ChannelManagementHelper.narrow( this._poa().servant_to_reference(managementServant));
} catch (ServantNotActive e) {
e.printStackTrace();
} catch (WrongPolicy e) {
e.printStackTrace();
}
}
return this.management;
}
/**
* @return Objeto que cont�m a descri��o de todas as facetas desta classe
*/
private IMetaInterface getMetaInterface() {
if( this.metaInterfaceServant == null )
{
this.metaInterfaceServant = new EvMgrMetaInterface(this);
try {
this.metaInterface = IMetaInterfaceHelper.narrow( this._poa().servant_to_reference(this.metaInterfaceServant));
} catch (ServantNotActive e) {
e.printStackTrace();
} catch (WrongPolicy e) {
e.printStackTrace();
}
}
return this.metaInterface;
}
/* (non-Javadoc)
* @see SCS.servant.IComponentServant#createComponentId()
*
*/
protected ComponentId createComponentId() {
return new ComponentId("EventManagerServant", 1);
}
/* (non-Javadoc)
* @see SCS.servant.IComponentServant#createFacets()
*/
@Override
protected ArrayList<FacetDescription> createFacets() {
ArrayList<FacetDescription> facets = new ArrayList<FacetDescription>();
FacetDescription fd = new FacetDescription();
fd.name = FACET_CHFACTORY;
fd.interface_name= IFACE_CHFACTORY;
fd.facet_ref = this.getFactory();
facets.add(fd);
fd = new FacetDescription();
fd.name = FACET_CHCOLLECTION;
fd.interface_name= IFACE_CHCOLLECTION;
fd.facet_ref = this.getCollection();
facets.add(fd);
fd = new FacetDescription();
fd.name = FACET_CHMANAGEMENT;
fd.interface_name= IFACE_CHMANAGEMENT;
fd.facet_ref = this.getManagement();
facets.add(fd);
fd = new FacetDescription();
fd.name = FACET_IMETAIFACE;
fd.interface_name= IFACE_IMETAIFACE;
fd.facet_ref = this.getMetaInterface();
facets.add(fd);
return facets;
}
@Override
protected boolean doShutdown() {
System.out.println("Shutdown do EventManager");
if(this.factoryServant == null) return true;
ChannelDescr channels[] = this.getCollection().getAll();
for (int i = 0; i < channels.length; i++) {
ChannelDescr ch = channels[i];
EventSink sink = EventSinkHelper.narrow(ch.channel.getFacet("scs::event_service::EventSink"));
if( sink != null )
sink.disconnect();
try {
ch.channel.shutdown();
} catch (ShutdownFailed e) {
e.printStackTrace();
}
}
return true;
}
@Override
protected boolean doStartup() {
return true;
}
}