From 237a7caa6971b67d6f98aa4f2aae3cbab7d86def Mon Sep 17 00:00:00 2001
From: Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com>
Date: Sat, 4 Jan 2020 16:18:22 +0100
Subject: Run queries on an interval

---
 .../java/pl/edu/mimuw/cloudatlas/agent/Agent.java  | 30 ++++++++++++++++++++--
 .../agent/modules/RecursiveScheduledTask.java      | 26 +++++++++++++++++++
 .../agent/modules/TimerScheduledTask.java          |  2 +-
 3 files changed, 55 insertions(+), 3 deletions(-)
 create mode 100644 src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/RecursiveScheduledTask.java

(limited to 'src/main/java/pl/edu/mimuw')

diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java
index 70da4af..0efa710 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java
@@ -6,14 +6,19 @@ import java.rmi.server.UnicastRemoteObject;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.function.Supplier;
 
 import pl.edu.mimuw.cloudatlas.agent.NewApiImplementation;
+import pl.edu.mimuw.cloudatlas.agent.messages.RunQueriesMessage;
+import pl.edu.mimuw.cloudatlas.agent.messages.TimerSchedulerMessage;
 import pl.edu.mimuw.cloudatlas.agent.messages.UpdateAttributesMessage;
 import pl.edu.mimuw.cloudatlas.agent.modules.Module;
 import pl.edu.mimuw.cloudatlas.agent.modules.ModuleType;
 import pl.edu.mimuw.cloudatlas.agent.modules.Qurnik;
 import pl.edu.mimuw.cloudatlas.agent.modules.Remik;
 import pl.edu.mimuw.cloudatlas.agent.modules.Stanik;
+import pl.edu.mimuw.cloudatlas.agent.modules.RecursiveScheduledTask;
+import pl.edu.mimuw.cloudatlas.agent.modules.TimerScheduledTask;
 import pl.edu.mimuw.cloudatlas.agent.modules.TimerScheduler;
 import pl.edu.mimuw.cloudatlas.api.Api;
 import pl.edu.mimuw.cloudatlas.interpreter.Main;
@@ -101,11 +106,30 @@ public class Agent {
         }
     }
 
+    private static void startQueries(long queriesPeriod) {
+        Supplier<TimerScheduledTask> taskSupplier = () ->
+            new TimerScheduledTask() {
+                public void run() {
+                    try {
+                        sendMessage(new RunQueriesMessage("", 0));
+                    } catch (InterruptedException e) {
+                        System.out.println("Interrupted while triggering queries");
+                    }
+                }
+            };
+
+        TimerScheduledTask timerTask = new RecursiveScheduledTask(queriesPeriod, taskSupplier);
+
+        try {
+            eventBus.addMessage(new TimerSchedulerMessage("", 0, "", queriesPeriod, 0, timerTask));
+        } catch (InterruptedException e) {
+            System.out.println("Interrupted while starting queries");
+        }
+    }
+
     private static void addZoneAndChildren(ZMI zmi, PathName pathName) {
         try {
-            System.out.println("trying to add " + pathName.toString());
             UpdateAttributesMessage message = new UpdateAttributesMessage("", 0, pathName.toString(), zmi.getAttributes());
-            System.out.println("added it!");
             eventBus.addMessage(message);
             for (ZMI son : zmi.getSons()) {
                 addZoneAndChildren(son, pathName.levelDown(son.getAttributes().getOrNull("name").toString()));
@@ -119,5 +143,7 @@ public class Agent {
         runModulesAsThreads();
         runRegistry();
         initZones();
+        // TODO: make query period confiurable with config file and from tests
+        startQueries(100l);
     }
 }
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/RecursiveScheduledTask.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/RecursiveScheduledTask.java
new file mode 100644
index 0000000..07e1fd4
--- /dev/null
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/RecursiveScheduledTask.java
@@ -0,0 +1,26 @@
+package pl.edu.mimuw.cloudatlas.agent.modules;
+
+import java.util.function.Supplier;
+
+import pl.edu.mimuw.cloudatlas.agent.messages.TimerSchedulerMessage;
+
+public class RecursiveScheduledTask extends TimerScheduledTask {
+    private long delay;
+    private Supplier<TimerScheduledTask> taskSupplier;
+
+    public RecursiveScheduledTask(long delay, Supplier<TimerScheduledTask> taskSupplier) {
+        this.delay = delay;
+        this.taskSupplier = taskSupplier;
+    }
+
+    public void run() {
+        try {
+            TimerScheduledTask task = taskSupplier.get();
+            task.setScheduler(scheduler);
+            task.run();
+            sendMessage(new TimerSchedulerMessage("", 0, "", delay, 0, new RecursiveScheduledTask(delay, taskSupplier)));
+        } catch (InterruptedException e) {
+            System.out.println("Caught interrupted exception while running RecursiveScheduledTask");
+        }
+    }
+}
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/TimerScheduledTask.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/TimerScheduledTask.java
index 7a0da70..da4bd6f 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/TimerScheduledTask.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/TimerScheduledTask.java
@@ -5,7 +5,7 @@ import pl.edu.mimuw.cloudatlas.agent.messages.AgentMessage;
 import java.util.TimerTask;
 
 public abstract class TimerScheduledTask extends TimerTask {
-    private TimerScheduler scheduler;
+    protected TimerScheduler scheduler;
 
     public abstract void run();
 
-- 
cgit v1.2.3