diff options
| author | ShazaAhmed <ShazaMamdouh@aucegypt.edu> | 2024-11-28 04:35:42 -0500 |
|---|---|---|
| committer | ShazaAhmed <ShazaMamdouh@aucegypt.edu> | 2024-11-28 04:35:42 -0500 |
| commit | fe384df239711ad0990e39d585e64292816bf24f (patch) | |
| tree | a16d0137d60d813c6ff06f2029ad8a935d2a804e /src | |
| parent | b7dabf61e2f4deea23c9a4cbf33da419d031c5e8 (diff) | |
| download | soen423-fe384df239711ad0990e39d585e64292816bf24f.zip | |
replicas
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/java/derms/Replica1.java | 90 | ||||
| -rw-r--r-- | src/main/java/derms/ReplicaManager.java | 115 | ||||
| -rw-r--r-- | src/main/java/derms/ReplicaRunner.java | 28 | ||||
| -rw-r--r-- | src/main/java/derms/Request.java | 129 | ||||
| -rw-r--r-- | src/main/java/derms/Response.java | 143 | ||||
| -rw-r--r-- | src/main/java/derms/frontend/DERMSServerImpl.java | 137 | ||||
| -rw-r--r-- | src/main/java/derms/frontend/FE.java | 20 | ||||
| -rw-r--r-- | src/main/java/derms/frontend/FEInterface.java | 9 | ||||
| -rw-r--r-- | src/main/java/derms/frontend/MyRequest.java | 131 | ||||
| -rw-r--r-- | src/main/java/derms/frontend/RmResponse.java | 147 |
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; - } -} |