summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShazaAhmed <ShazaMamdouh@aucegypt.edu>2024-11-28 04:35:42 -0500
committerShazaAhmed <ShazaMamdouh@aucegypt.edu>2024-11-28 04:35:42 -0500
commitfe384df239711ad0990e39d585e64292816bf24f (patch)
treea16d0137d60d813c6ff06f2029ad8a935d2a804e
parentb7dabf61e2f4deea23c9a4cbf33da419d031c5e8 (diff)
downloadsoen423-fe384df239711ad0990e39d585e64292816bf24f.zip
replicas
-rw-r--r--src/main/java/derms/Replica1.java90
-rw-r--r--src/main/java/derms/ReplicaManager.java115
-rw-r--r--src/main/java/derms/ReplicaRunner.java28
-rw-r--r--src/main/java/derms/Request.java129
-rw-r--r--src/main/java/derms/Response.java143
-rw-r--r--src/main/java/derms/frontend/DERMSServerImpl.java137
-rw-r--r--src/main/java/derms/frontend/FE.java20
-rw-r--r--src/main/java/derms/frontend/FEInterface.java9
-rw-r--r--src/main/java/derms/frontend/MyRequest.java131
-rw-r--r--src/main/java/derms/frontend/RmResponse.java147
10 files changed, 590 insertions, 359 deletions
diff --git a/src/main/java/derms/Replica1.java b/src/main/java/derms/Replica1.java
new file mode 100644
index 0000000..d7c149d
--- /dev/null
+++ b/src/main/java/derms/Replica1.java
@@ -0,0 +1,90 @@
+package derms;
+
+import derms.net.runicast.ReliableUnicastSender;
+
+import javax.xml.ws.Endpoint;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.util.logging.Logger;
+
+public class Replica1 {
+ private final ReliableUnicastSender<Response> unicastSender;
+ ReplicaManager replicaManager;
+ private final Logger log;
+ private boolean alive = true;
+
+ public Replica1( InetSocketAddress frontEndAddress) throws IOException {
+ this.unicastSender = new ReliableUnicastSender<Response>(frontEndAddress);
+ this.log = Logger.getLogger(getClass().getName());
+ }
+
+
+ public boolean isAlive() {
+ return alive;
+ }
+
+ public void startProcess() {
+ // Simulate the replica process starting.
+ log.info("Replica " + 1 + " started.");
+ }
+
+ public void processRequest(Request request) {
+ // Process the request and create a response.
+ endpoint1 = Endpoint.publish("http://localhost:8080/ws/derms", new DERMSServer("MTL"));
+ endpoint2 = Endpoint.publish("http://localhost:8081/ws/derms", new DERMSServer("QUE"));
+ endpoint3 = Endpoint.publish("http://localhost:8082/ws/derms", new DERMSServer("SHE"));
+
+
+ String responseMessage;
+ switch (request.getFunction()) {
+ case "addResource":
+ responderClient = new ResponderClient(request.getClientID());
+ responseMessage = responderClient.addResource(request.getResourceID(), request.getResourceType(), request.getDuration());
+ break;
+ case "removeResource":
+ responderClient = new ResponderClient(request.getClientID());
+ responseMessage = responderClient.removeResource(request.getResourceID(), request.getDuration());
+ break;
+ case "listResourceAvailability":
+ responderClient = new ResponderClient(request.getClientID());
+ responseMessage = responderClient.listResourceAvailability(request.getResourceType());
+ break;
+ case "requestResource":
+ coordinatorClient = new CoordinatorClient(request.getClientID());
+ responseMessage = coordinatorClient.requestResource(request.getClientID(), request.getResourceID(), request.getDuration());
+ break;
+ case "findResource":
+ coordinatorClient = new CoordinatorClient(request.getClientID());
+ responseMessage = coordinatorClient.findResource(request.getClientID(), request.getResourceType());
+ break;
+ case "returnResource":
+ coordinatorClient = new CoordinatorClient(request.getClientID());
+ responseMessage = coordinatorClient.returnResource(request.getClientID(), request.getResourceID());
+ break;
+ case "swapResource":
+ coordinatorClient = new CoordinatorClient(request.getClientID());
+ responseMessage = coordinatorClient.swapResource(
+ request.getClientID(),
+ request.getOldResourceID(),
+ request.getOldResourceType(),
+ request.getResourceID(),
+ request.getResourceType()
+ );
+ break;
+ default:
+ responseMessage = "Unrecognized function: " + request.getFunction();
+ log.severe("Unrecognized function in request: " + request.getFunction());
+ break;
+ }
+
+ Response response = new Response(request.getSequenceNumber(), responseMessage);
+ log.info("Replica " + 1 + " processed request: " + request + ", response: " + response);
+ replicaManager.sendResponseToFE(response);
+ }
+
+ public void restart() {
+ // Restart the replica process.
+ log.warning("Replica " + 1 + " is restarting...");
+ startProcess();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/derms/ReplicaManager.java b/src/main/java/derms/ReplicaManager.java
new file mode 100644
index 0000000..9725bcb
--- /dev/null
+++ b/src/main/java/derms/ReplicaManager.java
@@ -0,0 +1,115 @@
+package derms;
+import derms.frontend.FEInterface;
+
+import derms.Replica1;
+import derms.Replica2;
+import derms.Replica3;
+import derms.Replica4;
+
+import derms.Request;
+import derms.Response;
+import derms.net.MessagePayload;
+import derms.net.tomulticast.TotalOrderMulticastReceiver;
+import derms.net.runicast.ReliableUnicastSender;
+import derms.net.tomulticast.TotalOrderMulticastSender;
+
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.util.logging.Logger;
+
+public class ReplicaManager {
+ private final int replicaId;
+ private Replica replica;
+ private Response response;
+ private final FEInterface frontEnd;
+ private final Logger log;
+ private ReliableUnicastSender <Response>unicastSender;
+
+ private TotalOrderMulticastReceiver multicastReceiver;
+
+ public ReplicaManager(int replicaId, FEInterface frontEnd) throws IOException {
+ this.replicaId = replicaId;
+ this.frontEnd = frontEnd;
+ this.log = Logger.getLogger(getClass().getName());
+ initReplica();
+ initMulticastReceiver();
+ startHeartbeatThread();
+ }
+
+ private void initReplica() throws IOException {
+ InetSocketAddress frontEndAddress = new InetSocketAddress("localhost", 1999);
+ switch (replicaId)
+ case 1:
+ replica = new Replica1(frontEndAddress);
+ break;
+ case 2:
+ replica = new Replica2( frontEndAddress);
+ break;
+ case 3:
+ replica = new Replica3( frontEndAddress);
+ break;
+ case 4:
+ replica = new Replica4(frontEndAddress);
+ break;
+ replica.startProcess();
+ }
+
+
+
+ private void initMulticastReceiver() throws IOException {
+ InetSocketAddress group = new InetSocketAddress("230.0.0.0", 4446); // Example multicast group and port for receiving requests
+ InetAddress localAddress = InetAddress.getLocalHost(); // Your local address
+ multicastReceiver = new TotalOrderMulticastReceiver<Request>(group, localAddress);
+
+
+ new Thread(() -> {
+ while (true) {
+ try {
+ MessagePayload receivedPayload = multicastReceiver.receive();
+ Request request = (Request) receivedPayload;
+ replica.processRequest(request);
+ } catch (InterruptedException e) {
+ log.severe("Failed to receive request: " + e.getMessage());
+ Thread.currentThread().interrupt();
+ } catch (Exception e) {
+ log.severe("Error processing request: " + e.getMessage());
+ }
+ }
+ }).start();
+ }
+
+
+ private void startHeartbeatThread() {
+ new Thread(() -> {
+ while (true) {
+ if (!replica.isAlive()) {
+ frontEnd.informRmIsDown(replica.getId());
+ replica.restart();
+ }
+ try {
+ Thread.sleep(5000); // Example 5 seconds.
+ } catch (InterruptedException e) {
+ log.severe("Heartbeat thread interrupted: " + e.getMessage());
+ }
+ }
+ }).start();
+ }
+
+ public void sendResponseToFE(Response response) {
+ try {
+ unicastSender.send(response);
+ } catch (IOException e) {
+ log.severe("Failed to send response to FE: " + e.getMessage());
+ }
+ }
+ public void handleByzantineFailure() {
+ log.severe("Byzantine failure detected in Replica " + replica.getId());
+ replica.restart();
+ frontEnd.informRmHasBug(replica.getId());
+ }
+
+
+
+} \ No newline at end of file
diff --git a/src/main/java/derms/ReplicaRunner.java b/src/main/java/derms/ReplicaRunner.java
new file mode 100644
index 0000000..a17fbf1
--- /dev/null
+++ b/src/main/java/derms/ReplicaRunner.java
@@ -0,0 +1,28 @@
+package derms;
+import derms.frontend.FEInterface;
+
+import java.io.IOException;
+
+public class ReplicaRunner {
+ public static void main(String[] args) {
+ if (args.length != 1) {
+ System.err.println("Usage: ReplicaManagerRunner <replica_id>");
+ System.exit(1);
+ }
+
+ int replicaId = Integer.parseInt(args[0]);
+ System.out.println("Starting ReplicaManager for Replica " + replicaId);
+
+ try {
+ FEInterface frontEnd = new FE(); // Assume FE implements FEInterface
+ ReplicaManager replicaManager = new ReplicaManager(replicaId, frontEnd);
+
+ // Simulate receiving and handling client requests
+ // Add logic to listen for client requests and forward them to replicaManager
+
+ } catch (IOException e) {
+ System.err.println("Failed to start ReplicaManager: " + e.getMessage());
+ e.printStackTrace();
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/derms/Request.java b/src/main/java/derms/Request.java
index 8dfca56..4132cfa 100644
--- a/src/main/java/derms/Request.java
+++ b/src/main/java/derms/Request.java
@@ -5,9 +5,138 @@ import derms.net.MessagePayload;
// TODO
public class Request implements MessagePayload {
+
@Override
public int hash() {
// TODO
return -1;
}
+
+ private String function = "";
+ private String clientID = "";
+ private String resourceType = "";
+ private String OldResourceType = "";
+ private String resourceID = "";
+ private String OldResourceID = "";
+ private String FeIpAddress = "FE.FE_IP_Address";
+ private int duration = 0;
+ private int sequenceNumber = 0;
+ private String MessageType = "00";
+ private int retryCount = 1;
+
+ public Request(String function, String clientID) {
+ setFunction(function);
+ setClientID(clientID);
+ }
+
+ public Request(int rmNumber, String bugType) {
+ setMessageType(bugType + rmNumber);
+ }
+
+ public String getFunction() {
+ return function;
+ }
+
+ public void setFunction(String function) {
+ this.function = function;
+ }
+
+ public String getClientID() {
+ return clientID;
+ }
+
+ public void setClientID(String clientID) {
+ this.clientID = clientID;
+ }
+
+ public String getResourceType() {
+ return resourceType;
+ }
+
+ public void setResourceType(String resourceType) {
+ this.resourceType = resourceType;
+ }
+
+ public String getOldResourceType() {
+ return OldResourceType;
+ }
+
+ public void setOldResourceType(String OldResourceType) {
+ this.OldResourceType = OldResourceType;
+ }
+
+ public String getResourceID() {
+ return resourceID;
+ }
+
+ public void setResourceID(String resourceID) {
+ this.resourceID = resourceID;
+ }
+
+ public String getOldResourceID() {
+ return OldResourceID;
+ }
+
+ public void setOldResourceID(String OldResourceID) {
+ this.OldResourceID = OldResourceID;
+ }
+
+ public int getDuration() {
+ return duration;
+ }
+
+ public void setDuration(int duration) {
+ this.duration = duration;
+ }
+
+ public String noRequestSendError() {
+ return "request: " + getFunction() + " from " + getClientID() + " not sent";
+ }
+
+ public int getSequenceNumber() {
+ return sequenceNumber;
+ }
+
+ public void setSequenceNumber(int sequenceNumber) {
+ this.sequenceNumber = sequenceNumber;
+ }
+
+ public String getFeIpAddress() {
+ return FeIpAddress;
+ }
+
+ public void setFeIpAddress(String feIpAddress) {
+ FeIpAddress = feIpAddress;
+ }
+
+ public String getMessageType() {
+ return MessageType;
+ }
+
+ public void setMessageType(String messageType) {
+ MessageType = messageType;
+ }
+
+ public boolean haveRetries() {
+ return retryCount > 0;
+ }
+
+ public void countRetry() {
+ retryCount--;
+ }
+
+ //Message Format: Sequence_id;FrontIpAddress;Message_Type;function(addResource,...);userID; newEventID;newEventType; oldEventID; oldEventType;bookingCapacity
+ @Override
+ public String toString() {
+ return getSequenceNumber() + ";" +
+ getFeIpAddress().toUpperCase() + ";" +
+ getMessageType().toUpperCase() + ";" +
+ getFunction().toUpperCase() + ";" +
+ getClientID().toUpperCase() + ";" +
+ getResourceID().toUpperCase() + ";" +
+ getResourceType().toUpperCase() + ";" +
+ getOldResourceID().toUpperCase() + ";" +
+ getOldResourceType().toUpperCase() + ";" +
+ getDuration();
+ }
}
diff --git a/src/main/java/derms/Response.java b/src/main/java/derms/Response.java
index 3832253..036ea9d 100644
--- a/src/main/java/derms/Response.java
+++ b/src/main/java/derms/Response.java
@@ -10,4 +10,147 @@ public class Response implements MessagePayload {
// TODO
return -1;
}
+ private int sequenceID = 0;
+ private String response = "";
+ private int rmNumber = 0;
+ private String function = "";
+ private String userID = "";
+ private String newResourceID = "";
+ private String newResourceType = "";
+ private String oldResourceID = "";
+ private String oldResourceType = "";
+ private int duration = 0;
+ private String udpMessage = "";
+ private boolean isSuccess = false;
+
+ public Response(String udpMessage) {
+ setUdpMessage(udpMessage.trim());
+ String[] messageParts = getUdpMessage().split(";");
+ setSequenceID(Integer.parseInt(messageParts[0]));
+ setResponse(messageParts[1].trim());
+ setRmNumber(messageParts[2]);
+ setFunction(messageParts[3]);
+ setUserID(messageParts[4]);
+ setNewResourceID(messageParts[5]);
+ setNewResourceType(messageParts[6]);
+ setOldResourceID(messageParts[7]);
+ setOldResourceType(messageParts[8]);
+ setDuration(Integer.parseInt(messageParts[9]));
+ }
+
+ public int getSequenceID() {
+ return sequenceID;
+ }
+
+ public void setSequenceID(int sequenceID) {
+ this.sequenceID = sequenceID;
+ }
+
+ public String getResponse() {
+ return response;
+ }
+
+ public void setResponse(String response) {
+ isSuccess = response.contains("Success:");
+ this.response = response;
+ }
+
+ public int getRmNumber() {
+ return rmNumber;
+ }
+
+ public void setRmNumber(String rmNumber) {
+ if (rmNumber.equalsIgnoreCase("RM1")) {
+ this.rmNumber = 1;
+ } else if (rmNumber.equalsIgnoreCase("RM2")) {
+ this.rmNumber = 2;
+ } else if (rmNumber.equalsIgnoreCase("RM3")) {
+ this.rmNumber = 3;
+ } else {
+ this.rmNumber = 0;
+ }
+ }
+
+ public String getFunction() {
+ return function;
+ }
+
+ public void setFunction(String function) {
+ this.function = function;
+ }
+
+ public String getUserID() {
+ return userID;
+ }
+
+ public void setUserID(String userID) {
+ this.userID = userID;
+ }
+
+ public String getNewResourceID() {
+ return newResourceID;
+ }
+
+ public void setNewResourceID(String newEventID) {
+ this.newResourceID = newEventID;
+ }
+
+ public String getNewResourceType() {
+ return newResourceType;
+ }
+
+ public void setNewResourceType(String newEventType) {
+ this.newResourceType = newEventType;
+ }
+
+ public String getOldResourceID() {
+ return oldResourceID;
+ }
+
+ public void setOldResourceID(String oldEventID) {
+ this.oldResourceID = oldEventID;
+ }
+
+ public String getOldResourceType() {
+ return oldResourceType;
+ }
+
+ public void setOldResourceType(String oldEventType) {
+ this.oldResourceType = oldEventType;
+ }
+
+ public int getDuration() {
+ return duration;
+ }
+
+ public void setDuration(int bookingCapacity) {
+ this.duration = bookingCapacity;
+ }
+
+ public String getUdpMessage() {
+ return udpMessage;
+ }
+
+ public void setUdpMessage(String udpMessage) {
+ this.udpMessage = udpMessage;
+ }
+
+ public boolean isSuccess() {
+ return isSuccess;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj != null) {
+ if (obj instanceof RmResponse) {
+ RmResponse obj1 = (RmResponse) obj;
+ return obj1.getFunction().equalsIgnoreCase(this.getFunction())
+ && obj1.getSequenceID() == this.getSequenceID()
+ && obj1.getUserID().equalsIgnoreCase(this.getUserID())
+ && obj1.isSuccess() == this.isSuccess();
+// && obj1.getResponse().equalsIgnoreCase(this.getResponse());
+ }
+ }
+ return false;
+ }
}
diff --git a/src/main/java/derms/frontend/DERMSServerImpl.java b/src/main/java/derms/frontend/DERMSServerImpl.java
index 67dd8c5..4008278 100644
--- a/src/main/java/derms/frontend/DERMSServerImpl.java
+++ b/src/main/java/derms/frontend/DERMSServerImpl.java
@@ -21,7 +21,8 @@ import javax.jws.soap.SOAPBinding.Style;
//import constants.PortConstants;
//import validation.ValidationService;
//import interfaces.DERMSInterface;
-
+import derms.Request;
+import derms.Response;
@WebService(endpointInterface = "derms.frontend.DERMSInterface")
public class DERMSServerImpl implements DERMSInterface {
@@ -38,7 +39,7 @@ public class DERMSServerImpl implements DERMSInterface {
private long startTime;
private CountDownLatch latch;
private FEInterface inter = null;
- private final List<RmResponse> responses = new ArrayList<>();
+ private final List<Response> responses = new ArrayList<>();
public DERMSServerImpl() {
super();
@@ -51,72 +52,72 @@ public class DERMSServerImpl implements DERMSInterface {
@Override
public synchronized String addResource(String resourceID, String resourceName, int duration) {
- MyRequest myRequest = new MyRequest("addResource", "");
- myRequest.setResourceID(resourceID);
- myRequest.setResourceType(resourceName);
- myRequest.setDuration(duration);
- myRequest.setSequenceNumber(sendUdpUnicastToSequencer(myRequest));
- System.out.println("FE Implementation:addEvent>>>" + myRequest.toString());
- return validateResponses(myRequest);
+ Request request = new Request("addResource", "");
+ request.setResourceID(resourceID);
+ request.setResourceType(resourceName);
+ request.setDuration(duration);
+ request.setSequenceNumber(sendUdpUnicastToSequencer(request));
+ System.out.println("FE Implementation:addEvent>>>" + request.toString());
+ return validateResponses(request);
}
@Override
public synchronized String removeResource(String resourceID, int duration) {
- MyRequest myRequest = new MyRequest("removeResource", "");
- myRequest.setResourceID(resourceID);
- myRequest.setDuration(duration);
- myRequest.setSequenceNumber(sendUdpUnicastToSequencer(myRequest));
- System.out.println("FE Implementation:removeEvent>>>" + myRequest.toString());
- return validateResponses(myRequest);
+ Request request = new Request("removeResource", "");
+ request.setResourceID(resourceID);
+ request.setDuration(duration);
+ request.setSequenceNumber(sendUdpUnicastToSequencer(request));
+ System.out.println("FE Implementation:removeEvent>>>" + request.toString());
+ return validateResponses(request);
}
@Override
public synchronized String listResourceAvailability(String resourceName) {
- MyRequest myRequest = new MyRequest("listEventAvailability", "");
- myRequest.setResourceType(resourceName);
- myRequest.setSequenceNumber(sendUdpUnicastToSequencer(myRequest));
- System.out.println("FE Implementation:listEventAvailability>>>" + myRequest.toString());
- return validateResponses(myRequest);
+ Request request = new Request("listEventAvailability", "");
+ request.setResourceType(resourceName);
+ request.setSequenceNumber(sendUdpUnicastToSequencer(request));
+ System.out.println("FE Implementation:listEventAvailability>>>" + request.toString());
+ return validateResponses(request);
}
@Override
public synchronized String requestResource(String coordinatorID, String resourceID, int duration) {
- MyRequest myRequest = new MyRequest("requestResource", coordinatorID);
- myRequest.setResourceID(resourceID);
- myRequest.setDuration(duration);
- myRequest.setSequenceNumber(sendUdpUnicastToSequencer(myRequest));
- System.out.println("FE Implementation:bookEvent>>>" + myRequest.toString());
- return validateResponses(myRequest);
+ Request request = new Request("requestResource", coordinatorID);
+ request.setResourceID(resourceID);
+ request.setDuration(duration);
+ request.setSequenceNumber(sendUdpUnicastToSequencer(request));
+ System.out.println("FE Implementation:bookEvent>>>" + request.toString());
+ return validateResponses(request);
}
@Override
public synchronized String findResource(String coordinatorID, String resourceName) {
- MyRequest myRequest = new MyRequest("findResource", coordinatorID);
- myRequest.setResourceType(resourceName);
- myRequest.setSequenceNumber(sendUdpUnicastToSequencer(myRequest));
- System.out.println("FE Implementation:bookEvent>>>" + myRequest.toString());
- return validateResponses(myRequest);
+ Request request = new Request("findResource", coordinatorID);
+ request.setResourceType(resourceName);
+ request.setSequenceNumber(sendUdpUnicastToSequencer(request));
+ System.out.println("FE Implementation:bookEvent>>>" + request.toString());
+ return validateResponses(request);
}
@Override
public synchronized String returnResource(String coordinatorID, String resourceID) {
- MyRequest myRequest = new MyRequest("findResource", coordinatorID);
- myRequest.setResourceID(resourceID);
- myRequest.setSequenceNumber(sendUdpUnicastToSequencer(myRequest));
- System.out.println("FE Implementation:bookEvent>>>" + myRequest.toString());
- return validateResponses(myRequest);
+ Request request = new Request("findResource", coordinatorID);
+ request.setResourceID(resourceID);
+ request.setSequenceNumber(sendUdpUnicastToSequencer(request));
+ System.out.println("FE Implementation:bookEvent>>>" + request.toString());
+ return validateResponses(request);
}
@Override
public synchronized String swapResource(String coordinatorID, String oldResourceID, String oldResourceType, String newResourceID, String newResourceType) {
- MyRequest myRequest = new MyRequest("swapResource", coordinatorID);
- myRequest.setResourceID(newResourceID);
- myRequest.setResourceType(newResourceType);
- myRequest.setOldResourceID(oldResourceID);
- myRequest.setOldResourceType(oldResourceType);
- myRequest.setSequenceNumber(sendUdpUnicastToSequencer(myRequest));
- System.out.println("FE Implementation:swapEvent>>>" + myRequest.toString());
- return validateResponses(myRequest);
+ Request request = new Request("swapResource", coordinatorID);
+ request.setResourceID(newResourceID);
+ request.setResourceType(newResourceType);
+ request.setOldResourceID(oldResourceID);
+ request.setOldResourceType(oldResourceType);
+ request.setSequenceNumber(sendUdpUnicastToSequencer(request));
+ System.out.println("FE Implementation:swapEvent>>>" + request.toString());
+ return validateResponses(request);
}
public void waitForResponse() {
@@ -128,26 +129,26 @@ public class DERMSServerImpl implements DERMSInterface {
}
} catch (InterruptedException e) {
e.printStackTrace();
-// inter.sendRequestToSequencer(myRequest);
+// inter.sendRequestToSequencer(request);
}
// check result and react correspondingly
}
- private String validateResponses(MyRequest myRequest) {
+ private String validateResponses(Request request) {
String resp;
switch ((int) latch.getCount()) {
case 0:
case 1:
case 2:
case 3:
- resp = findMajorityResponse(myRequest);
+ resp = findMajorityResponse(request);
break;
case 4:
resp = "Fail: No response from any server";
System.out.println(resp);
- if (myRequest.haveRetries()) {
- myRequest.countRetry();
- resp = retryRequest(myRequest);
+ if (request.haveRetries()) {
+ request.countRetry();
+ resp = retryRequest(request);
}
rmDown(1);
rmDown(2);
@@ -155,20 +156,20 @@ public class DERMSServerImpl implements DERMSInterface {
rmDown(4);
break;
default:
- resp = "Fail: " + myRequest.noRequestSendError();
+ resp = "Fail: " + request.noRequestSendError();
break;
}
System.out.println("FE Implementation:validateResponses>>>Responses remain:" + latch.getCount() + " >>>Response to be sent to client " + resp);
return resp;
}
- private String findMajorityResponse(MyRequest myRequest) {
- RmResponse res1 = null;
- RmResponse res2 = null;
- RmResponse res3 = null;
- RmResponse res4 = null;
- for (RmResponse response :responses) {
- if (response.getSequenceID() == myRequest.getSequenceNumber()) {
+ private String findMajorityResponse(Request request) {
+ Response res1 = null;
+ Response res2 = null;
+ Response res3 = null;
+ Response res4 = null;
+ for (Response response :responses) {
+ if (response.getSequenceID() == request.getSequenceNumber()) {
switch (response.getRmNumber()) {
case 1:
res1 = response;
@@ -197,12 +198,12 @@ public class DERMSServerImpl implements DERMSInterface {
if (res4 == null) rmDown(4);
// Majority voting logic
- List<RmResponse> validResponses = Arrays.asList(res1, res2, res3, res4).stream()
+ List<Response> validResponses = Arrays.asList(res1, res2, res3, res4).stream()
.filter(Objects::nonNull)
.collect(Collectors.toList());
Map<String, Long> responseCounts = validResponses.stream()
- .collect(Collectors.groupingBy(RmResponse::getResponse, Collectors.counting()));
+ .collect(Collectors.groupingBy(Response::getResponse, Collectors.counting()));
// Find the response with the highest count
Optional<Map.Entry<String, Long>> majorityEntry = responseCounts.entrySet().stream()
@@ -319,7 +320,7 @@ public class DERMSServerImpl implements DERMSInterface {
System.out.println("FE Implementation:notifyOKCommandReceived>>>Response Received: Remaining responses" + latch.getCount());
}
- public void addReceivedResponse(RmResponse res) {
+ public void addReceivedResponse(Response res) {
long endTime = System.nanoTime();
responseTime = (endTime - startTime) / 1000000;
System.out.println("Current Response time is: " + responseTime);
@@ -327,22 +328,22 @@ public class DERMSServerImpl implements DERMSInterface {
notifyOKCommandReceived();
}
- private int sendUdpUnicastToSequencer(MyRequest myRequest) {
+ private int sendUdpUnicastToSequencer(Request request) {
startTime = System.nanoTime();
- int sequenceNumber = inter.sendRequestToSequencer(myRequest);
- myRequest.setSequenceNumber(sequenceNumber);
+ int sequenceNumber = inter.sendRequestToSequencer(request);
+ request.setSequenceNumber(sequenceNumber);
latch = new CountDownLatch(4);
waitForResponse();
return sequenceNumber;
}
- private String retryRequest(MyRequest myRequest) {
- System.out.println("FE Implementation:retryRequest>>>" + myRequest.toString());
+ private String retryRequest(Request request) {
+ System.out.println("FE Implementation:retryRequest>>>" + request.toString());
startTime = System.nanoTime();
- inter.retryRequest(myRequest);
+ inter.retryRequest(request);
latch = new CountDownLatch(4);
waitForResponse();
- return validateResponses(myRequest);
+ return validateResponses(request);
}
diff --git a/src/main/java/derms/frontend/FE.java b/src/main/java/derms/frontend/FE.java
index e49dd61..decea07 100644
--- a/src/main/java/derms/frontend/FE.java
+++ b/src/main/java/derms/frontend/FE.java
@@ -7,6 +7,8 @@ import java.net.InetAddress;
import java.net.SocketException;
import javax.xml.ws.Endpoint;
+import derms.Request;
+import derms.Response;
//import constants.Constants;
@@ -20,8 +22,8 @@ public class FE {
private static final int RM_Multicast_Port = 1234;
public static String FE_Address = "http://localhost:8067/service/FE";
private static final String FE_IP_Address = "";
-
-
+
+
// public static String FE_IP_Address = "localhost";
public static void main(String[] args) {
@@ -30,7 +32,7 @@ public class FE {
@Override
public void informRmHasBug(int RmNumber) {
// String errorMessage = new MyRequest(RmNumber, "1").toString();
- MyRequest errorMessage = new MyRequest(RmNumber, "1");
+ Request errorMessage = new Request(RmNumber, "1");
System.out.println("Rm:" + RmNumber + "has bug");
// sendMulticastFaultMessageToRms(errorMessage);
sendUnicastToSequencer(errorMessage);
@@ -39,21 +41,21 @@ public class FE {
@Override
public void informRmIsDown(int RmNumber) {
// String errorMessage = new MyRequest(RmNumber, "2").toString();
- MyRequest errorMessage = new MyRequest(RmNumber, "2");
+ Request errorMessage = new Request(RmNumber, "2");
System.out.println("Rm:" + RmNumber + "is down");
// sendMulticastFaultMessageToRms(errorMessage);
sendUnicastToSequencer(errorMessage);
}
@Override
- public int sendRequestToSequencer(MyRequest myRequest) {
+ public int sendRequestToSequencer(Request myRequest) {
return sendUnicastToSequencer(myRequest);
}
@Override
- public void retryRequest(MyRequest myRequest) {
+ public void retryRequest(Request request) {
System.out.println("No response from all Rms, Retrying request...");
- sendUnicastToSequencer(myRequest);
+ sendUnicastToSequencer(request);
}
};
DERMSServerImpl servant = new DERMSServerImpl(inter);
@@ -75,7 +77,7 @@ public class FE {
}
- private static int sendUnicastToSequencer(MyRequest requestFromClient) {
+ private static int sendUnicastToSequencer(Request requestFromClient) {
DatagramSocket aSocket = null;
String dataFromClient = requestFromClient.toString();
System.out.println("FE:sendUnicastToSequencer>>>" + dataFromClient);
@@ -154,7 +156,7 @@ public class FE {
String sentence = new String(response.getData(), 0,
response.getLength()).trim();
System.out.println("FE:Response received from Rm>>>" + sentence);
- RmResponse rmResponse = new RmResponse(sentence);
+ Response rmResponse = new Response(sentence);
// String[] parts = sentence.split(";");
System.out.println("Adding response to FrontEndImplementation:");
diff --git a/src/main/java/derms/frontend/FEInterface.java b/src/main/java/derms/frontend/FEInterface.java
index 5a4e6f1..292f960 100644
--- a/src/main/java/derms/frontend/FEInterface.java
+++ b/src/main/java/derms/frontend/FEInterface.java
@@ -1,11 +1,12 @@
package derms.frontend;
+import derms.Request;
public interface FEInterface {
- void informRmHasBug(int RmNumber);
+ void informRmHasBug(int replicaId);
- void informRmIsDown(int RmNumber);
+ void informRmIsDown(int replicaId);
- int sendRequestToSequencer(MyRequest myRequest);
+ int sendRequestToSequencer(Request request);
- void retryRequest(MyRequest myRequest);
+ void retryRequest(Request request);
} \ No newline at end of file
diff --git a/src/main/java/derms/frontend/MyRequest.java b/src/main/java/derms/frontend/MyRequest.java
deleted file mode 100644
index b0f2758..0000000
--- a/src/main/java/derms/frontend/MyRequest.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package derms.frontend;
-
-public class MyRequest {
- private String function = "";
- private String clientID = "";
- private String resourceType = "";
- private String OldResourceType = "";
- private String resourceID = "";
- private String OldResourceID = "";
- private String FeIpAddress = "FE.FE_IP_Address";
- private int duration = 0;
- private int sequenceNumber = 0;
- private String MessageType = "00";
- private int retryCount = 1;
-
- public MyRequest(String function, String clientID) {
- setFunction(function);
- setClientID(clientID);
- }
-
- public MyRequest(int rmNumber, String bugType) {
- setMessageType(bugType + rmNumber);
- }
-
- public String getFunction() {
- return function;
- }
-
- public void setFunction(String function) {
- this.function = function;
- }
-
- public String getClientID() {
- return clientID;
- }
-
- public void setClientID(String clientID) {
- this.clientID = clientID;
- }
-
- public String getResourceType() {
- return resourceType;
- }
-
- public void setResourceType(String resourceType) {
- this.resourceType = resourceType;
- }
-
- public String getOldResourceType() {
- return OldResourceType;
- }
-
- public void setOldResourceType(String OldResourceType) {
- this.OldResourceType = OldResourceType;
- }
-
- public String getResourceID() {
- return resourceID;
- }
-
- public void setResourceID(String resourceID) {
- this.resourceID = resourceID;
- }
-
- public String getOldResourceID() {
- return OldResourceID;
- }
-
- public void setOldResourceID(String OldResourceID) {
- this.OldResourceID = OldResourceID;
- }
-
- public int getDuration() {
- return duration;
- }
-
- public void setDuration(int duration) {
- this.duration = duration;
- }
-
- public String noRequestSendError() {
- return "request: " + getFunction() + " from " + getClientID() + " not sent";
- }
-
- public int getSequenceNumber() {
- return sequenceNumber;
- }
-
- public void setSequenceNumber(int sequenceNumber) {
- this.sequenceNumber = sequenceNumber;
- }
-
- public String getFeIpAddress() {
- return FeIpAddress;
- }
-
- public void setFeIpAddress(String feIpAddress) {
- FeIpAddress = feIpAddress;
- }
-
- public String getMessageType() {
- return MessageType;
- }
-
- public void setMessageType(String messageType) {
- MessageType = messageType;
- }
-
- public boolean haveRetries() {
- return retryCount > 0;
- }
-
- public void countRetry() {
- retryCount--;
- }
-
- //Message Format: Sequence_id;FrontIpAddress;Message_Type;function(addResource,...);userID; newEventID;newEventType; oldEventID; oldEventType;bookingCapacity
- @Override
- public String toString() {
- return getSequenceNumber() + ";" +
- getFeIpAddress().toUpperCase() + ";" +
- getMessageType().toUpperCase() + ";" +
- getFunction().toUpperCase() + ";" +
- getClientID().toUpperCase() + ";" +
- getResourceID().toUpperCase() + ";" +
- getResourceType().toUpperCase() + ";" +
- getOldResourceID().toUpperCase() + ";" +
- getOldResourceType().toUpperCase() + ";" +
- getDuration();
- }
-}
diff --git a/src/main/java/derms/frontend/RmResponse.java b/src/main/java/derms/frontend/RmResponse.java
deleted file mode 100644
index f693375..0000000
--- a/src/main/java/derms/frontend/RmResponse.java
+++ /dev/null
@@ -1,147 +0,0 @@
-package derms.frontend;
-
-public class RmResponse {
- private int sequenceID = 0;
- private String response = "";
- private int rmNumber = 0;
- private String function = "";
- private String userID = "";
- private String newResourceID = "";
- private String newResourceType = "";
- private String oldResourceID = "";
- private String oldResourceType = "";
- private int duration = 0;
- private String udpMessage = "";
- private boolean isSuccess = false;
-
- public RmResponse(String udpMessage) {
- setUdpMessage(udpMessage.trim());
- String[] messageParts = getUdpMessage().split(";");
- setSequenceID(Integer.parseInt(messageParts[0]));
- setResponse(messageParts[1].trim());
- setRmNumber(messageParts[2]);
- setFunction(messageParts[3]);
- setUserID(messageParts[4]);
- setNewResourceID(messageParts[5]);
- setNewResourceType(messageParts[6]);
- setOldResourceID(messageParts[7]);
- setOldResourceType(messageParts[8]);
- setDuration(Integer.parseInt(messageParts[9]));
- }
-
- public int getSequenceID() {
- return sequenceID;
- }
-
- public void setSequenceID(int sequenceID) {
- this.sequenceID = sequenceID;
- }
-
- public String getResponse() {
- return response;
- }
-
- public void setResponse(String response) {
- isSuccess = response.contains("Success:");
- this.response = response;
- }
-
- public int getRmNumber() {
- return rmNumber;
- }
-
- public void setRmNumber(String rmNumber) {
- if (rmNumber.equalsIgnoreCase("RM1")) {
- this.rmNumber = 1;
- } else if (rmNumber.equalsIgnoreCase("RM2")) {
- this.rmNumber = 2;
- } else if (rmNumber.equalsIgnoreCase("RM3")) {
- this.rmNumber = 3;
- } else {
- this.rmNumber = 0;
- }
- }
-
- public String getFunction() {
- return function;
- }
-
- public void setFunction(String function) {
- this.function = function;
- }
-
- public String getUserID() {
- return userID;
- }
-
- public void setUserID(String userID) {
- this.userID = userID;
- }
-
- public String getNewResourceID() {
- return newResourceID;
- }
-
- public void setNewResourceID(String newEventID) {
- this.newResourceID = newEventID;
- }
-
- public String getNewResourceType() {
- return newResourceType;
- }
-
- public void setNewResourceType(String newEventType) {
- this.newResourceType = newEventType;
- }
-
- public String getOldResourceID() {
- return oldResourceID;
- }
-
- public void setOldResourceID(String oldEventID) {
- this.oldResourceID = oldEventID;
- }
-
- public String getOldResourceType() {
- return oldResourceType;
- }
-
- public void setOldResourceType(String oldEventType) {
- this.oldResourceType = oldEventType;
- }
-
- public int getDuration() {
- return duration;
- }
-
- public void setDuration(int bookingCapacity) {
- this.duration = bookingCapacity;
- }
-
- public String getUdpMessage() {
- return udpMessage;
- }
-
- public void setUdpMessage(String udpMessage) {
- this.udpMessage = udpMessage;
- }
-
- public boolean isSuccess() {
- return isSuccess;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (obj != null) {
- if (obj instanceof RmResponse) {
- RmResponse obj1 = (RmResponse) obj;
- return obj1.getFunction().equalsIgnoreCase(this.getFunction())
- && obj1.getSequenceID() == this.getSequenceID()
- && obj1.getUserID().equalsIgnoreCase(this.getUserID())
- && obj1.isSuccess() == this.isSuccess();
-// && obj1.getResponse().equalsIgnoreCase(this.getResponse());
- }
- }
- return false;
- }
-}