package com.gravspace.handlers;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import scala.concurrent.Promise;
import com.gravspace.messages.GetSessionVar;
import com.gravspace.messages.KillSession;
import com.gravspace.messages.Null;
import com.gravspace.messages.SetSessionVar;
import com.gravspace.messages.KeepAlive;
import akka.actor.ActorRef;
import akka.actor.UntypedActor;
import akka.event.Logging;
import akka.event.LoggingAdapter;
import static akka.dispatch.Futures.future;
public class Session extends UntypedActor {
LoggingAdapter log = Logging.getLogger(getContext().system(), this);
Map<String, Object> sessionVars = new HashMap<>();
ActorRef handler;
String sessionId;
Thread keepalive;
public Session(ActorRef handler, String sessionId){
this.handler = handler;
this.sessionId = sessionId;
keepalive();
}
@Override
public void onReceive(Object message) throws Exception {
log.info("Session got: "+message.getClass().getCanonicalName());
if (message instanceof KeepAlive){
keepalive();
} else if (message instanceof GetSessionVar){
GetSessionVar getter = (GetSessionVar)message;
Object value = sessionVars.get(getter.getName());
if (value == null){
value = Null.getNull();
}
this.getSender().tell(value, self());
} else if (message instanceof SetSessionVar){
SetSessionVar setter = (SetSessionVar)message;
sessionVars.put(setter.getName(), setter.getValue());
log.info(String.format("SETTING [%s: %s]", setter.getName(),
setter.getValue().toString()));
this.getSender().tell(Boolean.TRUE, self());
} else {
unhandled(message);
}
}
private void keepalive() {
if (keepalive == null){
keepalive = new Thread(){
public void run(){
for(;;){
try {
Thread.sleep(360000);
break;
} catch (InterruptedException e) {}
}
handler.tell(new KillSession(sessionId), self());
}
};
}
}
}