package org.freeplane.plugin.remote.server.actors;
import org.docear.messages.Messages.AddNodeRequest;
import org.docear.messages.Messages.ChangeNodeRequest;
import org.docear.messages.Messages.CloseAllOpenMapsRequest;
import org.docear.messages.Messages.CloseMapRequest;
import org.docear.messages.Messages.CloseServerRequest;
import org.docear.messages.Messages.CloseUnusedMaps;
import org.docear.messages.Messages.FetchMindmapUpdatesRequest;
import org.docear.messages.Messages.GetNodeRequest;
import org.docear.messages.Messages.ListenToUpdateOccurrenceRequest;
import org.docear.messages.Messages.MindmapAsJsonRequest;
import org.docear.messages.Messages.MindmapAsXmlRequest;
import org.docear.messages.Messages.MoveNodeToRequest;
import org.docear.messages.Messages.OpenMindMapRequest;
import org.docear.messages.Messages.ReleaseLockRequest;
import org.docear.messages.Messages.RemoveNodeRequest;
import org.docear.messages.Messages.RequestLockRequest;
import org.docear.messages.exceptions.LockNotFoundException;
import org.docear.messages.exceptions.MapNotFoundException;
import org.docear.messages.exceptions.NodeAlreadyLockedException;
import org.docear.messages.exceptions.NodeNotFoundException;
import org.freeplane.plugin.remote.server.InternalMessages.ReleaseTimedOutLocks;
import org.freeplane.plugin.remote.server.RemoteController;
import org.freeplane.plugin.remote.server.v10.Actions;
import org.slf4j.Logger;
import akka.actor.ActorRef;
import akka.actor.Status;
import akka.actor.UntypedActor;
public class MainActor extends UntypedActor {
public MainActor() {
}
@Override
public void onReceive(Object message) throws Exception {
final Logger logger = RemoteController.getLogger();
final ActorRef sender = getSender();
if (!(message instanceof ReleaseTimedOutLocks)) {
// Release check happens every 5 seconds and would flood the logging
logger.info("MainActor.onReceive => '{}' received.", message.getClass().getName());
logger.info("MainActor.onReceive => Sender: '{}'", sender.path());
}
Object response = null;
try {
// get map as json
if (message instanceof MindmapAsJsonRequest) {
response = Actions.getMapModelJson((MindmapAsJsonRequest) message);
}
// get map as xml
else if (message instanceof MindmapAsXmlRequest) {
response = Actions.getMapModelXml((MindmapAsXmlRequest) message);
}
// add node to map
else if (message instanceof AddNodeRequest) {
response = Actions.addNode((AddNodeRequest) message);
}
// change node
else if (message instanceof ChangeNodeRequest) {
response = Actions.changeNode((ChangeNodeRequest) message);
}
// move node to another position
else if (message instanceof MoveNodeToRequest) {
response = Actions.moveNodeTo((MoveNodeToRequest) message);
}
// remove node from map
else if (message instanceof RemoveNodeRequest) {
response = Actions.removeNode((RemoveNodeRequest) message);
}
// get node from map
else if (message instanceof GetNodeRequest) {
response = Actions.getNode((GetNodeRequest) message);
}
// Open mindmap
else if (message instanceof OpenMindMapRequest) {
response = Actions.openMindmap((OpenMindMapRequest) message);
}
// close map
else if (message instanceof CloseMapRequest) {
Actions.closeMap((CloseMapRequest) message);
}
// close all maps
else if (message instanceof CloseAllOpenMapsRequest) {
Actions.closeAllOpenMaps((CloseAllOpenMapsRequest) message);
}
// close server
else if (message instanceof CloseServerRequest) {
Actions.closeServer((CloseServerRequest) message);
}
// release lock
else if (message instanceof ReleaseLockRequest) {
response = Actions.releaseLock((ReleaseLockRequest) message);
}
// request lock
else if (message instanceof RequestLockRequest) {
response = Actions.requestLock((RequestLockRequest) message);
}
// get updates since specific revision
else if (message instanceof FetchMindmapUpdatesRequest) {
response = Actions.fetchUpdatesSinceRevision((FetchMindmapUpdatesRequest) message);
}
// listen if update occurs
else if (message instanceof ListenToUpdateOccurrenceRequest) {
Actions.listenIfUpdateOccurs((ListenToUpdateOccurrenceRequest) message, getSender());
}
// close unused maps
else if (message instanceof CloseUnusedMaps) {
Actions.closeUnusedMaps((CloseUnusedMaps) message);
}
// release timed out Locks
else if (message instanceof ReleaseTimedOutLocks) {
Actions.releaseTimedOutLocks((ReleaseTimedOutLocks) message);
}
} catch (MapNotFoundException e) {
logger.warn("MainActor.onReceive => Map not found exception catched. ", e);
response = new Status.Failure(e);
} catch (NodeNotFoundException e) {
logger.warn("MainActor.onReceive => Node not found exception catched. ", e);
response = new Status.Failure(e);
} catch (NodeAlreadyLockedException e) {
logger.warn("MainActor.onReceive => Node already locked exception catched. ", e);
response = new Status.Failure(e);
} catch (LockNotFoundException e) {
logger.warn("MainActor.onReceive => Lock not found exception catched. ", e);
response = new Status.Failure(e);
} catch (Exception e) {
logger.error("MainActor.onReceive => Unrecognized Exception! ", e);
response = new Status.Failure(e);
} catch (AssertionError e) {
logger.error("MainActor.onReceive => Something really bad happened! ", e);
response = new Status.Failure(e);
}
if (response != null) {
logger.debug("MainActor.onReceive => sending '{}' as response.", response.getClass().getName());
sender.tell(response, getSelf());
} else {
logger.trace("MainActor.onReceive => No response available");
}
}
}