From b37b97ff57e3063ce7d837b3a3946d601df1f5f3 Mon Sep 17 00:00:00 2001 From: Ivan Olexyn Date: Tue, 21 Apr 2020 01:00:12 +0200 Subject: [PATCH] + move method bodies from bridgemock to mispbridge. --- mispbridge/src/core/BridgeServlet.java | 89 +++++++++++++++++++++++-- mispmock/src/core/BridgeMock.java | 90 ++------------------------ 2 files changed, 90 insertions(+), 89 deletions(-) diff --git a/mispbridge/src/core/BridgeServlet.java b/mispbridge/src/core/BridgeServlet.java index 3f31fe9..6427779 100644 --- a/mispbridge/src/core/BridgeServlet.java +++ b/mispbridge/src/core/BridgeServlet.java @@ -1,12 +1,14 @@ package core; import org.apache.commons.io.IOUtils; +import org.json.JSONObject; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; @@ -64,8 +66,54 @@ public class BridgeServlet extends HttpServlet { * send OK (Ride) to public */ protected void handleGetRequest(HttpServletRequest request, HttpServletResponse response) throws IOException, InterruptedException { - // # send OK (Ride) to public - } + final Ride ride; + String parsedRequest = IOUtils.toString(request.getReader()); + final JSONObject obj = new JSONObject(parsedRequest); + parsedRequest = obj.getString("request"); + + synchronized (available) { + + while (available.size() < 1) { + available.notify(); + available.wait(); + } + // ride exists only locally, thus safe + ride = available.entrySet().iterator().next().getValue(); + // ride exists only in "available", access through which is sync, thus safe + available.remove(ride.getID()); + // needed because POST (Ride) wait()s + available.notify(); + } + + synchronized (booked) { + // ride exists only locally, thus safe + booked.put(ride.getID(), ride); + // ride exists only in "booked", access through which is sync, thus safe + ride.setRequest(parsedRequest); + // POST (Ride) wait()s + booked.notify(); + } + + synchronized (loaded) { + + while (!loaded.containsKey(ride.getID())) { + loaded.notify(); + loaded.wait(); + } + + + // CARE this is tricky + // what if ride exists in another map, e.g. "available' + // in that case illegal access is possible + // be carefull to removing ride from all other references, when adding it to "loaded". + ride.setData(loaded.remove(ride.getID()).getData()); + } + + response.setStatus(200); + final PrintWriter writer = response.getWriter(); + writer.write(ride.getData()); + writer.flush(); + writer.close(); } /** @@ -81,7 +129,17 @@ public class BridgeServlet extends HttpServlet { * add Ride to EOL */ protected void handleGetRideRequestData(HttpServletRequest request, HttpServletResponse response) throws IOException, InterruptedException { - // # send OK (EOL) + final String jsonPayload = IOUtils.toString(request.getReader()); + final Ride ride = new Ride(jsonPayload); + + synchronized (booked) { + booked.remove(ride.getID()); + } + + synchronized (loaded) { + loaded.put(ride.getID(), ride); + loaded.notify(); + } } // ####### @@ -103,6 +161,29 @@ public class BridgeServlet extends HttpServlet { * add Ride to AvailableRides */ protected void handlePostRide(HttpServletRequest request, HttpServletResponse response) throws IOException, InterruptedException { - // # send OK (Ride) to mispclient + String jsonPayload = IOUtils.toString(request.getReader()); + final Ride ride = new Ride(jsonPayload); + + synchronized (available) { + available.put(ride.getID(), ride); + available.notify(); + } + + // ID is final/threadsafe + while(!(booked.containsKey(ride.getID()))){ + + } + + synchronized (booked) { + //booked.notify(); + //booked.wait(); + ride.setRequest(booked.get(ride.getID()).getRequest()); + } + + response.setStatus(200); + PrintWriter writer = response.getWriter(); + writer.write(ride.json()); + writer.flush(); + writer.close(); } } \ No newline at end of file diff --git a/mispmock/src/core/BridgeMock.java b/mispmock/src/core/BridgeMock.java index 74ce8c3..d703917 100644 --- a/mispmock/src/core/BridgeMock.java +++ b/mispmock/src/core/BridgeMock.java @@ -29,56 +29,10 @@ public class BridgeMock extends BridgeServlet { protected void handleGetRequest(HttpServletRequest request, HttpServletResponse response) throws IOException, InterruptedException { final ExchangeMock exchange; - final Ride ride; - + synchronized (exchange = ((RequestMock) request).exchange) { - String parsedRequest = IOUtils.toString(request.getReader()); - final JSONObject obj = new JSONObject(parsedRequest); - parsedRequest = obj.getString("request"); - - synchronized (available) { - - while (available.size() < 1) { - available.notify(); - available.wait(); - } - // ride exists only locally, thus safe - ride = available.entrySet().iterator().next().getValue(); - // ride exists only in "available", access through which is sync, thus safe - available.remove(ride.getID()); - // needed because POST (Ride) wait()s - available.notify(); - } - - synchronized (booked) { - // ride exists only locally, thus safe - booked.put(ride.getID(), ride); - // ride exists only in "booked", access through which is sync, thus safe - ride.setRequest(parsedRequest); - // POST (Ride) wait()s - booked.notify(); - } - - synchronized (loaded) { - - while (!loaded.containsKey(ride.getID())) { - loaded.notify(); - loaded.wait(); - } - - - // WIP this is tricky - // what if ride exists in another map, e.g. "available' - // in that case illegal access is possible - // be carefull to removing ride from all other references, when adding it to "loaded". - ride.setData(loaded.remove(ride.getID()).getData()); - } - - exchange.response.setStatus(200); - final PrintWriter writer = exchange.response.getWriter(); - writer.write(ride.getData()); - writer.flush(); - writer.close(); + + super.handleGetRequest(request,response); exchange.notify(); } @@ -103,20 +57,10 @@ public class BridgeMock extends BridgeServlet { synchronized (exchange = ((RequestMock) request).exchange) { - final String jsonPayload = IOUtils.toString(request.getReader()); - final Ride ride = new Ride(jsonPayload); - - synchronized (booked) { - booked.remove(ride.getID()); - } + super.handleGetRideRequestData(request,response); - synchronized (loaded) { - loaded.put(ride.getID(), ride); - loaded.notify(); - } exchange.notify(); } - } @@ -130,33 +74,9 @@ public class BridgeMock extends BridgeServlet { final ExchangeMock exchange; - synchronized (exchange = ((RequestMock) request).exchange) { - String jsonPayload = IOUtils.toString(request.getReader()); - final Ride ride = new Ride(jsonPayload); - - synchronized (available) { - available.put(ride.getID(), ride); - available.notify(); - } - - // ID is final/threadsafe - while(!(booked.containsKey(ride.getID()))){ - - } - - synchronized (booked) { - //booked.notify(); - //booked.wait(); - ride.setRequest(booked.get(ride.getID()).getRequest()); - } - - exchange.response.setStatus(200); - PrintWriter writer = response.getWriter(); - writer.write(ride.json()); - writer.flush(); - writer.close(); + super.handlePostRide(request,response); exchange.notify(); }