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 0df38dbf096537b0db1809b504bd7a893fdf9bf3..110ac8a019f35bd87e965c4f5b31ed22f663925a 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 96d361cbebe4876ed2bd81fda264bd59dca9ce9f..a90eacc1c3d20c386c519591acc89b5c21bdc7c4 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 3c805feb6cf92d5a425c111ddf56cf34c539eee5..e8e3190de178448969f35eabd0eaa7601388d29d 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 3056ec38b528306f7f56b8d36aaca50043b56a95..a3c28d17ac5928e21995abb0784285f60438b25c 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 0000000000000000000000000000000000000000..d888af01a3194eb5a6d880ad9e57a88d2168f2dc --- /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; + } +}