+ prep for querying # of available rides from forward.

pull/1/head
Ivan Olexyn 5 years ago
parent f6559a73de
commit 55abcbbba1

@ -3,14 +3,13 @@ package com.olexyn.misp.forward;
import com.olexyn.misp.helper.JsonHelper; import com.olexyn.misp.helper.JsonHelper;
import com.olexyn.misp.helper.Ride; import com.olexyn.misp.helper.Ride;
import org.apache.commons.io.IOUtils; 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.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -31,31 +30,6 @@ public class Forward extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 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;
}
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(() -> { Thread handleGetRequestThread = new Thread(() -> {
try { try {
handleGetRequest(request, response); handleGetRequest(request, response);
@ -64,7 +38,7 @@ public class Forward extends HttpServlet {
handleGetRequestThread.setName("handleGetRequestThread"); handleGetRequestThread.setName("handleGetRequestThread");
handleGetRequestThread.start(); handleGetRequestThread.start();
try {handleGetRequestThread.join(); } catch (InterruptedException ignored) { } try {handleGetRequestThread.join(); } catch (InterruptedException ignored) { }
}
} }
@ -80,23 +54,8 @@ public class Forward extends HttpServlet {
final Ride ride; final Ride ride;
//final ServletInputStream in = request.getInputStream(); final ServletInputStream in = request.getInputStream();
final String parsedRequest = null; //new String(in.readAllBytes()); final String parsedRequest = 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;
synchronized (available) { synchronized (available) {
@ -124,9 +83,17 @@ public class Forward extends HttpServlet {
synchronized (loaded) { synchronized (loaded) {
while (!loaded.containsKey(ride.getID())) { boolean realcondition = !loaded.containsKey(ride.getID());
boolean relaxedcondition = loaded.size() == 0;
while (loaded.size() == 0) {
loaded.notify(); loaded.notify();
if (loaded.size() > 0) {
break;
}
loaded.wait(); loaded.wait();
} }
@ -134,7 +101,10 @@ public class Forward extends HttpServlet {
// what if ride exists in another map, e.g. "available' // what if ride exists in another map, e.g. "available'
// in that case illegal access is possible // in that case illegal access is possible
// be carefull to removing ride from all other references, when adding it to "loaded". // 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); response.setStatus(200);
@ -157,9 +127,10 @@ public class Forward extends HttpServlet {
* remove Ride from ForwardedData * remove Ride from ForwardedData
* add Ride to EOL * add Ride to EOL
*/ */
protected void handleGetRideRequestData(HttpServletRequest request, HttpServletResponse response) throws IOException, InterruptedException { protected void handlePostRideRequestData(HttpServletRequest request, HttpServletResponse response, String payload) {
final String jsonPayload = IOUtils.toString(request.getReader());
final Ride ride = new Ride(jsonPayload); final String _payload = payload;
final Ride ride = new Ride(_payload);
synchronized (booked) { synchronized (booked) {
booked.remove(ride.getID()); booked.remove(ride.getID());
@ -171,29 +142,69 @@ 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 @Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
Thread handlePostRideThread = new Thread(() -> {
try {handlePostRide(request, response); } catch (IOException | InterruptedException e) { e.printStackTrace(); } String payload = IOUtils.toString(request.getReader());
});
handlePostRideThread.setName("handlePostRideThread"); if (!JsonHelper.isJson(payload)) { return; }
handlePostRideThread.start();
try {handlePostRideThread.join(); } catch (InterruptedException ignored) { } 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) * handle POST (Ride)
* add Ride to AvailableRides * 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); final Ride ride = new Ride(jsonPayload);
synchronized (available) { synchronized (available) {
@ -212,11 +223,14 @@ public class Forward extends HttpServlet {
ride.setRequest(booked.get(ride.getID()).getRequest()); ride.setRequest(booked.get(ride.getID()).getRequest());
} }
response.setStatus(200); response.setStatus(200);
PrintWriter writer = response.getWriter(); PrintWriter writer = response.getWriter();
writer.write(ride.json()); writer.write(ride.json());
writer.flush(); writer.flush();
writer.close(); writer.close();
} catch (Exception ignored) {}
} }
} }

@ -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();
}
}
}
}
}

@ -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();
}
}
}
}
}

