diff --git a/forward/src/main/java/com/olexyn/misp/forward/Forward.java b/forward/src/main/java/com/olexyn/misp/forward/Forward.java index 5c95439..f659b04 100644 --- a/forward/src/main/java/com/olexyn/misp/forward/Forward.java +++ b/forward/src/main/java/com/olexyn/misp/forward/Forward.java @@ -3,14 +3,13 @@ package com.olexyn.misp.forward; import com.olexyn.misp.helper.JsonHelper; import com.olexyn.misp.helper.Ride; import org.apache.commons.io.IOUtils; +import org.json.JSONObject; -import javax.servlet.ServletException; +import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.ObjectOutputStream; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; @@ -31,41 +30,16 @@ public class Forward extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { - final String payload = IOUtils.toString(request.getReader()); - final boolean isJson = JsonHelper.isJson(payload); - boolean hasID = false; - boolean hasRequest = false; - boolean hasData = false; - - if (isJson) { - final Ride ridePayload = new Ride(payload); - hasID = ridePayload.getID() != null; - hasRequest = ridePayload.getRequest() != null; - hasData = ridePayload.getData() != null; - } + Thread handleGetRequestThread = new Thread(() -> { + try { + handleGetRequest(request, response); + } catch (IOException | InterruptedException e) {e.printStackTrace(); } + }); + handleGetRequestThread.setName("handleGetRequestThread"); + handleGetRequestThread.start(); + try {handleGetRequestThread.join(); } catch (InterruptedException ignored) { } - if (isJson && hasID && hasRequest && hasData) { - Thread handleGetRideRequestDataThread = new Thread(() -> { - try { - handleGetRideRequestData(request, response); - } catch (IOException | InterruptedException e) { e.printStackTrace(); } - }); - handleGetRideRequestDataThread.setName("handleGetRideRequestDataThread"); - handleGetRideRequestDataThread.start(); - try {handleGetRideRequestDataThread.join(); } catch (InterruptedException ignored) { } - - } else { - Thread handleGetRequestThread = new Thread(() -> { - try { - handleGetRequest(request, response); - } catch (IOException | InterruptedException e) {e.printStackTrace(); } - }); - handleGetRequestThread.setName("handleGetRequestThread"); - handleGetRequestThread.start(); - try {handleGetRequestThread.join(); } catch (InterruptedException ignored) { } - } - } @@ -80,23 +54,8 @@ public class Forward extends HttpServlet { final Ride ride; - //final ServletInputStream in = request.getInputStream(); - final String parsedRequest = null; //new String(in.readAllBytes()); - byte[] foo = null; - try { - ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); - ObjectOutputStream objOut = new ObjectOutputStream(byteOut); - objOut.writeObject(request); - int br = 0; - foo = byteOut.toByteArray(); - objOut.close(); - byteOut.close(); - br = 1; - - } catch (IOException e) { - int br = 0; - } - int br = 0; + final ServletInputStream in = request.getInputStream(); + final String parsedRequest = new String(in.readAllBytes()); synchronized (available) { @@ -124,9 +83,17 @@ public class Forward extends HttpServlet { synchronized (loaded) { - while (!loaded.containsKey(ride.getID())) { + boolean realcondition = !loaded.containsKey(ride.getID()); + boolean relaxedcondition = loaded.size() == 0; + + while (loaded.size() == 0) { + loaded.notify(); + if (loaded.size() > 0) { + break; + } loaded.wait(); + } @@ -134,7 +101,10 @@ public class Forward extends HttpServlet { // 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()); + Ride badbad__ride = loaded.entrySet().iterator().next().getValue(); + ride.setData(loaded.remove(badbad__ride.getID()).getData()); + //ride.setData(loaded.remove(ride.getID()).getData()); + } response.setStatus(200); @@ -157,9 +127,10 @@ public class Forward extends HttpServlet { * remove Ride from ForwardedData * add Ride to EOL */ - protected void handleGetRideRequestData(HttpServletRequest request, HttpServletResponse response) throws IOException, InterruptedException { - final String jsonPayload = IOUtils.toString(request.getReader()); - final Ride ride = new Ride(jsonPayload); + protected void handlePostRideRequestData(HttpServletRequest request, HttpServletResponse response, String payload) { + + final String _payload = payload; + final Ride ride = new Ride(_payload); synchronized (booked) { booked.remove(ride.getID()); @@ -171,52 +142,95 @@ public class Forward extends HttpServlet { } } + + protected void handlePostAvailable(HttpServletRequest request, HttpServletResponse response) { + JSONObject obj = new JSONObject(); + obj.put("available", available.size()); + + response.setStatus(200); + try { + PrintWriter writer = response.getWriter(); + writer.write(obj.toString()); + writer.flush(); + writer.close(); + } catch (Exception ignored) {} + } + + // ####### // // ####### @Override - public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - Thread handlePostRideThread = new Thread(() -> { - try {handlePostRide(request, response); } catch (IOException | InterruptedException e) { e.printStackTrace(); } - }); - handlePostRideThread.setName("handlePostRideThread"); - handlePostRideThread.start(); - try {handlePostRideThread.join(); } catch (InterruptedException ignored) { } - } + public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + + String payload = IOUtils.toString(request.getReader()); + if (!JsonHelper.isJson(payload)) { return; } + + JSONObject obj = new JSONObject(payload); + + if (obj.has("available")) { + Thread handlePostAvailableT = new Thread(() -> { handlePostAvailable(request, response); }); + handlePostAvailableT.setName("handlePostAvailableT"); + handlePostAvailableT.start(); + try {handlePostAvailableT.join(); } catch (InterruptedException ignored) { } + } + + + boolean hasData = obj.has("data") && obj.getString("data") != null; + + if (obj.has("id") && !hasData) { + Thread handlePostRideT = new Thread(() -> { handlePostRide(request, response); }); + handlePostRideT.setName("handlePostRideT"); + handlePostRideT.start(); + try {handlePostRideT.join(); } catch (InterruptedException ignored) { } + } + + if (obj.has("id") && hasData) { + Thread handlePostRideRequestDataT = new Thread(() -> { handlePostRideRequestData(request, response, payload); }); + handlePostRideRequestDataT.setName("handlePostRideRequestDataT"); + handlePostRideRequestDataT.start(); + try {handlePostRideRequestDataT.join(); } catch (InterruptedException ignored) { } + } + } /** * handle POST (Ride) * add Ride to AvailableRides */ - protected void handlePostRide(HttpServletRequest request, HttpServletResponse response) throws IOException, InterruptedException { + protected void handlePostRide(HttpServletRequest request, HttpServletResponse response) { + try { + String jsonPayload = IOUtils.toString(request.getReader()); - String jsonPayload = IOUtils.toString(request.getReader()); - final Ride ride = new Ride(jsonPayload); - synchronized (available) { - available.put(ride.getID(), ride); - available.notify(); - } + final Ride ride = new Ride(jsonPayload); - // ID is final/threadsafe - while (!(booked.containsKey(ride.getID()))) { - Thread.sleep(500); - } + synchronized (available) { + available.put(ride.getID(), ride); + available.notify(); + } - synchronized (booked) { - //booked.notify(); - //booked.wait(); - ride.setRequest(booked.get(ride.getID()).getRequest()); - } + // ID is final/threadsafe + while (!(booked.containsKey(ride.getID()))) { + Thread.sleep(500); + } - response.setStatus(200); - PrintWriter writer = response.getWriter(); - writer.write(ride.json()); - writer.flush(); - writer.close(); + 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(); + + } catch (Exception ignored) {} } } \ No newline at end of file diff --git a/reverse/src/main/java/com/olexyn/misp/reverse/GetRequestRunnable.java b/reverse/src/main/java/com/olexyn/misp/reverse/GetRequestRunnable.java deleted file mode 100644 index 9f64eb7..0000000 --- a/reverse/src/main/java/com/olexyn/misp/reverse/GetRequestRunnable.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.olexyn.misp.reverse; - -import com.olexyn.misp.helper.Ride; - -import java.io.IOException; - -class GetRequestRunnable implements Runnable { - - final private Reverse reverse; - - public GetRequestRunnable(Reverse reverse) { - this.reverse = reverse; - } - - @Override - public void run() { - while (true) { - synchronized (reverse.booked) { - if (reverse.booked.size() > 0) { - final Ride ride = reverse.booked.entrySet().iterator().next().getValue(); - Thread t = new Thread(() -> { try { reverse.sendGetRequest(ride); } catch (IOException ignored) { } }); - t.start(); - } - } - } - } -} diff --git a/reverse/src/main/java/com/olexyn/misp/reverse/GetRideRequestDataRunnable.java b/reverse/src/main/java/com/olexyn/misp/reverse/GetRideRequestDataRunnable.java deleted file mode 100644 index 8c90c15..0000000 --- a/reverse/src/main/java/com/olexyn/misp/reverse/GetRideRequestDataRunnable.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.olexyn.misp.reverse; - -import com.olexyn.misp.helper.Ride; - -import java.io.IOException; - -class GetRideRequestDataRunnable implements Runnable { - - final private Reverse reverse; - - public GetRideRequestDataRunnable(Reverse reverse) { - this.reverse = reverse; - } - - @Override - public void run() { - while (true) { - synchronized (reverse.loaded) { - if (reverse.loaded.size() > 0) { - final Ride ride = reverse.loaded.entrySet().iterator().next().getValue(); - Thread t = new Thread(() -> { try { reverse.sendGetRideRequestData(ride); } catch (IOException ignored) { } }); - t.start(); - } - } - } - } -} diff --git a/reverse/src/main/java/com/olexyn/misp/reverse/PostRideRunnable.java b/reverse/src/main/java/com/olexyn/misp/reverse/PostRideRunnable.java deleted file mode 100644 index 8c33bd0..0000000 --- a/reverse/src/main/java/com/olexyn/misp/reverse/PostRideRunnable.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.olexyn.misp.reverse; - -import java.io.IOException; - -class PostRideRunnable implements Runnable { - - final private Reverse reverse; - - public PostRideRunnable(Reverse reverse) { - this.reverse = reverse; - } - - @Override - public void run() { - while (true) { - synchronized (reverse.available) { - if (Reverse.AVAILABLE_RIDES < Reverse.AVAILABLE_RIDES_OVERHEAD_TRIGGER) { - - for (int i = Reverse.AVAILABLE_RIDES; i < Reverse.AVAILABLE_RIDES_OVERHEAD; i++) { - Reverse.AVAILABLE_RIDES++; - Thread t = new Thread(() -> { try { reverse.sendPostRide(); } catch (IOException ignored) { } }); - t.start(); - } - } - } - } - } -} diff --git a/reverse/src/main/java/com/olexyn/misp/reverse/Reverse.java b/reverse/src/main/java/com/olexyn/misp/reverse/Reverse.java index d85aeeb..4308045 100644 --- a/reverse/src/main/java/com/olexyn/misp/reverse/Reverse.java +++ b/reverse/src/main/java/com/olexyn/misp/reverse/Reverse.java @@ -2,6 +2,7 @@ package com.olexyn.misp.reverse; import com.olexyn.misp.helper.Ride; +import org.json.JSONObject; import java.io.BufferedReader; import java.io.DataOutputStream; @@ -9,37 +10,22 @@ import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; -import java.util.HashMap; -import java.util.Map; public class Reverse { + + private int available; public String FORWARD_URL = "http://localhost:8090/forward"; public String APP_URL = "http://localhost:8090/app"; - public static int AVAILABLE_RIDES_OVERHEAD_TRIGGER = 1; - public static int AVAILABLE_RIDES_OVERHEAD = 2; - public static int AVAILABLE_RIDES = 0; - - - final Map available = new HashMap<>(); - final Map booked = new HashMap<>(); - final Map loaded = new HashMap<>(); + public void start() throws IOException { - public void start() { - Thread postRideThread = new Thread(new PostRideRunnable(this)); - postRideThread.setName("postRideThread"); - postRideThread.start(); + sendPostAvailable(); + sendPostRide(); - Thread getRequestThread = new Thread(new GetRequestRunnable(this)); - getRequestThread.setName("getRequestThread"); - getRequestThread.start(); - Thread getRideRequestDataThread = new Thread(new GetRideRequestDataRunnable(this)); - getRideRequestDataThread.setName("getRideRequestDataThread"); - getRideRequestDataThread.start(); } @@ -47,68 +33,75 @@ public class Reverse { final Ride ride = new Ride(); - synchronized (available) { + final String result = send("POST", FORWARD_URL, ride.json()); - available.put(ride.getID(), ride); - } - final String result = send("POST", FORWARD_URL, ride.json()); - synchronized (available) { - AVAILABLE_RIDES--; - available.remove(ride.getID()); + String _req = new Ride(result).getRequest(); + String request = (_req == null) ? "" : _req; + ride.setRequest(request); - String _parsed = new Ride(result).getRequest(); - String request = _parsed==null ? "" : _parsed; - ride.setRequest(request); - } - - synchronized (booked) { booked.put(ride.getID(), ride); } + sendGetRequest(ride); } void sendGetRequest(Ride ride) throws IOException { - synchronized (booked) {booked.remove(ride.getID()); } - final String result = send("GET", APP_URL, ride.getRequest()); ride.setData(result); - synchronized (loaded) {loaded.put(ride.getID(), ride); } + sendPostRideRequestData(ride); } - void sendGetRideRequestData(Ride ride) throws IOException { + void sendPostRideRequestData(Ride ride) throws IOException { - synchronized (loaded) {loaded.remove(ride.getID()); } + send("POST", FORWARD_URL, ride.json()); - send("GET", FORWARD_URL, ride.json()); + //sendPostRide(); + + } + void sendPostAvailable() throws IOException { + JSONObject obj = new JSONObject(); + obj.put("available", 0); + String result = send("POST", FORWARD_URL, obj.toString()); + JSONObject resultObj = new JSONObject(result); + available = resultObj.getInt("available"); + } - private String send(String method, String urlString, String body) throws IOException { - if (method.equals("GET")){ - int br =0; - } + + private String send(String method, String urlString, String body) throws IOException { + URL url = new URL(urlString); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod(method); - connection.setDoOutput(true); - DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); - if (body != null) { - outputStream.writeBytes(body); + boolean getToForward = method.equals("GET") && urlString.contains("forward"); + + if (method.equals("POST") || getToForward) { + connection.setDoOutput(true); + + + DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); + + if (body != null) { + outputStream.writeBytes(body); + } + + outputStream.flush(); + outputStream.close(); + } - outputStream.flush(); - outputStream.close(); int i = connection.getResponseCode(); BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); diff --git a/reverse/src/main/java/com/olexyn/misp/reverse/ReverseApp.java b/reverse/src/main/java/com/olexyn/misp/reverse/ReverseApp.java index ccb37df..28d69e2 100644 --- a/reverse/src/main/java/com/olexyn/misp/reverse/ReverseApp.java +++ b/reverse/src/main/java/com/olexyn/misp/reverse/ReverseApp.java @@ -1,9 +1,11 @@ package com.olexyn.misp.reverse; +import java.io.IOException; + public class ReverseApp implements Runnable { - public static void main(String... args) { + public static void main(String... args) throws IOException { new ReverseApp().doRun(); } @@ -11,19 +13,22 @@ public class ReverseApp implements Runnable { @Override public void run() { - doRun(); + try { + doRun(); + } catch (IOException e) { + e.printStackTrace(); + } } - private void doRun() { + private void doRun() throws IOException { Reverse reverse = new Reverse(); reverse.FORWARD_URL = "http://localhost:8090/forward"; reverse.APP_URL = "http://localhost:8090/app"; - Reverse.AVAILABLE_RIDES_OVERHEAD_TRIGGER = 1; - Reverse.AVAILABLE_RIDES_OVERHEAD = 2; + reverse.start(); }