+ bridge waits for user request.

pull/1/head
Ivan Olexyn 5 years ago
parent d133e8ed76
commit 0c0d10f72a

@ -6,15 +6,16 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BridgeServlet extends HttpServlet {
protected static final String MISP_CLIENT_URL = "http://localhost:9090/mispclient/core";
public List<Ride> availableRides = new ArrayList<>();
public List<Ride> bookedRides = new ArrayList<>();
protected List<Ride> loadedRides = new ArrayList<>();
public Map<Long, Ride> rideMap = new HashMap<>();
protected RideMapHelper mapHelper = new RideMapHelper(rideMap);
// #######
//
@ -40,7 +41,13 @@ public class BridgeServlet extends HttpServlet {
boolean hasData = ridePayload.getData() != null;
if (hasReqeust && hasData) {
Thread handleGetRideRequestDataThread = new Thread(() -> handleGetRideRequestData(request, response));
Thread handleGetRideRequestDataThread = new Thread(() -> {
try {
handleGetRideRequestData(request, response);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
});
handleGetRideRequestDataThread.start();
}
}

@ -1,7 +1,3 @@
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
import javax.servlet.ServletException;
@ -9,8 +5,10 @@ import javax.servlet.http.HttpServlet;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
public class ClientServlet extends HttpServlet {
@ -20,9 +18,10 @@ public class ClientServlet extends HttpServlet {
public static final int AVAILABLE_RIDES_OVERHEAD = 1;
public List<Ride> availableRides = new ArrayList<>();
public List<Ride> bookedRides = new ArrayList<>();
public List<Ride> loadedRides = new ArrayList<>();
public Map<Long, Ride> rideMap = new HashMap<>();
protected RideMapHelper mapHelper = new RideMapHelper(rideMap);
public ClientServlet() {
@ -37,15 +36,16 @@ public class ClientServlet extends HttpServlet {
* # send POST (Ride)
* Generated by Loop
*/
void sendPostRide(Ride oldRide) throws IOException, ServletException, InterruptedException {
void sendPostRide(Ride ride) throws IOException, ServletException, InterruptedException {
HttpURLConnection connection = ConnectionHelper.make("POST", MISP_BRIDGE_URL);
// send POST (Ride)
availableRides.add(oldRide);
rideMap.put(ride.getID(), ride.setState(State.AVAILABLE));
connection.setDoOutput(true);
DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
outputStream.writeBytes(oldRide.json());
outputStream.writeBytes(ride.json());
outputStream.flush();
outputStream.close();
@ -54,9 +54,8 @@ public class ClientServlet extends HttpServlet {
// add Ride to ReservedRides
if (connection.getResponseCode() == 200) {
Ride parsedRide = ConnectionHelper.parseRide(connection);
if (parsedRide.equals(oldRide)) {
availableRides.remove(oldRide);
bookedRides.add(parsedRide);
if (parsedRide.equals(ride)) {
ride.setState(State.BOOKED);
}
}
}
@ -66,7 +65,7 @@ public class ClientServlet extends HttpServlet {
/**
* # send GET (Request) to App
*/
void sendGetRequest(Ride oldRide) throws IOException {
void sendGetRequest(Ride ride) throws IOException {
// send FOO
// TODO make sure as many as possible tyes of requests can be forwarded.
@ -76,11 +75,9 @@ public class ClientServlet extends HttpServlet {
// add Ride to PendingData
// send GET (Ride)(Data)
String data = "DATA";
bookedRides.remove(oldRide);
Ride newRide = oldRide;
newRide.setData(data);
loadedRides.add(newRide);
sendGetRideRequestData(newRide);
ride.setData(data);
ride.setState(State.LOADED);
sendGetRideRequestData(ride);
}
@ -99,13 +96,11 @@ public class ClientServlet extends HttpServlet {
outputStream.flush();
outputStream.close();
// handle OK (EOL)
// remove Ride from PendingData
// add Ride to EOl
// handle OK (RIDE)
if (connection.getResponseCode() == 200) {
Ride shellIdRide = ConnectionHelper.parseRide(connection);
if (shellIdRide.getRideID() != null) {
loadedRides.remove(oldRide);
if (shellIdRide.getID() != null) {
rideMap.remove(oldRide.getID());
}
}
}
@ -130,7 +125,17 @@ class PostRideRunnable implements Runnable {
@Override
public void run() {
while (true) {
if (clientServlet.availableRides.size() < ClientServlet.AVAILABLE_RIDES_OVERHEAD) {
long availableRides = 0L;
for (Map.Entry<Long,Ride> entry : clientServlet.rideMap.entrySet()){
if (entry.getValue().getState() == State.AVAILABLE){
availableRides++;
}
}
if (availableRides< ClientServlet.AVAILABLE_RIDES_OVERHEAD) {
try {clientServlet.sendPostRide(new Ride());} catch (IOException | ServletException | InterruptedException e) { e.printStackTrace(); }
}
try {Thread.sleep(500);} catch (InterruptedException e) { e.printStackTrace(); }

@ -4,9 +4,10 @@ public class Ride {
private static long count = 0L;
private String rideID;
private Long id;
private String request;
private String data;
private State state;
// FUTURE it might be possible to use a ride for many requests.
// private List<String> requests = new ArrayList<>();
@ -14,15 +15,16 @@ public class Ride {
public Ride() {
rideID = "" + count++;
id = count++;
}
public Ride(String json) {
json = json.replace("{", "").replace("}", "");
String[] split = json.split(",");
rideID = split[0].split(":")[1];
request = split[1].split(":")[1];
data = split[2].split(":")[1];
String idString = unbrace(split[0].split(":")[1]);
id = Long.parseLong(idString);
request = unbrace(split[1].split(":")[1]);
data = unbrace(split[2].split(":")[1]);
}
@ -34,6 +36,9 @@ public class Ride {
this.data = data;
}
public Ride setState(State state){ this.state = state; return this;}
public String getRequest() {
return this.request;
}
@ -42,19 +47,23 @@ public class Ride {
return this.data;
}
public String getRideID() {
return this.rideID;
public Long getID() {
return this.id;
}
public State getState(){return this.state;}
private String brace(String foo) {
return "\"" + foo + "\"";
}
private String unbrace(String foo){ return foo.replace("\"",""); }
public String json() {
String[] keys = {"rideID",
"request",
"data"};
String[] values = {rideID,
String[] values = {"" + id,
request,
data};
StringBuilder sb = new StringBuilder();
@ -77,11 +86,17 @@ public class Ride {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Ride ride = (Ride) o;
return Objects.equals(rideID, ride.rideID) && Objects.equals(request, ride.request) && Objects.equals(data, ride.data);
return Objects.equals(id, ride.id) && Objects.equals(request, ride.request) && Objects.equals(data, ride.data);
}
@Override
public int hashCode() {
return Objects.hash(rideID, request, data);
return Objects.hash(id, request, data);
}
}

@ -0,0 +1,54 @@
import java.util.List;
import java.util.Map;
public class RideMapHelper {
public Map<Long,Ride> rideMap;
RideMapHelper(Map<Long,Ride> rideMap){
this.rideMap = rideMap;
}
public boolean containsMore(int i, State state){
long availableRides = 0L;
for (Map.Entry<Long,Ride> entry : rideMap.entrySet()){
if (entry.getValue().getState() == state){
availableRides++;
}
if (availableRides > i){
return true;
}
}
return false;
}
public boolean containsLess(int i, State state){
long availableRides = 0L;
for (Map.Entry<Long,Ride> entry : rideMap.entrySet()){
if (entry.getValue().getState() == state){
availableRides++;
}
if (availableRides < i){
return true;
}
}
return false;
}
public Ride pickAvailable(){
for (Map.Entry<Long,Ride> entry : rideMap.entrySet()){
if (entry.getValue().getState() == State.AVAILABLE){
return entry.getValue();
}
}
return null;
}
}

@ -0,0 +1,3 @@
public enum State {
AVAILABLE, BOOKED, LOADED
}

@ -1,4 +1,4 @@
import org.mockito.Mockito;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
@ -49,12 +49,12 @@ public abstract class ActorRunnable implements Runnable {
public void processRequests(HttpServletRequest request) throws IOException, ServletException {
HttpServletResponse response = Mockito.mock(HttpServletResponse.class);
if (request.getMethod().equalsIgnoreCase("GET")) {
doGet(request, response);
doGet(request, null);
} else if (request.getMethod().equalsIgnoreCase("POST")) {
doPost(request, response);
doPost(request, null);
}
}

@ -1,4 +1,4 @@
import org.mockito.Mockito;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@ -20,7 +20,7 @@ public class AppMock extends ActorRunnable {
void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
HttpServletResponse mockResponse = Mockito.mock(HttpServletResponse.class);
//Main.clientRunnable.responses.add(mockResponse);
}

@ -1,12 +1,14 @@
import exchange.ExchangeMock;
import exchange.RequestMock;
import org.apache.commons.io.IOUtils;
import org.springframework.mock.web.MockHttpServletRequest;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
public class BridgeMock extends BridgeServlet {
@ -44,13 +46,16 @@ public class BridgeMock extends BridgeServlet {
synchronized (exchange) {
String parsedRequest = IOUtils.toString(request.getReader());
while (!(availableRides.size() > 0)) { Thread.sleep(100); }
Ride ride = availableRides.remove(0);
while (mapHelper.containsLess(1, State.AVAILABLE)) { Thread.sleep(100); }
Ride ride = mapHelper.pickAvailable();
synchronized (ride) {
ride.setRequest(parsedRequest);
bookedRides.add(ride);
ride.setState(State.BOOKED);
while (ride.getData()==null) {
@ -62,8 +67,7 @@ public class BridgeMock extends BridgeServlet {
exchange.response.setStatus(200);
PrintWriter writer = exchange.response.getWriter();
writer.print(ride.getData());
loadedRides.remove(ride);
ride.setState(State.LOADED);
ride.notify();
}
exchange.notify();
@ -98,21 +102,18 @@ public class BridgeMock extends BridgeServlet {
Ride ride = new Ride(jsonPayload);
synchronized (ride) {
bookedRides.remove(ride);
ride.setState(State.LOADED);
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();
}
rideMap.remove(ride.getID());
ride.notify();
}
exchange.notify();
}
}
@ -124,6 +125,13 @@ public class BridgeMock extends BridgeServlet {
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
super.doPost(request, response);
// RequestMock mockRequest = (RequestMock) request;
// ExchangeMock exchange = mockRequest.exchange;
// synchronized (exchange) {
// super.doPost(request, response);
// }
}
@ -144,8 +152,9 @@ public class BridgeMock extends BridgeServlet {
synchronized (ride) {
availableRides.add(ride);
while (!bookedRides.contains(ride)) {
rideMap.put(ride.getID(), ride.setState(State.AVAILABLE));
while (ride.getState()==State.AVAILABLE) {
ride.notify();
Thread.sleep(100);
ride.wait();

@ -21,7 +21,8 @@ public class ClientMock extends ClientServlet {
@Override
void sendPostRide(Ride ride) throws IOException, ServletException, InterruptedException {
availableRides.add(ride);
rideMap.put(ride.getID(), ride.setState(State.AVAILABLE));
// Mock Exchange
ExchangeMock exchange = new ExchangeMock();
@ -32,15 +33,14 @@ public class ClientMock extends ClientServlet {
synchronized (exchange){
// Mock POST (Ride)
mockSet.bridgeMock.doPost(exchange.request,exchange.response);
exchange.notify();
mockSet.bridgeMock.doPost(exchange.request,exchange.response);
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));
ride.setState(State.BOOKED);
sendGetRequest(ride);
}
@ -53,15 +53,14 @@ public class ClientMock extends ClientServlet {
* # send GET (Request) to App
*/
@Override
void sendGetRequest(Ride oldRide) throws IOException {
void sendGetRequest(Ride ride) throws IOException {
HttpURLConnection connection = ConnectionHelper.make("GET", APP_URL);
// send GET (Request)
availableRides.add(oldRide);
connection.setDoOutput(true);
DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
outputStream.writeBytes(oldRide.getRequest());
outputStream.writeBytes(ride.getRequest());
outputStream.flush();
outputStream.close();
@ -71,12 +70,11 @@ public class ClientMock extends ClientServlet {
// 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));
ride.setData(parsedData);
ride.setState(State.LOADED);
}
sendGetRideRequestData(oldRide);
sendGetRideRequestData(ride);
@ -88,23 +86,23 @@ public class ClientMock extends ClientServlet {
* # send GET (Ride)(Request)(Data)
*/
@Override
void sendGetRideRequestData(Ride oldRide) throws IOException {
void sendGetRideRequestData(Ride ride) 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.writeBytes(ride.json());
outputStream.flush();
outputStream.close();
// handle OK (EOL)
// handle OK (Ride)
// remove Ride from LoadedRides
if (connection.getResponseCode() == 200) {
Ride shellIdRide = ConnectionHelper.parseRide(connection);
if (shellIdRide.getRideID() != null) {
loadedRides.remove(oldRide);
if (shellIdRide.getID() != null) {
rideMap.remove(ride.getID());
}
}
}

@ -8,7 +8,7 @@ public class Main {
MockSet mockSet = new MockSet();
Runnable publicRunnable = new PublicMock(mockSet);
Runnable publicRunnable = new UserMock(mockSet);
Runnable bridgeRunable = new BridgeRunnable(mockSet);
Runnable clientRunnable = new ClientRunnable(mockSet);
Runnable appRunnable = new AppMock(mockSet);

@ -1,5 +1,5 @@
public class MockSet {
PublicMock publicMock;
UserMock userMock;
BridgeMock bridgeMock;
ClientMock clientMock;
AppMock appMock;

@ -2,10 +2,10 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class PublicMock extends ActorRunnable {
public class UserMock extends ActorRunnable {
public PublicMock(MockSet mockSet){
public UserMock(MockSet mockSet){
super(mockSet);
}

@ -2,7 +2,18 @@ package exchange;
import org.springframework.mock.web.MockHttpServletRequest;
public class RequestMock extends MockHttpServletRequest {
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.util.Collection;
/**
* - Contains reference to ExchangeMock
* - Rest is dummy code.
*/
public class RequestMock extends MockHttpServletRequest implements HttpServletRequest {
public ExchangeMock exchange;
@ -10,4 +21,64 @@ public class RequestMock extends MockHttpServletRequest {
super();
this.exchange = exchange;
}
@Override
public boolean authenticate(HttpServletResponse httpServletResponse) throws IOException, ServletException {
return false;
}
@Override
public void login(String s, String s1) throws ServletException {
}
@Override
public void logout() throws ServletException {
}
@Override
public Collection<Part> getParts() throws IOException, ServletException {
return null;
}
@Override
public Part getPart(String s) throws IOException, ServletException {
return null;
}
@Override
public ServletContext getServletContext() {
return null;
}
@Override
public AsyncContext startAsync() throws IllegalStateException {
return null;
}
@Override
public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException {
return null;
}
@Override
public boolean isAsyncStarted() {
return false;
}
@Override
public boolean isAsyncSupported() {
return false;
}
@Override
public AsyncContext getAsyncContext() {
return null;
}
@Override
public DispatcherType getDispatcherType() {
return null;
}
}

@ -3,7 +3,20 @@ package exchange;
import org.springframework.mock.web.MockHttpServletResponse;
public class ResponseMock extends MockHttpServletResponse {
import javax.servlet.ServletOutputStream;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.Locale;
import java.util.Set;
/**
* - Contains reference to ExchangeMock
* - Rest is dummy code.
*/
public class ResponseMock extends MockHttpServletResponse implements HttpServletResponse {
public ExchangeMock exchange;
@ -13,5 +26,183 @@ public class ResponseMock extends MockHttpServletResponse {
}
@Override
public void addCookie(Cookie cookie) {
}
@Override
public boolean containsHeader(String s) {
return false;
}
@Override
public String encodeURL(String s) {
return null;
}
@Override
public String encodeRedirectURL(String s) {
return null;
}
@Override
public String encodeUrl(String s) {
return null;
}
@Override
public String encodeRedirectUrl(String s) {
return null;
}
@Override
public void sendError(int i, String s) throws IOException {
}
@Override
public void sendError(int i) throws IOException {
}
@Override
public void sendRedirect(String s) throws IOException {
}
@Override
public void setDateHeader(String s, long l) {
}
@Override
public void addDateHeader(String s, long l) {
}
@Override
public void setHeader(String s, String s1) {
}
@Override
public void addHeader(String s, String s1) {
}
@Override
public void setIntHeader(String s, int i) {
}
@Override
public void addIntHeader(String s, int i) {
}
@Override
public void setStatus(int i) {
}
@Override
public void setStatus(int i, String s) {
}
@Override
public int getStatus() {
return 0;
}
@Override
public String getHeader(String s) {
return null;
}
@Override
public List getHeaders(String s) {
return null;
}
@Override
public Set getHeaderNames() {
return null;
}
@Override
public String getCharacterEncoding() {
return null;
}
@Override
public String getContentType() {
return null;
}
@Override
public ServletOutputStream getOutputStream() {
return null;
}
@Override
public PrintWriter getWriter() {
return null;
}
@Override
public void setCharacterEncoding(String s) {
}
@Override
public void setContentLength(int i) {
}
@Override
public void setContentType(String s) {
}
@Override
public void setBufferSize(int i) {
}
@Override
public int getBufferSize() {
return 0;
}
@Override
public void flushBuffer() {
}
@Override
public void resetBuffer() {
}
@Override
public boolean isCommitted() {
return false;
}
@Override
public void reset() {
}
@Override
public void setLocale(Locale locale) {
}
@Override
public Locale getLocale() {
return null;
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

@ -45,7 +45,7 @@ layer=-1</panel_attributes>
<w>90</w>
<h>30</h>
</coordinates>
<panel_attributes>public
<panel_attributes>user
bg=#90CAF9</panel_attributes>
<additional_attributes/>
</element>

Loading…
Cancel
Save