From 79837dd95a90891943659194c43f732a364ad9ff Mon Sep 17 00:00:00 2001 From: ShazaAli Date: Tue, 3 Dec 2024 07:29:45 -0500 Subject: Replica 1 implement all functions --- .../java/derms/replica1/CoordinatorClient.java | 4 +- src/main/java/derms/replica1/Replica1.java | 47 ++++++++++++++++++---- src/main/java/derms/replica1/ResponderClient.java | 4 +- 3 files changed, 46 insertions(+), 9 deletions(-) (limited to 'src/main') diff --git a/src/main/java/derms/replica1/CoordinatorClient.java b/src/main/java/derms/replica1/CoordinatorClient.java index 23b5a01..3793542 100644 --- a/src/main/java/derms/replica1/CoordinatorClient.java +++ b/src/main/java/derms/replica1/CoordinatorClient.java @@ -56,13 +56,15 @@ public class CoordinatorClient { return Collections.emptyList(); } - public void returnResource(String coordinatorID, String resourceID) { + public String returnResource(String coordinatorID, String resourceID) { try { String response = server.returnResource(coordinatorID, resourceID); System.out.println(response); logOperation("returnResource", coordinatorID, resourceID, response); + return response; } catch (Exception e) { e.printStackTrace(); + throw new RuntimeException(e); } } public String swapResource(String coordinatorID, String oldResourceID, String oldResourceType, String newResourceID, String newResourceType) { diff --git a/src/main/java/derms/replica1/Replica1.java b/src/main/java/derms/replica1/Replica1.java index 10c0ce5..ef45e80 100644 --- a/src/main/java/derms/replica1/Replica1.java +++ b/src/main/java/derms/replica1/Replica1.java @@ -21,6 +21,9 @@ public class Replica1 implements Replica { private final Logger log; private final InetAddress localAddr; private final ResponderClient responderClient; + private final CoordinatorClient coordinatorClient; + private final String responderClientID = "MTL"; + private final String coordinatorClientID = "MTLC1111"; private final ReplicaManager replicaManager; public Replica1(ReplicaManager replicaManager) { @@ -31,7 +34,8 @@ public class Replica1 implements Replica { } catch (UnknownHostException e) { throw new RuntimeException(e); } - responderClient = new ResponderClient("MTL"); + responderClient = new ResponderClient(responderClientID); + coordinatorClient = new CoordinatorClient(coordinatorClientID); try { this.log = DermsLogger.getLogger(getClass()); } catch (IOException e) { @@ -54,12 +58,41 @@ public class Replica1 implements Replica { @Override public void processRequest(Request request) { - String status = responderClient.addResource( - request.getResourceID(), - request.getResourceType(), - request.getDuration() - ); - Response response = new Response(request.getSequenceNumber(), status); + log.info(request.toString()); + + String status = ""; + try { + switch (request.getFunction()) { + case "addResource": + status = responderClient.addResource(request.getResourceID(), request.getResourceType(), request.getDuration()); + break; + case "removeResource": + status = responderClient.removeResource(request.getResourceID(), request.getDuration()); + break; + case "listResourceAvailability": + status = String.join(",", responderClient.listResourceAvailability(request.getResourceType())); + break; + case "requestResource": + status = coordinatorClient.requestResource(coordinatorClientID, request.getResourceID(), request.getDuration()); + break; + case "findResource": + status = String.join(",", coordinatorClient.findResource(coordinatorClientID, request.getResourceType())); + break; + case "returnResource": + status = coordinatorClient.returnResource(coordinatorClientID, request.getResourceID()); + break; + case "swapResource": + status = coordinatorClient.swapResource(coordinatorClientID, request.getOldResourceID(), request.getOldResourceType(), request.getResourceID(), request.getResourceType()); + break; + default: + status = "Failure: unknown function '" + request.getFunction() + "'"; + } + } catch (Exception e) { + log.warning(e.getMessage()); + status = "Failure: " + request.getFunction() + ": " + e.getMessage(); + } + + Response response = new Response(request, replicaManager.getReplicaId(), status, false); // TODO: isSuccess flag log.info("Processed request " + request + "; response: " + response); replicaManager.sendResponseToFE(response); } diff --git a/src/main/java/derms/replica1/ResponderClient.java b/src/main/java/derms/replica1/ResponderClient.java index c022fd3..13adc73 100644 --- a/src/main/java/derms/replica1/ResponderClient.java +++ b/src/main/java/derms/replica1/ResponderClient.java @@ -59,13 +59,15 @@ public class ResponderClient { } } - public void removeResource(String resourceID, int duration) { + public String removeResource(String resourceID, int duration) { try { String response = server.removeResource(resourceID, duration); System.out.println(response); logOperation("removeResource", resourceID, duration, response); + return response; } catch (Exception e) { e.printStackTrace(); + throw new RuntimeException(e); } } -- cgit v1.2.3 From 55be062da68cd74214e24801adfe86244d608c3e Mon Sep 17 00:00:00 2001 From: ShazaAli Date: Tue, 3 Dec 2024 09:39:18 -0500 Subject: Replica 1 Failing SHE MTL QUE Comm --- src/main/java/derms/replica1/DERMSServer.java | 23 +++++++------- .../java/derms/replica1/DERMSServerPublisher.java | 4 +-- src/main/java/derms/replica1/Replica1.java | 36 ++++++++++++++++------ 3 files changed, 41 insertions(+), 22 deletions(-) (limited to 'src/main') diff --git a/src/main/java/derms/replica1/DERMSServer.java b/src/main/java/derms/replica1/DERMSServer.java index 72849a1..585a946 100644 --- a/src/main/java/derms/replica1/DERMSServer.java +++ b/src/main/java/derms/replica1/DERMSServer.java @@ -22,17 +22,22 @@ public class DERMSServer implements DERMSInterface { private static List cities = Arrays.asList("MTL", "QUE", "SHE"); private static List resourceNames = Arrays.asList("AMBULANCE", "FIRETRUCK", "PERSONNEL"); + private final Random r = new Random(); + private final Map portsMap = new HashMap() {{ + put("MTL", r.nextInt(60000-8000) + 8000); + put("QUE", r.nextInt(60000-8000) + 8000); + put("SHE", r.nextInt(60000-8000) + 8000); + }}; public DERMSServer() { // Default constructor to support JAX-WS - super(); - this.serverID = "MTL"; - resources = new HashMap<>(); - new Thread(this::listenForMessages).start(); +// super(); +// this.serverID = "MTL"; +// resources = new HashMap<>(); +// new Thread(this::listenForMessages).start(); } public DERMSServer(String serverID) throws InterruptedException { - super(); this.serverID = serverID; resources = new HashMap<>(); new Thread(this::listenForMessages).start(); @@ -40,7 +45,7 @@ public class DERMSServer implements DERMSInterface { } private void listenForMessages() { - try (DatagramSocket socket = new DatagramSocket()) { + try (DatagramSocket socket = new DatagramSocket(getServerPortsFromCentralRepo().get(serverID))) { this.serverPort.set(socket.getLocalPort()); byte[] buffer = new byte[1024]; @@ -216,11 +221,7 @@ public class DERMSServer implements DERMSInterface { private Map getServerPortsFromCentralRepo() { // Mocking response as web services since no derms.CentralRepoInterface. - return new HashMap() {{ - put("MTL", 4321); - put("QUE", 4322); - put("SHE", 4323); - }}; + return new HashMap<>(portsMap); } @Override diff --git a/src/main/java/derms/replica1/DERMSServerPublisher.java b/src/main/java/derms/replica1/DERMSServerPublisher.java index df175b6..3edf16c 100644 --- a/src/main/java/derms/replica1/DERMSServerPublisher.java +++ b/src/main/java/derms/replica1/DERMSServerPublisher.java @@ -6,8 +6,8 @@ public class DERMSServerPublisher { public static void main(String[] args) { try { Endpoint.publish("http://localhost:8387/ws/derms", new DERMSServer("MTL")); -// Endpoint.publish("http://localhost:8081/ws/derms", new DERMSServer("QUE")); -// Endpoint.publish("http://localhost:8082/ws/derms", new DERMSServer("SHE")); + Endpoint.publish("http://localhost:8081/ws/derms", new DERMSServer("QUE")); + Endpoint.publish("http://localhost:8082/ws/derms", new DERMSServer("SHE")); } catch (InterruptedException e) { throw new RuntimeException(e); } diff --git a/src/main/java/derms/replica1/Replica1.java b/src/main/java/derms/replica1/Replica1.java index ef45e80..a59ed4c 100644 --- a/src/main/java/derms/replica1/Replica1.java +++ b/src/main/java/derms/replica1/Replica1.java @@ -25,6 +25,7 @@ public class Replica1 implements Replica { private final String responderClientID = "MTL"; private final String coordinatorClientID = "MTLC1111"; private final ReplicaManager replicaManager; + private DERMSServer server; public Replica1(ReplicaManager replicaManager) { this.replicaManager = replicaManager; @@ -50,7 +51,21 @@ public class Replica1 implements Replica { @Override public void startProcess() { - pool.execute(DERMSServer::new); + try { + server = new DERMSServer("MTL"); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + try { + new DERMSServer("SHE"); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + try { + new DERMSServer("QUE"); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } alive = true; log.info(getClass().getSimpleName() + " started."); log.config("Local address is "+localAddr.toString()); @@ -61,28 +76,30 @@ public class Replica1 implements Replica { log.info(request.toString()); String status = ""; + boolean isSuccess = true; try { switch (request.getFunction()) { case "addResource": - status = responderClient.addResource(request.getResourceID(), request.getResourceType(), request.getDuration()); + status = server.addResource(request.getResourceID(), request.getResourceType(), request.getDuration()); break; case "removeResource": - status = responderClient.removeResource(request.getResourceID(), request.getDuration()); + status = server.removeResource(request.getResourceID(), request.getDuration()); break; case "listResourceAvailability": - status = String.join(",", responderClient.listResourceAvailability(request.getResourceType())); +// status = String.join(",", responderClient.listResourceAvailability(request.getResourceType())); + status = String.join(",", server.listResourceAvailability(request.getResourceType())); break; case "requestResource": - status = coordinatorClient.requestResource(coordinatorClientID, request.getResourceID(), request.getDuration()); + status = server.requestResource(coordinatorClientID, request.getResourceID(), request.getDuration()); break; case "findResource": - status = String.join(",", coordinatorClient.findResource(coordinatorClientID, request.getResourceType())); + status = String.join(",", server.findResource(coordinatorClientID, request.getResourceType())); break; case "returnResource": - status = coordinatorClient.returnResource(coordinatorClientID, request.getResourceID()); + status = server.returnResource(coordinatorClientID, request.getResourceID()); break; case "swapResource": - status = coordinatorClient.swapResource(coordinatorClientID, request.getOldResourceID(), request.getOldResourceType(), request.getResourceID(), request.getResourceType()); + status = server.swapResource(coordinatorClientID, request.getOldResourceID(), request.getOldResourceType(), request.getResourceID(), request.getResourceType()); break; default: status = "Failure: unknown function '" + request.getFunction() + "'"; @@ -90,9 +107,10 @@ public class Replica1 implements Replica { } catch (Exception e) { log.warning(e.getMessage()); status = "Failure: " + request.getFunction() + ": " + e.getMessage(); + isSuccess = false; } - Response response = new Response(request, replicaManager.getReplicaId(), status, false); // TODO: isSuccess flag + Response response = new Response(request, replicaManager.getReplicaId(), status, isSuccess); // TODO: isSuccess flag log.info("Processed request " + request + "; response: " + response); replicaManager.sendResponseToFE(response); } -- cgit v1.2.3 From 0123ebaac66527b0e17d89cec8b41e073afba885 Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Tue, 3 Dec 2024 09:57:56 -0500 Subject: separate responder client from cli --- src/main/java/derms/client/ResponderClient.java | 97 ++----------------- src/main/java/derms/client/ResponderClientCLI.java | 103 +++++++++++++++++++++ 2 files changed, 110 insertions(+), 90 deletions(-) create mode 100644 src/main/java/derms/client/ResponderClientCLI.java (limited to 'src/main') diff --git a/src/main/java/derms/client/ResponderClient.java b/src/main/java/derms/client/ResponderClient.java index 43be3f3..4db30c8 100644 --- a/src/main/java/derms/client/ResponderClient.java +++ b/src/main/java/derms/client/ResponderClient.java @@ -6,105 +6,22 @@ import derms.util.TestLogger; import java.net.MalformedURLException; import java.util.Objects; -public class ResponderClient extends CLI { - public static final String usage = "Usage: java derms.client.ResponderClient "; - +public class ResponderClient { private final DERMSInterface server; public ResponderClient(String FEhost) throws MalformedURLException { server = Client.connectToServer(FEhost); - - commands.put("add", new Add()); - cmdDescriptions.add(new Description( - "add ", - "Add ad resource to the server")); - - commands.put("remove", new Remove()); - cmdDescriptions.add(new Description( - "remove ", - "Decrease the duration of a resource. If duration is negative, the resource is removed entirely.")); - - commands.put("list", new List()); - cmdDescriptions.add(new Description( - "list ", - "List available resources")); } - public static void main(String[] args) { - if (args.length < 1) { - System.err.println(usage); - System.exit(1); - } - - String FEhost = args[0]; - - try { - (new ResponderClient(FEhost)).run(); - } catch (MalformedURLException e) { - e.printStackTrace(); - } + public String addResource(String resourceID, String resourceName, int duration) { + return server.addResource(resourceID, resourceName, duration); } - public class Add implements Command { - @Override - public void exec(String[] args) { - if (args.length < 3) - System.out.println("invalid arguments for 'add'"); - else - add(args[0], args[1], args[2]); - } - - public void add(String resourceID, String resourceName, String durationStr) { - try { - int duration = Integer.parseInt(durationStr); - if (duration < 0) { - throw new NumberFormatException("duration less than 0"); - } - String response = server.addResource(resourceID, resourceName, duration); - System.out.println(response); - if (response.contains("Fail")) { - TestLogger.log("[FAILED: " + response + "]"); - } else { - TestLogger.log("[SUCCESS: " + response + "]"); - } - } catch (NumberFormatException e) { - System.out.println("invalid duration: " + durationStr); - } - } + public String removeResource(String resourceID, int duration) { + return server.removeResource(resourceID, duration); } - private class Remove implements Command { - @Override - public void exec(String[] args) { - if (args.length < 2) - System.out.println("invalid arguments for 'remove'"); - else - remove(args[0], args[1]); - } - - private void remove(String resourceID, String durationStr) { - try { - int duration = Integer.parseInt(durationStr); - String response = server.removeResource(resourceID, duration); - System.out.println(response); - } catch (NumberFormatException e) { - System.out.println("invalid duration: " + durationStr); - } - } - } - - private class List implements Command { - @Override - public void exec(String[] args) { - if (args.length < 1) - System.out.println("invalid arguments for 'list'"); - else - list(args[0]); - } - - private void list(String resourceName) { - String response = server.listResourceAvailability(resourceName); - System.out.println(response); - } + public String listResourceAvailability(String resourceName) { + return server.listResourceAvailability(resourceName); } } diff --git a/src/main/java/derms/client/ResponderClientCLI.java b/src/main/java/derms/client/ResponderClientCLI.java new file mode 100644 index 0000000..86a5a9a --- /dev/null +++ b/src/main/java/derms/client/ResponderClientCLI.java @@ -0,0 +1,103 @@ +package derms.client; + +import derms.frontend.DERMSInterface; + +import java.net.MalformedURLException; + +public class ResponderClientCLI extends CLI { + public static final String usage = "Usage: java derms.client.ResponderClient "; + + private final DERMSInterface server; + + private ResponderClientCLI(String FEhost) throws MalformedURLException { + server = Client.connectToServer(FEhost); + + commands.put("add", new Add()); + cmdDescriptions.add(new CLI.Description( + "add ", + "Add ad resource to the server")); + + commands.put("remove", new Remove()); + cmdDescriptions.add(new CLI.Description( + "remove ", + "Decrease the duration of a resource. If duration is negative, the resource is removed entirely.")); + + commands.put("list", new List()); + cmdDescriptions.add(new CLI.Description( + "list ", + "List available resources")); + } + + public static void main(String[] args) { + if (args.length < 1) { + System.err.println(usage); + System.exit(1); + } + + String FEhost = args[0]; + + try { + (new ResponderClientCLI(FEhost)).run(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + } + + private class Add implements CLI.Command { + @Override + public void exec(String[] args) { + if (args.length < 3) + System.out.println("invalid arguments for 'add'"); + else + add(args[0], args[1], args[2]); + } + + private void add(String resourceID, String resourceName, String durationStr) { + try { + int duration = Integer.parseInt(durationStr); + if (duration < 0) { + throw new NumberFormatException("duration less than 0"); + } + String response = server.addResource(resourceID, resourceName, duration); + System.out.println(response); + } catch (NumberFormatException e) { + System.out.println("invalid duration: " + durationStr); + } + } + } + + private class Remove implements CLI.Command { + @Override + public void exec(String[] args) { + if (args.length < 2) + System.out.println("invalid arguments for 'remove'"); + else + remove(args[0], args[1]); + } + + private void remove(String resourceID, String durationStr) { + try { + int duration = Integer.parseInt(durationStr); + String response = server.removeResource(resourceID, duration); + System.out.println(response); + } catch (NumberFormatException e) { + System.out.println("invalid duration: " + durationStr); + } + } + } + + private class List implements CLI.Command { + @Override + public void exec(String[] args) { + if (args.length < 1) + System.out.println("invalid arguments for 'list'"); + else + list(args[0]); + } + + private void list(String resourceName) { + String response = server.listResourceAvailability(resourceName); + System.out.println(response); + } + } +} -- cgit v1.2.3