diff --git a/mispbridge/src/BridgeServlet.java b/mispbridge/src/BridgeServlet.java index cbba038..2875a52 100644 --- a/mispbridge/src/BridgeServlet.java +++ b/mispbridge/src/BridgeServlet.java @@ -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 availableRides = new ArrayList<>(); - public List bookedRides = new ArrayList<>(); - protected List loadedRides = new ArrayList<>(); + public Map 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(); } } diff --git a/mispclient/src/ClientServlet.java b/mispclient/src/ClientServlet.java index e2bdf17..b37c336 100644 --- a/mispclient/src/ClientServlet.java +++ b/mispclient/src/ClientServlet.java @@ -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 availableRides = new ArrayList<>(); - public List bookedRides = new ArrayList<>(); - public List loadedRides = new ArrayList<>(); + + + public Map 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 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(); } diff --git a/misphelper/src/Ride.java b/misphelper/src/Ride.java index d1e30d1..4b7bb45 100644 --- a/misphelper/src/Ride.java +++ b/misphelper/src/Ride.java @@ -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 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); } + + + + } + + diff --git a/misphelper/src/RideMapHelper.java b/misphelper/src/RideMapHelper.java new file mode 100644 index 0000000..8d5d142 --- /dev/null +++ b/misphelper/src/RideMapHelper.java @@ -0,0 +1,54 @@ +import java.util.List; +import java.util.Map; + +public class RideMapHelper { + + public Map rideMap; + + + RideMapHelper(Map rideMap){ + this.rideMap = rideMap; + } + + + + public boolean containsMore(int i, State state){ + long availableRides = 0L; + for (Map.Entry 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 entry : rideMap.entrySet()){ + if (entry.getValue().getState() == state){ + availableRides++; + } + if (availableRides < i){ + return true; + } + } + return false; + } + + + public Ride pickAvailable(){ + for (Map.Entry entry : rideMap.entrySet()){ + if (entry.getValue().getState() == State.AVAILABLE){ + return entry.getValue(); + } + + } + return null; + } + + +} diff --git a/misphelper/src/State.java b/misphelper/src/State.java new file mode 100644 index 0000000..5a49087 --- /dev/null +++ b/misphelper/src/State.java @@ -0,0 +1,3 @@ +public enum State { + AVAILABLE, BOOKED, LOADED +} diff --git a/mispmock/src/ActorRunnable.java b/mispmock/src/ActorRunnable.java index 4ad9462..4b28c1e 100644 --- a/mispmock/src/ActorRunnable.java +++ b/mispmock/src/ActorRunnable.java @@ -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); } } diff --git a/mispmock/src/AppMock.java b/mispmock/src/AppMock.java index 9424bbe..e94d5aa 100644 --- a/mispmock/src/AppMock.java +++ b/mispmock/src/AppMock.java @@ -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); } diff --git a/mispmock/src/BridgeMock.java b/mispmock/src/BridgeMock.java index 7879ac7..3bd5d46 100644 --- a/mispmock/src/BridgeMock.java +++ b/mispmock/src/BridgeMock.java @@ -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(); diff --git a/mispmock/src/ClientMock.java b/mispmock/src/ClientMock.java index b70b6b4..9538f7b 100644 --- a/mispmock/src/ClientMock.java +++ b/mispmock/src/ClientMock.java @@ -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()); } } } diff --git a/mispmock/src/Main.java b/mispmock/src/Main.java index 055a0dd..5343dff 100644 --- a/mispmock/src/Main.java +++ b/mispmock/src/Main.java @@ -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); diff --git a/mispmock/src/MockSet.java b/mispmock/src/MockSet.java index cea798d..bf38ad1 100644 --- a/mispmock/src/MockSet.java +++ b/mispmock/src/MockSet.java @@ -1,5 +1,5 @@ public class MockSet { - PublicMock publicMock; + UserMock userMock; BridgeMock bridgeMock; ClientMock clientMock; AppMock appMock; diff --git a/mispmock/src/PublicMock.java b/mispmock/src/UserMock.java similarity index 82% rename from mispmock/src/PublicMock.java rename to mispmock/src/UserMock.java index f9696f7..b0ff300 100644 --- a/mispmock/src/PublicMock.java +++ b/mispmock/src/UserMock.java @@ -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); } diff --git a/mispmock/src/exchange/RequestMock.java b/mispmock/src/exchange/RequestMock.java index 41efbdf..4a70ad9 100644 --- a/mispmock/src/exchange/RequestMock.java +++ b/mispmock/src/exchange/RequestMock.java @@ -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 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; + } } \ No newline at end of file diff --git a/mispmock/src/exchange/ResponseMock.java b/mispmock/src/exchange/ResponseMock.java index 3864862..501c80c 100644 --- a/mispmock/src/exchange/ResponseMock.java +++ b/mispmock/src/exchange/ResponseMock.java @@ -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; + } } diff --git a/overview.png b/overview.png index b1be16b..c90860b 100644 Binary files a/overview.png and b/overview.png differ diff --git a/overview.uxf b/overview.uxf index bda2d85..90ab774 100644 --- a/overview.uxf +++ b/overview.uxf @@ -45,7 +45,7 @@ layer=-1 90 30 - public + user bg=#90CAF9