package com.myselia.stem.communication.handlers;
import java.io.IOException;
import com.myselia.javacommon.communication.mail.Addressable;
import com.myselia.javacommon.communication.mail.MailBox;
import com.myselia.javacommon.communication.mail.MailService;
import com.myselia.javacommon.communication.units.Transmission;
import com.myselia.javacommon.topology.ComponentCertificate;
import com.myselia.stem.communication.CommunicationDock;
import com.myselia.stem.communication.StemClientSession;
public abstract class ComponentHandlerBase implements Handler, Addressable {
protected ComponentCertificate componentCert;
protected StemClientSession session;
protected MailBox<Transmission> mailbox;
protected boolean ready = false;
//Called by xConnectionState when Transmission is received
@Override
public void handleComponent(Transmission t) throws IOException {
transmissionReceived(t);
}
public void write(Transmission t) {
session.getClientChannel().writeAndFlush(t);
}
//Override in child classes to handle received transmission
protected abstract void transmissionReceived(Transmission t);
//Use in conjunction with this class' overridden MailBox.In method to signify that a transmission has reached the in queue from the system
protected abstract void endpointReceive();
/*
* Setup Methods
*/
public void setSession(StemClientSession session) {
if (CommunicationDock.getComponentHandlerByCert(componentCert) != null) {
//This is an old session, revive it
System.out.println("[ComponentHandler] : Reviving dead session with UUID " + componentCert.getUUID());
CommunicationDock.getComponentHandlerByCert(componentCert).reviveDeadSession();
} else {
//This is a brand new session, initialize required objects
System.out.println("[ComponentHandler] : This is a new session " + componentCert.getUUID());
this.session = session;
CommunicationDock.addNetworkComponent(componentCert, this);
mailbox = new MailBox<Transmission>();
MailService.registerAddressable(this);
ready = true;
}
}
public void primeHandler(ComponentCertificate componentCert) {
this.componentCert = componentCert;
}
public void reviveDeadSession() {
session.resetExistingConnection();
}
@Override
public boolean ready() {
return ready;
}
/*
* MailBox Overrides
*/
@Override
public void in(Transmission trans) {
mailbox.enqueueIn(trans);
endpointReceive();
}
@Override
public Transmission out() {
return mailbox.dequeueOut();
}
public String toString() {
return "[Component Handler]" +
"\n\t[Registered Under]: " + componentCert.getUUID() +
"\n\t[Certificate Dump]: " +
"\n\t\t" + componentCert;
}
public ComponentCertificate getCertificate() {
return componentCert;
}
}