From 9652b320e215b43ff1f11574c2dee71e173a50e3 Mon Sep 17 00:00:00 2001
From: Muhammad Agil Ghifari <muhammad.agil01@ui.ac.id>
Date: Tue, 22 Feb 2022 10:31:56 +0700
Subject: [PATCH] Implementing Selector class

---
 .../tracking/TrackingInitializer.java         |  3 +-
 .../tutorial1/tracking/core/Courier.java      | 27 +++++++++-
 .../tutorial1/tracking/core/DragoHunter.java  | 15 ++++++
 .../tutorial1/tracking/core/RoadUser.java     |  2 +
 .../tutorial1/tracking/core/Selector.java     | 49 +++++++++++++++++++
 5 files changed, 94 insertions(+), 2 deletions(-)
 create mode 100644 src/main/java/id/ac/ui/cs/advprog/tutorial1/tracking/core/Selector.java

diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial1/tracking/TrackingInitializer.java b/src/main/java/id/ac/ui/cs/advprog/tutorial1/tracking/TrackingInitializer.java
index 0df38db..110ac8a 100644
--- a/src/main/java/id/ac/ui/cs/advprog/tutorial1/tracking/TrackingInitializer.java
+++ b/src/main/java/id/ac/ui/cs/advprog/tutorial1/tracking/TrackingInitializer.java
@@ -51,6 +51,7 @@ public class TrackingInitializer {
         eventMonitorRepository.addEventMonitor(dm.getName(), dm);
         eventMonitorRepository.addEventMonitor(sm.getName(), sm);
 
-
+        // TODO : INSERT EXTRA BEHAVIOURS HERE
+        k2.addExtraBehaviour(new Selector(sm, Selector.ACCEPT, Selector.OR));
     }
 }
diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial1/tracking/core/Courier.java b/src/main/java/id/ac/ui/cs/advprog/tutorial1/tracking/core/Courier.java
index 96d361c..a90eacc 100644
--- a/src/main/java/id/ac/ui/cs/advprog/tutorial1/tracking/core/Courier.java
+++ b/src/main/java/id/ac/ui/cs/advprog/tutorial1/tracking/core/Courier.java
@@ -14,6 +14,10 @@ public class Courier implements RoadUser {
     private Map<String, EventMonitor> subscriptions;
     private Map<String, String> locations;
 
+    // Extra behaviours
+    private Selector extraBehaviours = null;
+    private Selector lastSelector = null; // pointer to last selector
+
     /*
         speed: the speed of the courier
         allowedRoutes: name of all possible routes this courier can visit
@@ -54,11 +58,32 @@ public class Courier implements RoadUser {
         String dragoLocation = locations.get("Drago Monitor");
 
         for (String route : allRoutes) {
-            if (!route.equals(dragoLocation))
+            boolean takeRoute = !route.equals(dragoLocation);
+            Selector extraBehaviour = extraBehaviours;
+
+            while (extraBehaviour != null) {
+                takeRoute = extraBehaviour.excecute(
+                        takeRoute, route, locations.get(extraBehaviour.getMonitor())
+                );
+                extraBehaviour = extraBehaviour.getNext();
+            }
+
+            if (takeRoute)
                 allowedRoutes.add(route);
         }
     }
 
+    @Override
+    public void addExtraBehaviour(Selector selector) {
+        if (lastSelector == null) {
+            extraBehaviours = selector;
+            lastSelector = selector;
+        }
+        else {
+            lastSelector.setNext(selector);
+        }
+    }
+
     @Override
     public int getSpeed() {
         // TODO complete me
diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial1/tracking/core/DragoHunter.java b/src/main/java/id/ac/ui/cs/advprog/tutorial1/tracking/core/DragoHunter.java
index 3c805fe..e8e3190 100644
--- a/src/main/java/id/ac/ui/cs/advprog/tutorial1/tracking/core/DragoHunter.java
+++ b/src/main/java/id/ac/ui/cs/advprog/tutorial1/tracking/core/DragoHunter.java
@@ -13,6 +13,10 @@ public class DragoHunter implements RoadUser {
 
     private Map<String, EventMonitor> subscriptions;
     private Map<String, String> locations;
+
+    // Extra behaviours
+    private Selector extraBehaviours = null;
+    private Selector lastSelector = null; // pointer to last selector
     /*
         speed: the speed of the courier
         allowedRoutes: name of all possible routes this courier can visit
@@ -65,6 +69,17 @@ public class DragoHunter implements RoadUser {
         return speed;
     }
 
+    @Override
+    public void addExtraBehaviour(Selector selector) {
+        if (lastSelector == null) {
+            extraBehaviours = selector;
+            lastSelector = selector;
+        }
+        else {
+            lastSelector.setNext(selector);
+        }
+    }
+
     @Override
     public String getName() {
         return name;
diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial1/tracking/core/RoadUser.java b/src/main/java/id/ac/ui/cs/advprog/tutorial1/tracking/core/RoadUser.java
index 3056ec3..a3c28d1 100644
--- a/src/main/java/id/ac/ui/cs/advprog/tutorial1/tracking/core/RoadUser.java
+++ b/src/main/java/id/ac/ui/cs/advprog/tutorial1/tracking/core/RoadUser.java
@@ -10,4 +10,6 @@ public interface RoadUser {
     List<String> getAllowedRoutes();
     void checkSafeRoute();
     int getSpeed();
+
+    void addExtraBehaviour(Selector selector);
 }
diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial1/tracking/core/Selector.java b/src/main/java/id/ac/ui/cs/advprog/tutorial1/tracking/core/Selector.java
new file mode 100644
index 0000000..d888af0
--- /dev/null
+++ b/src/main/java/id/ac/ui/cs/advprog/tutorial1/tracking/core/Selector.java
@@ -0,0 +1,49 @@
+package id.ac.ui.cs.advprog.tutorial1.tracking.core;
+
+public class Selector {
+    public static final int ACCEPT = 1;
+    public static final int REJECT = 2;
+    public static final int AND = 1;
+    public static final int OR = 2;
+
+    private int mode; // ACCEPT or REJECT
+    private int operation; // AND or OR
+    private String monitor;
+    private Selector next;
+
+    public Selector(EventMonitor monitor, int mode, int operation, Selector next) {
+        this.monitor = monitor.getName();
+        this.mode = mode;
+        this.operation = operation;
+        this.next = next;
+    }
+
+    public Selector(EventMonitor monitor, int mode, int operation) {
+        this.monitor = monitor.getName();
+        this.mode = mode;
+        this.operation = operation;
+        this.next = null;
+    }
+
+    public void setNext(Selector next) {
+        this.next = next;
+    }
+
+    public Selector getNext() {
+        return next;
+    }
+
+    public boolean excecute(boolean input, String currRoute, String selectedRoute) {
+        boolean accRoute;
+
+        if (mode == ACCEPT) accRoute = currRoute.equals(selectedRoute);
+        else accRoute = !currRoute.equals(selectedRoute);
+
+        if (operation == AND) return input && accRoute;
+        else return input || accRoute;
+    }
+
+    public String getMonitor() {
+        return monitor;
+    }
+}
-- 
GitLab