@ -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();
}
}
}
}
}
}

@ -2,6 +2,7 @@ package com.olexyn.misp.reverse;
import com.olexyn.misp.helper.Ride; import com.olexyn.misp.helper.Ride;
import org.json.JSONObject;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.DataOutputStream; import java.io.DataOutputStream;
@ -9,37 +10,22 @@ import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.URL; import java.net.URL;
import java.util.HashMap;
import java.util.Map;
public class Reverse { public class Reverse {
private int available;
public String FORWARD_URL = "http://localhost:8090/forward"; public String FORWARD_URL = "http://localhost:8090/forward";
public String APP_URL = "http://localhost:8090/app"; 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<Long, Ride> available = new HashMap<>();
final Map<Long, Ride> booked = new HashMap<>();
final Map<Long, Ride> loaded = new HashMap<>();
public void start() throws IOException {
public void start() { sendPostAvailable();
Thread postRideThread = new Thread(new PostRideRunnable(this)); sendPostRide();
postRideThread.setName("postRideThread");
postRideThread.start();
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,60 +33,64 @@ public class Reverse {
final Ride ride = new Ride(); 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 _parsed = new Ride(result).getRequest(); String request = (_req == null) ? "" : _req;
String request = _parsed==null ? "" : _parsed;
ride.setRequest(request); ride.setRequest(request);
}
synchronized (booked) { booked.put(ride.getID(), ride); } sendGetRequest(ride);
} }
void sendGetRequest(Ride ride) throws IOException { void sendGetRequest(Ride ride) throws IOException {
synchronized (booked) {booked.remove(ride.getID()); }
final String result = send("GET", APP_URL, ride.getRequest()); final String result = send("GET", APP_URL, ride.getRequest());
ride.setData(result); ride.setData(result);
synchronized (loaded) {loaded.put(ride.getID(), ride); } sendPostRideRequestData(ride);
} }
void sendGetRideRequestData(Ride ride) throws IOException { void sendPostRideRequestData(Ride ride) throws IOException {
send("POST", FORWARD_URL, ride.json());
//sendPostRide();
synchronized (loaded) {loaded.remove(ride.getID()); } }
send("GET", FORWARD_URL, ride.json());
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 { private String send(String method, String urlString, String body) throws IOException {
if (method.equals("GET")){
int br =0;
}
URL url = new URL(urlString); URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod(method); connection.setRequestMethod(method);
boolean getToForward = method.equals("GET") && urlString.contains("forward");
if (method.equals("POST") || getToForward) {
connection.setDoOutput(true); connection.setDoOutput(true);
DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
if (body != null) { if (body != null) {
@ -110,6 +100,9 @@ public class Reverse {
outputStream.flush(); outputStream.flush();
outputStream.close(); outputStream.close();
}
int i = connection.getResponseCode(); int i = connection.getResponseCode();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String out; String out;

@ -1,9 +1,11 @@
package com.olexyn.misp.reverse; package com.olexyn.misp.reverse;
import java.io.IOException;
public class ReverseApp implements Runnable { public class ReverseApp implements Runnable {
public static void main(String... args) { public static void main(String... args) throws IOException {
new ReverseApp().doRun(); new ReverseApp().doRun();
} }
@ -11,19 +13,22 @@ public class ReverseApp implements Runnable {
@Override @Override
public void run() { public void run() {
try {
doRun(); doRun();
} catch (IOException e) {
e.printStackTrace();
}
} }
private void doRun() { private void doRun() throws IOException {
Reverse reverse = new Reverse(); Reverse reverse = new Reverse();
reverse.FORWARD_URL = "http://localhost:8090/forward"; reverse.FORWARD_URL = "http://localhost:8090/forward";
reverse.APP_URL = "http://localhost:8090/app"; reverse.APP_URL = "http://localhost:8090/app";
Reverse.AVAILABLE_RIDES_OVERHEAD_TRIGGER = 1;
Reverse.AVAILABLE_RIDES_OVERHEAD = 2;
reverse.start(); reverse.start();
} }

Loading…
Cancel
Save