diff --git a/mispbridge/src/BridgeServlet.java b/mispbridge/src/BridgeServlet.java index 4935830..cbba038 100644 --- a/mispbridge/src/BridgeServlet.java +++ b/mispbridge/src/BridgeServlet.java @@ -13,8 +13,8 @@ public class BridgeServlet extends HttpServlet { protected static final String MISP_CLIENT_URL = "http://localhost:9090/mispclient/core"; public List availableRides = new ArrayList<>(); - public List deliveredRides = new ArrayList<>(); - protected List deliveredData = new ArrayList<>(); + public List bookedRides = new ArrayList<>(); + protected List loadedRides = new ArrayList<>(); // ####### // @@ -71,7 +71,7 @@ public class BridgeServlet extends HttpServlet { * remove Ride from ForwardedData * add Ride to EOL */ - protected void handleGetRideRequestData(HttpServletRequest request, HttpServletResponse response) { + protected void handleGetRideRequestData(HttpServletRequest request, HttpServletResponse response) throws IOException, InterruptedException { // # send OK (EOL) } diff --git a/mispclient/src/ClientServlet.java b/mispclient/src/ClientServlet.java index cc7b275..e2bdf17 100644 --- a/mispclient/src/ClientServlet.java +++ b/mispclient/src/ClientServlet.java @@ -16,6 +16,8 @@ import java.util.List; public class ClientServlet extends HttpServlet { protected static final String MISP_BRIDGE_URL = "http://localhost:9090/mispbridge/core"; + protected static final String APP_URL = "http://localhost:9090"; + public static final int AVAILABLE_RIDES_OVERHEAD = 1; public List availableRides = new ArrayList<>(); @@ -35,7 +37,7 @@ public class ClientServlet extends HttpServlet { * # send POST (Ride) * Generated by Loop */ - void sendPostRide(Ride oldRide) throws IOException, ServletException { + void sendPostRide(Ride oldRide) throws IOException, ServletException, InterruptedException { HttpURLConnection connection = ConnectionHelper.make("POST", MISP_BRIDGE_URL); @@ -64,7 +66,7 @@ public class ClientServlet extends HttpServlet { /** * # send GET (Request) to App */ - Ride sendGetRequest(Ride oldRide) throws IOException { + void sendGetRequest(Ride oldRide) throws IOException { // send FOO // TODO make sure as many as possible tyes of requests can be forwarded. @@ -79,14 +81,14 @@ public class ClientServlet extends HttpServlet { newRide.setData(data); loadedRides.add(newRide); sendGetRideRequestData(newRide); - return newRide; + } /** * # send GET (Ride)(Request)(Data) */ - Ride sendGetRideRequestData(Ride oldRide) throws IOException { + void sendGetRideRequestData(Ride oldRide) throws IOException { HttpURLConnection connection = ConnectionHelper.make("GET", MISP_BRIDGE_URL); @@ -106,7 +108,6 @@ public class ClientServlet extends HttpServlet { loadedRides.remove(oldRide); } } - return null; } @@ -130,7 +131,7 @@ class PostRideRunnable implements Runnable { public void run() { while (true) { if (clientServlet.availableRides.size() < ClientServlet.AVAILABLE_RIDES_OVERHEAD) { - try {clientServlet.sendPostRide(new Ride());} catch (IOException | ServletException e) { e.printStackTrace(); } + try {clientServlet.sendPostRide(new Ride());} catch (IOException | ServletException | InterruptedException e) { e.printStackTrace(); } } try {Thread.sleep(500);} catch (InterruptedException e) { e.printStackTrace(); } } diff --git a/misphelper/src/ConnectionHelper.java b/misphelper/src/ConnectionHelper.java index c85ecf8..66159ff 100644 --- a/misphelper/src/ConnectionHelper.java +++ b/misphelper/src/ConnectionHelper.java @@ -19,11 +19,15 @@ public class ConnectionHelper { public static Ride parseRide(HttpURLConnection connection) throws IOException { + return new Ride(parseString(connection)); + } + + public static String parseString(HttpURLConnection connection) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String out; StringBuilder sb = new StringBuilder(); while ((out = in.readLine()) != null) { sb.append(out); } in.close(); - return new Ride(sb.toString()); + return sb.toString(); } } diff --git a/misphelper/src/Ride.java b/misphelper/src/Ride.java index bc36888..d1e30d1 100644 --- a/misphelper/src/Ride.java +++ b/misphelper/src/Ride.java @@ -17,8 +17,8 @@ public class Ride { rideID = "" + count++; } - public Ride(String json){ - json = json.replace("{","").replace("}",""); + public Ride(String json) { + json = json.replace("{", "").replace("}", ""); String[] split = json.split(","); rideID = split[0].split(":")[1]; request = split[1].split(":")[1]; @@ -26,42 +26,44 @@ public class Ride { } - - public void setRequest(String request) { this.request = request; } - public void setData(String data){ + public void setData(String data) { this.data = data; } - public String getRequest(){ + public String getRequest() { return this.request; } - public String getData(){ + public String getData() { return this.data; } - public String getRideID(){ + public String getRideID() { return this.rideID; } - private String brace(String foo){ - return "\""+foo+"\""; + private String brace(String foo) { + return "\"" + foo + "\""; } - public String json(){ - String[] keys = {"rideID", "request", "data"}; - String[] values = { rideID, request, data}; + public String json() { + String[] keys = {"rideID", + "request", + "data"}; + String[] values = {rideID, + request, + data}; StringBuilder sb = new StringBuilder(); sb.append("{"); - for (int i =0; i 0)) { Thread.sleep(100); } + RequestMock mockRequest = (RequestMock) request; + ExchangeMock exchange = mockRequest.exchange; - Ride ride = availableRides.remove(0); - deliveredRides.add(ride); + synchronized (exchange) { + String parsedRequest = IOUtils.toString(request.getReader()); - while (ride.getData() == null) { - ride.notify(); - ride.wait(); - } + while (!(availableRides.size() > 0)) { Thread.sleep(100); } + Ride ride = availableRides.remove(0); - PrintWriter writer = response.getWriter(); - writer.print(ride.getData()); + synchronized (ride) { + ride.setRequest(parsedRequest); + bookedRides.add(ride); - } + while (ride.getData()==null) { + ride.notify(); + Thread.sleep(100); + ride.wait(); + } + exchange.response.setStatus(200); + PrintWriter writer = exchange.response.getWriter(); + writer.print(ride.getData()); + loadedRides.remove(ride); - /** - * handle GET (Ride) - * if Ride in ReservedRides, - * remove Ride from ReservedRides - * add Ride to Deliveredrides - */ - protected void handleGetRide(HttpServletRequest request, HttpServletResponse response) { - // # send OK (Ride)(Request) - new Ride(); + ride.notify(); + } + exchange.notify(); + } } - /** - * handle GET (Ride)(Request) - * if Ride in DeliveredRides - * remove Ride from DeliveredRides - * add Ride to NewRequest - * send OK (Ride)(Request) - * remove Ride from NewRequest - * add Ride to ForwardedRequest - */ - protected Ride handleGetRideRequest(HttpServletRequest request, HttpServletResponse response) { - // # send OK (Ride)(Request)(Data) - return new Ride(); - } + + + + /** @@ -95,9 +89,32 @@ public class BridgeMock extends BridgeServlet { * remove Ride from ForwardedData * add Ride to EOL */ - protected void handleGetRideRequestData(HttpServletRequest request, HttpServletResponse response) { - // # send OK (EOL) - new Ride(); + protected void handleGetRideRequestData(HttpServletRequest request, HttpServletResponse response) throws IOException, InterruptedException { + RequestMock mockRequest = (RequestMock) request; + ExchangeMock exchange = mockRequest.exchange; + + synchronized (exchange) { + String jsonPayload = IOUtils.toString(request.getReader()); + Ride ride = new Ride(jsonPayload); + + synchronized (ride) { + bookedRides.remove(ride); + + while (!bookedRides.contains(ride)) { + ride.notify(); + Thread.sleep(100); + ride.wait(); + } + + + exchange.response.setStatus(200); + PrintWriter writer = response.getWriter(); + writer.print(ride.json()); + exchange.notify(); + } + + } + } // ####### @@ -112,29 +129,38 @@ public class BridgeMock extends BridgeServlet { /** * handle POST (Ride) - * add Ride to AvailableRides + * - wait for Ride to be booked + * - send OK to Client */ @Override protected void handlePostRide(HttpServletRequest request, HttpServletResponse response) throws IOException, InterruptedException { - // WIP wait till GET (LINK) arrives. - String jsonPayload = IOUtils.toString(request.getReader()); - Ride ride = new Ride(jsonPayload); - availableRides.add(ride); - synchronized (ride){ + RequestMock mockRequest = (RequestMock) request; + ExchangeMock exchange = mockRequest.exchange; - while (availableRides.contains(ride)){ - ride.notify(); - Thread.sleep(100); - ride.wait(); + synchronized (exchange) { + String jsonPayload = IOUtils.toString(request.getReader()); + Ride ride = new Ride(jsonPayload); + + + synchronized (ride) { + availableRides.add(ride); + while (!bookedRides.contains(ride)) { + ride.notify(); + Thread.sleep(100); + ride.wait(); + } + + + exchange.response.setStatus(200); + PrintWriter writer = response.getWriter(); + writer.print(ride.json()); + exchange.notify(); } - // SUPER ILLEGAL MOCKING - response.setStatus(200); - PrintWriter writer = response.getWriter(); - writer.print(ride.json()); } + } diff --git a/mispmock/src/ClientMock.java b/mispmock/src/ClientMock.java index 4a0559d..b70b6b4 100644 --- a/mispmock/src/ClientMock.java +++ b/mispmock/src/ClientMock.java @@ -1,8 +1,9 @@ -import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.mock.web.MockHttpServletResponse; +import exchange.ExchangeMock; import javax.servlet.ServletException; +import java.io.DataOutputStream; import java.io.IOException; +import java.net.HttpURLConnection; /** * Wraps a ClientServlet so it can be debugged easily, i.e. without running Tomcat. @@ -18,21 +19,94 @@ public class ClientMock extends ClientServlet { } @Override - void sendPostRide(Ride oldRide) throws IOException, ServletException { - // SUPER ILLEGAL MOCKING - MockHttpServletRequest request = new MockHttpServletRequest(); + void sendPostRide(Ride ride) throws IOException, ServletException, InterruptedException { - request.setMethod("POST"); - request.setContentType("application/json"); - String payload = oldRide.json(); - request.setContent(payload.getBytes()); + availableRides.add(ride); - MockHttpServletResponse response = new MockHttpServletResponse(); + // Mock Exchange + ExchangeMock exchange = new ExchangeMock(); + + exchange.request.setMethod("POST"); + exchange.request.setContentType("application/json"); + exchange.request.setContent(ride.json().getBytes()); + + synchronized (exchange){ + // Mock POST (Ride) + mockSet.bridgeMock.doPost(exchange.request,exchange.response); + exchange.notify(); + exchange.wait(); + + // handle OK (Ride)(Request) + Ride parsedRide = new Ride(exchange.response.getContentAsString()); + ride.setRequest(parsedRide.getRequest()); + int i = availableRides.indexOf(ride); + bookedRides.add(availableRides.remove(i)); + sendGetRequest(ride); + } + + + + } + + + /** + * # send GET (Request) to App + */ + @Override + void sendGetRequest(Ride oldRide) throws IOException { + + HttpURLConnection connection = ConnectionHelper.make("GET", APP_URL); + + // send GET (Request) availableRides.add(oldRide); - mockSet.bridgeMock.doPost(request,response); + connection.setDoOutput(true); + DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); + outputStream.writeBytes(oldRide.getRequest()); + outputStream.flush(); + outputStream.close(); + + // handle OK (Data) + // remove Ride from BookedRides + // add Ride to LoadedRides + // send GET (Ride)(Data) + if (connection.getResponseCode() == 200) { + String parsedData = ConnectionHelper.parseString(connection); + oldRide.setData(parsedData); + int i = bookedRides.indexOf(oldRide); + loadedRides.add(bookedRides.remove(i)); + } + + sendGetRideRequestData(oldRide); + + + + } + /** + * # send GET (Ride)(Request)(Data) + */ + @Override + void sendGetRideRequestData(Ride oldRide) throws IOException { + + HttpURLConnection connection = ConnectionHelper.make("GET", MISP_BRIDGE_URL); + // send GET (Ride)(Request)(Data) + connection.setDoOutput(true); + DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); + outputStream.writeBytes(oldRide.json()); + outputStream.flush(); + outputStream.close(); + + // handle OK (EOL) + // remove Ride from LoadedRides + if (connection.getResponseCode() == 200) { + Ride shellIdRide = ConnectionHelper.parseRide(connection); + if (shellIdRide.getRideID() != null) { + loadedRides.remove(oldRide); + } + } + } } \ No newline at end of file