package scs.instrumentation.servant;
import java.util.Observable;
import java.util.Observer;
import org.omg.CORBA.Any;
import org.omg.CORBA.ORB;
import org.omg.CORBA.ORBPackage.InvalidName;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import org.omg.PortableServer.POAManagerPackage.AdapterInactive;
import org.omg.PortableServer.POAPackage.ServantNotActive;
import org.omg.PortableServer.POAPackage.WrongPolicy;
import scs.core.servant.OrbRunner;
import scs.event_service.EventSink;
import scs.event_service.EventSinkHelper;
import scs.event_service.EventSinkPOA;
/**
* Classe que facilita o tratamento de notificacoes de metodos a partir do
* Interceptor de estatisticas
*
* Deriva de Observable para que os clientes da notificacao possam implementar
* a interface observer e simplificar o tratamento da notificacao.
*
*/
public class MethodNotification extends Observable {
/**
* Inner class que implementa um event sink que recebe a notificacao
* a partir do channel correspondente e envia para os observers
*/
public class NotificationEventSinkServant extends EventSinkPOA {
MethodNotification observable;
private NotificationEventSinkServant(MethodNotification obs) {
this.observable = obs;
}
public void disconnect() {
System.out.println("NotificationEventSinkServant::disconnect()");
this.observable.deleteObservers();
}
public void push(Any ev) {
System.out.println("NotificationEventSinkServant::push() " + ev.extract_string());
this.observable.setStatusChanged();
this.observable.notifyObservers(ev.extract_string());
}
}
NotificationEventSinkServant notifServant = null;
EventSink eventSink = null;
public void setStatusChanged()
{
System.out.println("MethodNotification::setStatusChanged()");
this.setChanged();
}
/**
* Construtor da classe de notificacao que recebe o observer que ira
* ser notificado da chamada do metodo.
*/
public MethodNotification(Observer obs) {
ORB orb = ORB.init(new String[]{""},null);
POA poa = null;
try {
poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
poa.the_POAManager().activate();
} catch (InvalidName e) {
e.printStackTrace();
} catch (AdapterInactive e) {
e.printStackTrace();
}
this.addObserver(obs);
this.notifServant = new NotificationEventSinkServant(this);
try {
this.eventSink = EventSinkHelper.narrow(poa.servant_to_reference(this.notifServant));
} catch (ServantNotActive e) {
e.printStackTrace();
} catch (WrongPolicy e) {
e.printStackTrace();
}
/*
* Executa o orb em outra thread para nao interromper o fluxo de execucao
*/
new OrbRunner(orb).start();
}
public EventSink getEventSink() {
return this.eventSink;
}
}