diff options
author | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2019-12-30 22:16:46 +0100 |
---|---|---|
committer | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2019-12-30 22:16:46 +0100 |
commit | ca2f1ab4a37f0d590d5c116cd1fa7c341c77fad3 (patch) | |
tree | fb3b8ff1629e5480086f43065156625985a2e034 /src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Remik.java | |
parent | fda20e7aa496926d4f4d78921925025040414d9b (diff) |
Implement modular getZoneSet
Diffstat (limited to 'src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Remik.java')
-rw-r--r-- | src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Remik.java | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Remik.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Remik.java new file mode 100644 index 0000000..9645d71 --- /dev/null +++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Remik.java @@ -0,0 +1,54 @@ +package pl.edu.mimuw.cloudatlas.agent.modules; + +import java.util.concurrent.CompletableFuture; +import java.util.HashMap; +import java.util.Map; + + +import pl.edu.mimuw.cloudatlas.agent.messages.GetStateMessage; +import pl.edu.mimuw.cloudatlas.agent.messages.RemikMessage; +import pl.edu.mimuw.cloudatlas.agent.messages.RequestStateMessage; +import pl.edu.mimuw.cloudatlas.agent.messages.ResponseMessage; + +/* + * Remik is a cute little module that allows RMI functions to interface with + * agent's asynchronous modules. + */ +public class Remik extends Module { + private Map<Long, CompletableFuture<ResponseMessage>> awaitingRequests; + private long nextRequestId = 0; + + public Remik() { + super(ModuleType.RMI); + awaitingRequests = new HashMap(); + } + + public void handleTyped(RemikMessage message) throws InvalidMessageType, InterruptedException { + switch (message.getType()) { + case REQUEST_STATE: + handleRequestState((RequestStateMessage) message); + break; + default: + throw new InvalidMessageType("This type of message cannot be handled by Remik"); + } + } + + public void handleTyped(ResponseMessage message) { + CompletableFuture<ResponseMessage> responseFuture = awaitingRequests.get(message.getRequestId()); + + if (responseFuture == null) { + System.out.println("ERROR: Remik got response for nonexistent/finished request"); + } else { + responseFuture.complete(message); + } + } + + private void handleRequestState(RequestStateMessage message) throws InterruptedException { + awaitingRequests.put(nextRequestId, message.getFuture()); + + GetStateMessage getStateMessage = new GetStateMessage("", 0, ModuleType.RMI, nextRequestId); + nextRequestId++; + + sendMessage(getStateMessage); + } +} |