From 8c33c46e7e56a43864eb3d9eea9538964160e951 Mon Sep 17 00:00:00 2001 From: Ivan Olexyn Date: Mon, 4 May 2020 18:38:42 +0200 Subject: [PATCH] ~ overhaul for simple debugging. --- build-install-all.sh | 13 ++ embedded/pom.xml | 208 +++++++++++++++++ .../com/olexyn/misp/embedded/Embedded.java | 30 +++ .../java/com/olexyn/misp/embedded/RunAll.java | 19 ++ {misp-fwd => forward}/README.md | 0 {misp-fwd => forward}/install-locally.sh | 6 +- {test-proxy => forward}/pom.xml | 79 +++---- .../java/com/olexyn/misp/forward/Forward.java | 11 +- .../src/main/webapp/WEB-INF/web.xml | 2 +- .../src/main/webapp/images/io42630.png | Bin .../src/main/webapp/index.jsp | 0 {misp-helper => helper}/install-locally.sh | 0 {misp-helper => helper}/pom.xml | 10 +- .../com/olexyn/misp/helper/JsonHelper.java | 0 .../java/com/olexyn/misp/helper/Ride.java | 0 .../java/com/olexyn/misp/helper/WebPrint.java | 0 {misp-helper => helper}/src/site/site.xml | 0 {misp-mirror => mirror}/README.md | 0 {misp-mirror => mirror}/install-locally.sh | 0 {misp-mirror => mirror}/pom.xml | 8 +- .../java/com/olexyn/misp/mirror/Mirror.java | 0 .../src/main/webapp/WEB-INF/web.xml | 0 .../src/main/webapp/images/io42630.png | Bin .../src/main/webapp/index.jsp | 0 misp-rev/install-locally.sh | 10 - misp-rev/pom.xml | 90 -------- .../com/olexyn/misp/rev/ConnectionHelper.java | 16 -- .../main/java/com/olexyn/misp/rev/Main.java | 12 - misp-rev/src/main/webapp/WEB-INF/web.xml | 22 -- misp-rev/src/main/webapp/images/io42630.png | Bin 617 -> 0 bytes misp-rev/src/main/webapp/index.jsp | 20 -- mispmock/README.md | 16 -- .../src/com/olexyn/misp/mock/AdapterMock.java | 99 --------- .../com/olexyn/misp/mock/AdapterRunnable.java | 20 -- .../src/com/olexyn/misp/mock/BridgeMock.java | 84 ------- .../com/olexyn/misp/mock/BridgeRunnable.java | 21 -- mispmock/src/com/olexyn/misp/mock/Main.java | 42 ---- .../src/com/olexyn/misp/mock/MockSet.java | 11 - .../olexyn/misp/mock/actor/ActorRunnable.java | 57 ----- .../com/olexyn/misp/mock/actor/AppMock.java | 56 ----- .../com/olexyn/misp/mock/actor/UserMock.java | 91 -------- .../misp/mock/exchange/ExchangeMock.java | 50 ----- .../misp/mock/exchange/RequestMock.java | 84 ------- .../misp/mock/exchange/ResponseMock.java | 209 ------------------ overview.png | Bin 34558 -> 34047 bytes overview.uxf | 120 +++++----- reverse/install-locally.sh | 11 + {misp-fwd => reverse}/pom.xml | 59 ++--- .../misp/reverse/GetRequestRunnable.java | 26 +++ .../reverse/GetRideRequestDataRunnable.java | 26 +++ .../olexyn/misp/reverse/PostRideRunnable.java | 25 +++ .../java/com/olexyn/misp/reverse/README.md | 3 + .../java/com/olexyn/misp/reverse/Reverse.java | 89 ++------ .../com/olexyn/misp/reverse/ReverseApp.java | 30 +++ test-proxy/currentconfig.xml | 113 ---------- test-proxy/install-locally.sh | 10 - test-proxy/someconfig.xml | 56 ----- test-proxy/src/main/webapp/WEB-INF/web.xml | 22 -- test-proxy/src/main/webapp/index.jsp | 20 -- ...threads-in-mock.png => threads-in-mock.png | Bin ...threads-in-mock.uxf => threads-in-mock.uxf | 0 61 files changed, 551 insertions(+), 1455 deletions(-) create mode 100755 build-install-all.sh create mode 100644 embedded/pom.xml create mode 100644 embedded/src/main/java/com/olexyn/misp/embedded/Embedded.java create mode 100644 embedded/src/main/java/com/olexyn/misp/embedded/RunAll.java rename {misp-fwd => forward}/README.md (100%) rename {misp-fwd => forward}/install-locally.sh (66%) rename {test-proxy => forward}/pom.xml (68%) rename misp-fwd/src/main/java/com/olexyn/misp/fwd/FwdProxy.java => forward/src/main/java/com/olexyn/misp/forward/Forward.java (98%) rename {misp-fwd => forward}/src/main/webapp/WEB-INF/web.xml (90%) rename {misp-fwd => forward}/src/main/webapp/images/io42630.png (100%) rename {misp-fwd => forward}/src/main/webapp/index.jsp (100%) rename {misp-helper => helper}/install-locally.sh (100%) rename {misp-helper => helper}/pom.xml (91%) rename {misp-helper => helper}/src/main/java/com/olexyn/misp/helper/JsonHelper.java (100%) rename {misp-helper => helper}/src/main/java/com/olexyn/misp/helper/Ride.java (100%) rename {misp-helper => helper}/src/main/java/com/olexyn/misp/helper/WebPrint.java (100%) rename {misp-helper => helper}/src/site/site.xml (100%) rename {misp-mirror => mirror}/README.md (100%) rename {misp-mirror => mirror}/install-locally.sh (100%) rename {misp-mirror => mirror}/pom.xml (93%) rename {misp-mirror => mirror}/src/main/java/com/olexyn/misp/mirror/Mirror.java (100%) rename {misp-mirror => mirror}/src/main/webapp/WEB-INF/web.xml (100%) rename {misp-mirror => mirror}/src/main/webapp/images/io42630.png (100%) rename {misp-mirror => mirror}/src/main/webapp/index.jsp (100%) delete mode 100755 misp-rev/install-locally.sh delete mode 100644 misp-rev/pom.xml delete mode 100644 misp-rev/src/main/java/com/olexyn/misp/rev/ConnectionHelper.java delete mode 100644 misp-rev/src/main/java/com/olexyn/misp/rev/Main.java delete mode 100644 misp-rev/src/main/webapp/WEB-INF/web.xml delete mode 100644 misp-rev/src/main/webapp/images/io42630.png delete mode 100644 misp-rev/src/main/webapp/index.jsp delete mode 100644 mispmock/README.md delete mode 100644 mispmock/src/com/olexyn/misp/mock/AdapterMock.java delete mode 100644 mispmock/src/com/olexyn/misp/mock/AdapterRunnable.java delete mode 100644 mispmock/src/com/olexyn/misp/mock/BridgeMock.java delete mode 100644 mispmock/src/com/olexyn/misp/mock/BridgeRunnable.java delete mode 100644 mispmock/src/com/olexyn/misp/mock/Main.java delete mode 100644 mispmock/src/com/olexyn/misp/mock/MockSet.java delete mode 100644 mispmock/src/com/olexyn/misp/mock/actor/ActorRunnable.java delete mode 100644 mispmock/src/com/olexyn/misp/mock/actor/AppMock.java delete mode 100644 mispmock/src/com/olexyn/misp/mock/actor/UserMock.java delete mode 100644 mispmock/src/com/olexyn/misp/mock/exchange/ExchangeMock.java delete mode 100644 mispmock/src/com/olexyn/misp/mock/exchange/RequestMock.java delete mode 100644 mispmock/src/com/olexyn/misp/mock/exchange/ResponseMock.java create mode 100755 reverse/install-locally.sh rename {misp-fwd => reverse}/pom.xml (61%) create mode 100644 reverse/src/main/java/com/olexyn/misp/reverse/GetRequestRunnable.java create mode 100644 reverse/src/main/java/com/olexyn/misp/reverse/GetRideRequestDataRunnable.java create mode 100644 reverse/src/main/java/com/olexyn/misp/reverse/PostRideRunnable.java create mode 100644 reverse/src/main/java/com/olexyn/misp/reverse/README.md rename misp-rev/src/main/java/com/olexyn/misp/rev/RevProxy.java => reverse/src/main/java/com/olexyn/misp/reverse/Reverse.java (52%) create mode 100644 reverse/src/main/java/com/olexyn/misp/reverse/ReverseApp.java delete mode 100644 test-proxy/currentconfig.xml delete mode 100755 test-proxy/install-locally.sh delete mode 100644 test-proxy/someconfig.xml delete mode 100644 test-proxy/src/main/webapp/WEB-INF/web.xml delete mode 100644 test-proxy/src/main/webapp/index.jsp rename mispmock/threads-in-mock.png => threads-in-mock.png (100%) rename mispmock/threads-in-mock.uxf => threads-in-mock.uxf (100%) diff --git a/build-install-all.sh b/build-install-all.sh new file mode 100755 index 0000000..dfaebf8 --- /dev/null +++ b/build-install-all.sh @@ -0,0 +1,13 @@ +#!/bin/bash +cd ./forward +./install-locally.sh +cd .. +cd ./helper +./install-locally.sh +cd .. +cd ./mirror +./install-locally.sh +cd .. +cd ./reverse +./install-locally.sh +cd .. \ No newline at end of file diff --git a/embedded/pom.xml b/embedded/pom.xml new file mode 100644 index 0000000..187fddf --- /dev/null +++ b/embedded/pom.xml @@ -0,0 +1,208 @@ + + + + 4.0.0 + + com.olexyn.misp.embedded + embedded + 0.1 + + embedded + + http://www.example.com + + + UTF-8 + 1.11 + 1.11 + + + + + + junit + junit + 4.11 + test + + + com.olexyn.min.http.server + min-http-server + 0.1 + compile + + + javax.servlet + javax.servlet-api + 4.0.1 + compile + + + com.olexyn.misp.helper + misp-helper + 0.1 + compile + + + commons-io + commons-io + 2.6 + compile + + + org.eclipse.jetty + jetty-server + 9.4.28.v20200408 + + + org.eclipse.jetty + jetty-webapp + 9.4.28.v20200408 + + + org.eclipse.jetty + jetty-servlets + 9.4.28.v20200408 + + + org.eclipse.jetty + jetty-servlet + 9.4.28.v20200408 + + + org.eclipse.jetty + jetty-util + 9.4.28.v20200408 + + + org.eclipse.jetty + jetty-http + 9.4.28.v20200408 + + + org.eclipse.jetty + jetty-io + 9.4.28.v20200408 + + + org.eclipse.jetty + jetty-client + 9.4.28.v20200408 + + + org.eclipse.jetty.websocket + websocket-server + 9.4.28.v20200408 + + + org.eclipse.jetty.websocket + websocket-client + 9.4.28.v20200408 + + + org.eclipse.jetty.websocket + websocket-servlet + 9.4.28.v20200408 + + + org.eclipse.jetty.websocket + websocket-api + 9.4.28.v20200408 + + + org.eclipse.jetty.aggregate + jetty-all + 9.4.28.v20200408 + pom + test + + + com.olexyn.misp.mirror + misp-mirror + 0.1 + compile + + + com.olexyn.misp.rev + misp-rev + 0.1 + compile + + + com.olexyn.misp.reverse + reverse + 0.1 + compile + + + com.olexyn.misp.fwd + misp-fwd + 0.1 + compile + + + com.olexyn.misp.forward + forward + 0.1 + compile + + + com.olexyn.misp.mirror + mirror + 0.1 + compile + + + org.json + json + 20190722 + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + diff --git a/embedded/src/main/java/com/olexyn/misp/embedded/Embedded.java b/embedded/src/main/java/com/olexyn/misp/embedded/Embedded.java new file mode 100644 index 0000000..d728ae6 --- /dev/null +++ b/embedded/src/main/java/com/olexyn/misp/embedded/Embedded.java @@ -0,0 +1,30 @@ +package com.olexyn.misp.embedded; + +import com.olexyn.min.http.server.MinJettyServer; +import com.olexyn.misp.forward.Forward; +import com.olexyn.misp.mirror.Mirror; + +/** + * Hello world! + */ +public class Embedded implements Runnable { + + + @Override + public void run() { + MinJettyServer server = new MinJettyServer(); + + server.PORT = 8090; + server.MAX_THREADS = 100; + server.MIN_THREADS = 10; + server.IDLE_TIMEOUT = 120; + + + server.addServletWithMapping("/mirror", Mirror.class); + server.addServletWithMapping("/app", Mirror.class); + server.addServletWithMapping("/forward", Forward.class); + + + server.start(); + } +} diff --git a/embedded/src/main/java/com/olexyn/misp/embedded/RunAll.java b/embedded/src/main/java/com/olexyn/misp/embedded/RunAll.java new file mode 100644 index 0000000..7e0b081 --- /dev/null +++ b/embedded/src/main/java/com/olexyn/misp/embedded/RunAll.java @@ -0,0 +1,19 @@ +package com.olexyn.misp.embedded; + +import com.olexyn.misp.reverse.ReverseApp; + +public class RunAll { + + public static void main(String... args) throws InterruptedException { + + + Thread serverT = new Thread(new Embedded()); + serverT.start(); + + Thread.sleep(2000); + + Thread reverseT = new Thread(new ReverseApp()); + reverseT.start(); + } + +} diff --git a/misp-fwd/README.md b/forward/README.md similarity index 100% rename from misp-fwd/README.md rename to forward/README.md diff --git a/misp-fwd/install-locally.sh b/forward/install-locally.sh similarity index 66% rename from misp-fwd/install-locally.sh rename to forward/install-locally.sh index 8282387..dac99ea 100755 --- a/misp-fwd/install-locally.sh +++ b/forward/install-locally.sh @@ -1,8 +1,8 @@ #!/bin/bash version="0.1" -file="target/misp-fwd-${version}.war" -groupId="com.olexyn.misp.fwd" -artifactId="misp-fwd" +file="target/forward-${version}.war" +groupId="com.olexyn.misp.forward" +artifactId="forward" diff --git a/test-proxy/pom.xml b/forward/pom.xml similarity index 68% rename from test-proxy/pom.xml rename to forward/pom.xml index 80b2939..f212905 100644 --- a/test-proxy/pom.xml +++ b/forward/pom.xml @@ -4,19 +4,19 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.olexyn.test.proxy - test-proxy + com.olexyn.misp.forward + forward 0.1 war - test-proxy Maven Webapp + forward Maven Webapp http://www.example.com UTF-8 - 1.11 - 1.11 + 11 + 11 @@ -27,60 +27,67 @@ test - javax.servlet - javax.servlet-api - 4.0.1 - provided + com.olexyn.misp.helper + misp-helper + 0.1 + compile - org.eclipse.jetty - jetty-servlet - 9.4.28.v20200408 - provided + commons-io + commons-io + 2.6 + compile - org.eclipse.jetty - jetty-util - 9.4.28.v20200408 + org.eclipse.jetty.orbit + javax.servlet + 3.0.0.v201112011016 + compile + + + org.json + json + 20190722 + compile org.eclipse.jetty - jetty-client + jetty-server 9.4.28.v20200408 - org.junit.jupiter - junit-jupiter - RELEASE - test + com.olexyn.min.http.server + min-http-server + 0.1 + compile - org.eclipse.jetty.toolchain - jetty-test-helper - test + org.eclipse.jetty + jetty-util + 9.4.28.v20200408 + - org.eclipse.jetty.toolchain - jetty-test-helper - 5.3 - test + org.eclipse.jetty + jetty-servlets + 9.4.28.v20200408 org.eclipse.jetty - jetty-http + jetty-servlet 9.4.28.v20200408 - test - org.eclipse.jetty - jetty-io + org.eclipse.jetty.websocket + websocket-server 9.4.28.v20200408 - test + + @@ -95,12 +102,6 @@ maven-compiler-plugin 3.8.0 - - - 11 - 11 - true - maven-surefire-plugin diff --git a/misp-fwd/src/main/java/com/olexyn/misp/fwd/FwdProxy.java b/forward/src/main/java/com/olexyn/misp/forward/Forward.java similarity index 98% rename from misp-fwd/src/main/java/com/olexyn/misp/fwd/FwdProxy.java rename to forward/src/main/java/com/olexyn/misp/forward/Forward.java index 07d0b01..d0eaafc 100644 --- a/misp-fwd/src/main/java/com/olexyn/misp/fwd/FwdProxy.java +++ b/forward/src/main/java/com/olexyn/misp/forward/Forward.java @@ -1,4 +1,4 @@ -package com.olexyn.misp.fwd; +package com.olexyn.misp.forward; import com.olexyn.misp.helper.JsonHelper; import com.olexyn.misp.helper.Ride; @@ -15,7 +15,7 @@ import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; -public class FwdProxy extends HttpServlet { +public class Forward extends HttpServlet { protected static final String MISP_CLIENT_URL = "http://localhost:9090/mispclient/core"; @@ -189,6 +189,10 @@ public class FwdProxy extends HttpServlet { * add Ride to AvailableRides */ protected void handlePostRide(HttpServletRequest request, HttpServletResponse response) throws IOException, InterruptedException { + + + + String jsonPayload = IOUtils.toString(request.getReader()); final Ride ride = new Ride(jsonPayload); @@ -199,7 +203,7 @@ public class FwdProxy extends HttpServlet { // ID is final/threadsafe while (!(booked.containsKey(ride.getID()))) { - + Thread.sleep(50); } synchronized (booked) { @@ -213,5 +217,6 @@ public class FwdProxy extends HttpServlet { writer.write(ride.json()); writer.flush(); writer.close(); + } } \ No newline at end of file diff --git a/misp-fwd/src/main/webapp/WEB-INF/web.xml b/forward/src/main/webapp/WEB-INF/web.xml similarity index 90% rename from misp-fwd/src/main/webapp/WEB-INF/web.xml rename to forward/src/main/webapp/WEB-INF/web.xml index 26f5142..a7953d1 100644 --- a/misp-fwd/src/main/webapp/WEB-INF/web.xml +++ b/forward/src/main/webapp/WEB-INF/web.xml @@ -11,7 +11,7 @@ misp-fwd - com.olexyn.misp.fwd.FwdProxy + com.olexyn.misp.forward.Forward diff --git a/misp-fwd/src/main/webapp/images/io42630.png b/forward/src/main/webapp/images/io42630.png similarity index 100% rename from misp-fwd/src/main/webapp/images/io42630.png rename to forward/src/main/webapp/images/io42630.png diff --git a/misp-fwd/src/main/webapp/index.jsp b/forward/src/main/webapp/index.jsp similarity index 100% rename from misp-fwd/src/main/webapp/index.jsp rename to forward/src/main/webapp/index.jsp diff --git a/misp-helper/install-locally.sh b/helper/install-locally.sh similarity index 100% rename from misp-helper/install-locally.sh rename to helper/install-locally.sh diff --git a/misp-helper/pom.xml b/helper/pom.xml similarity index 91% rename from misp-helper/pom.xml rename to helper/pom.xml index a23a86e..933767b 100644 --- a/misp-helper/pom.xml +++ b/helper/pom.xml @@ -5,18 +5,18 @@ 4.0.0 com.olexyn.misp.helper - misp-helper + helper 0.1 - misp-helper - A simple misp-helper. + helper + A simple helper. http://www.example.com UTF-8 - 1.11 - 1.11 + 11 + 11 diff --git a/misp-helper/src/main/java/com/olexyn/misp/helper/JsonHelper.java b/helper/src/main/java/com/olexyn/misp/helper/JsonHelper.java similarity index 100% rename from misp-helper/src/main/java/com/olexyn/misp/helper/JsonHelper.java rename to helper/src/main/java/com/olexyn/misp/helper/JsonHelper.java diff --git a/misp-helper/src/main/java/com/olexyn/misp/helper/Ride.java b/helper/src/main/java/com/olexyn/misp/helper/Ride.java similarity index 100% rename from misp-helper/src/main/java/com/olexyn/misp/helper/Ride.java rename to helper/src/main/java/com/olexyn/misp/helper/Ride.java diff --git a/misp-helper/src/main/java/com/olexyn/misp/helper/WebPrint.java b/helper/src/main/java/com/olexyn/misp/helper/WebPrint.java similarity index 100% rename from misp-helper/src/main/java/com/olexyn/misp/helper/WebPrint.java rename to helper/src/main/java/com/olexyn/misp/helper/WebPrint.java diff --git a/misp-helper/src/site/site.xml b/helper/src/site/site.xml similarity index 100% rename from misp-helper/src/site/site.xml rename to helper/src/site/site.xml diff --git a/misp-mirror/README.md b/mirror/README.md similarity index 100% rename from misp-mirror/README.md rename to mirror/README.md diff --git a/misp-mirror/install-locally.sh b/mirror/install-locally.sh similarity index 100% rename from misp-mirror/install-locally.sh rename to mirror/install-locally.sh diff --git a/misp-mirror/pom.xml b/mirror/pom.xml similarity index 93% rename from misp-mirror/pom.xml rename to mirror/pom.xml index 4f9c0ad..2a4004a 100644 --- a/misp-mirror/pom.xml +++ b/mirror/pom.xml @@ -5,18 +5,18 @@ 4.0.0 com.olexyn.misp.mirror - misp-mirror + mirror 0.1 war - misp-mirror Maven Webapp + mirror Maven Webapp http://www.example.com UTF-8 - 1.11 - 1.11 + 11 + 11 diff --git a/misp-mirror/src/main/java/com/olexyn/misp/mirror/Mirror.java b/mirror/src/main/java/com/olexyn/misp/mirror/Mirror.java similarity index 100% rename from misp-mirror/src/main/java/com/olexyn/misp/mirror/Mirror.java rename to mirror/src/main/java/com/olexyn/misp/mirror/Mirror.java diff --git a/misp-mirror/src/main/webapp/WEB-INF/web.xml b/mirror/src/main/webapp/WEB-INF/web.xml similarity index 100% rename from misp-mirror/src/main/webapp/WEB-INF/web.xml rename to mirror/src/main/webapp/WEB-INF/web.xml diff --git a/misp-mirror/src/main/webapp/images/io42630.png b/mirror/src/main/webapp/images/io42630.png similarity index 100% rename from misp-mirror/src/main/webapp/images/io42630.png rename to mirror/src/main/webapp/images/io42630.png diff --git a/misp-mirror/src/main/webapp/index.jsp b/mirror/src/main/webapp/index.jsp similarity index 100% rename from misp-mirror/src/main/webapp/index.jsp rename to mirror/src/main/webapp/index.jsp diff --git a/misp-rev/install-locally.sh b/misp-rev/install-locally.sh deleted file mode 100755 index 9504c27..0000000 --- a/misp-rev/install-locally.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -version="0.1" -file="target/misp-rev-${version}.war" -groupId="com.olexyn.misp.rev" -artifactId="misp-rev" - - - -mvn package -mvn install:install-file -Dfile=${file} -DgroupId=${groupId} -DartifactId=${artifactId} -Dversion=${version} -Dpackaging=war -DgeneratePom=true diff --git a/misp-rev/pom.xml b/misp-rev/pom.xml deleted file mode 100644 index eff9fc0..0000000 --- a/misp-rev/pom.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - 4.0.0 - - com.olexyn.misp.rev - misp-rev - 0.1 - war - - misp-rev Maven Webapp - - http://www.example.com - - - UTF-8 - 1.7 - 1.7 - - - - - junit - junit - 4.11 - test - - - com.olexyn.misp.helper - misp-helper - 0.1 - compile - - - commons-io - commons-io - 2.6 - compile - - - org.eclipse.jetty.orbit - javax.servlet - 3.0.0.v201112011016 - compile - - - org.json - json - 20190722 - compile - - - - - - - - maven-clean-plugin - 3.1.0 - - - - maven-resources-plugin - 3.0.2 - - - maven-compiler-plugin - 3.8.0 - - - maven-surefire-plugin - 2.22.1 - - - maven-war-plugin - 3.2.2 - - - maven-install-plugin - 2.5.2 - - - maven-deploy-plugin - 2.8.2 - - - - - diff --git a/misp-rev/src/main/java/com/olexyn/misp/rev/ConnectionHelper.java b/misp-rev/src/main/java/com/olexyn/misp/rev/ConnectionHelper.java deleted file mode 100644 index f66d3f8..0000000 --- a/misp-rev/src/main/java/com/olexyn/misp/rev/ConnectionHelper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.olexyn.misp.rev; - -import com.olexyn.misp.helper.Ride; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; -import org.json.JSONObject; - -public class ConnectionHelper { - - - -} diff --git a/misp-rev/src/main/java/com/olexyn/misp/rev/Main.java b/misp-rev/src/main/java/com/olexyn/misp/rev/Main.java deleted file mode 100644 index 22843e6..0000000 --- a/misp-rev/src/main/java/com/olexyn/misp/rev/Main.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.olexyn.misp.rev; - -public class Main { - - - - public static void main(String... args){ - new RevProxy(); - } - - -} diff --git a/misp-rev/src/main/webapp/WEB-INF/web.xml b/misp-rev/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index a99e628..0000000 --- a/misp-rev/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - misp-rev - - - misp-rev - com.olexyn.misp.rev.RevProxy - - - - misp-rev - /core - - - diff --git a/misp-rev/src/main/webapp/images/io42630.png b/misp-rev/src/main/webapp/images/io42630.png deleted file mode 100644 index 01d99bf52efa311d32a32001004ab18602c9cd05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 617 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k2}mkgS)OEIU^4J@aSW-L^X5t**C7W1R!8@u z|JwcL0wS|EM17r~$b7ciPC-FO=#Y{kRf+3&`G3gnuKq4;XJ&jcwcFJxLZxNk3D!A> zlO_s?aV8Q??AUdA_ifq!GiR>f|9AWUzVwYA9NjG&1{2Xx96_y^TMtY%|Nq+_=9;)I SZ)q`*!{F)a=d#Wzp$PyZXv%5; diff --git a/misp-rev/src/main/webapp/index.jsp b/misp-rev/src/main/webapp/index.jsp deleted file mode 100644 index d53407d..0000000 --- a/misp-rev/src/main/webapp/index.jsp +++ /dev/null @@ -1,20 +0,0 @@ - - -misp-rev - - - - - - - - - - -
- -
-

misp-rev

-
- - diff --git a/mispmock/README.md b/mispmock/README.md deleted file mode 100644 index 742e46c..0000000 --- a/mispmock/README.md +++ /dev/null @@ -1,16 +0,0 @@ -#### About -* Mockup for easy debugging. - * Mock *requests* and *responses*. - * Teleport them between *actors*. -* There are 4 actors which are mocked: - * `AppMock` : the App hosted on *localhost*. - * `ClientMock` : the *mispclient* Servlet. - * `BridgeMock` : the *mispbridge* Servlet. - * `UserMock` : the user agent accessing the *mispbridge* from the internet. -* `MockSet` knows all 4 actors, all the 4 actors know `MockSet`. - * Thus all 4 actors know each other. - -
- -##### Threads in Mock - ![](threads-in-mock.png) \ No newline at end of file diff --git a/mispmock/src/com/olexyn/misp/mock/AdapterMock.java b/mispmock/src/com/olexyn/misp/mock/AdapterMock.java deleted file mode 100644 index f8cfe9b..0000000 --- a/mispmock/src/com/olexyn/misp/mock/AdapterMock.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.olexyn.misp.mock; - -import com.olexyn.misp.helper.Ride; -import com.olexyn.misp.mock.exchange.ExchangeMock; -import com.olexyn.misp.adapter.Adapter; - -import javax.servlet.ServletException; -import java.io.IOException; - - -/** - * Wraps a ClientServlet so it can be debugged easily, i.e. without running Tomcat. - */ -public class AdapterMock extends Adapter { - - private MockSet mockSet; - - - public AdapterMock(MockSet mockSet) { - super(); - mockSet.adapterMock = this; - this.mockSet = mockSet; - } - - /** - * Send POST (Ride). - * Parse response. - */ - @Override - protected Ride doSendPostRide(Ride ride) throws IOException, InterruptedException, ServletException { - - // Mock Exchange - final ExchangeMock exchange = new ExchangeMock(); - exchange.request.setMethod("POST"); - exchange.request.setContentType("application/json"); - exchange.request.setContent(ride.json().getBytes()); - - synchronized (exchange) { - // Mock POST (Ride) - exchange.notify(); - mockSet.bridgeMock.doPost(exchange.request, exchange.response); - exchange.wait(); - exchange.notify(); - } - - // handle OK (Ride)(Request) - return new Ride(exchange.response.getContentAsString()); - } - - - /** - * Send GET (Request) to App. - * Parse response. - */ - @Override - protected String doSendGetRequest(String request) throws IOException { - - // Mock Exchange - final ExchangeMock exchange = new ExchangeMock(); - - exchange.request.setMethod("GET"); - exchange.request.setContent(request.getBytes()); - - synchronized (exchange) { - // Mock GET (Request) - exchange.notify(); - mockSet.appMock.doGet(exchange.request, exchange.response); - - // handle OK (Data) - exchange.notify(); - } - - return exchange.response.getContentAsString(); - } - - - /** - * Send GET (Ride)(Request)(Data). - * Parse response. - */ - @Override - protected void doSendGetRideRequest(Ride ride) throws IOException, InterruptedException { - - // Mock Exchange - final ExchangeMock exchange = new ExchangeMock(); - exchange.request.setMethod("GET"); - exchange.request.setContentType("application/json"); - exchange.request.setContent(ride.json().getBytes()); - - synchronized (exchange) { - // Mock GET (Ride)(Request)(Data) - exchange.notify(); - mockSet.bridgeMock.doGet(exchange.request, exchange.response); - exchange.wait(); - exchange.notify(); - } - } - -} \ No newline at end of file diff --git a/mispmock/src/com/olexyn/misp/mock/AdapterRunnable.java b/mispmock/src/com/olexyn/misp/mock/AdapterRunnable.java deleted file mode 100644 index 7cf08fa..0000000 --- a/mispmock/src/com/olexyn/misp/mock/AdapterRunnable.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.olexyn.misp.mock; - -/** - * Pass the MockSet. - * Provide a Runnable. - */ -public class AdapterRunnable implements Runnable { - - private MockSet mockSet; - - public AdapterRunnable(MockSet mockSet){ - super(); - this.mockSet = mockSet; - } - - @Override - public void run() { - new AdapterMock(mockSet); - } -} diff --git a/mispmock/src/com/olexyn/misp/mock/BridgeMock.java b/mispmock/src/com/olexyn/misp/mock/BridgeMock.java deleted file mode 100644 index 4948a5c..0000000 --- a/mispmock/src/com/olexyn/misp/mock/BridgeMock.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.olexyn.misp.mock; - - -import com.olexyn.misp.mock.exchange.ExchangeMock; -import com.olexyn.misp.mock.exchange.RequestMock; -import com.olexyn.misp.bridge.BridgeServlet; - - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -public class BridgeMock extends BridgeServlet { - - public BridgeMock(MockSet mockSet) { - super(); - mockSet.bridgeMock = this; - } - - - /** - * handle GET (Request)
- * - wait for availableRides to have an entry
- * - move move Ride to deliveredRides
- * - wait for Ride to have Data
- * - respond to the original request with Data - */ - @Override - protected void handleGetRequest(HttpServletRequest request, HttpServletResponse response) throws IOException, InterruptedException { - - final ExchangeMock exchange; - - synchronized (exchange = ((RequestMock) request).exchange) { - - super.handleGetRequest(request,response); - - exchange.notify(); - } - } - - - /** - * handle GET (Ride)(Data) - * if Ride in ForwardedRequest - * remove Ride from ForwardedRequest - * add Ride to NewData - * send OK (Ride)(Data) - * remove Ride from NewData - * add Ride to ForwardedData - * send OK (EOL) - * remove Ride from ForwardedData - * add Ride to EOL - */ - protected void handleGetRideRequestData(HttpServletRequest request, HttpServletResponse response) throws IOException, InterruptedException { - - final ExchangeMock exchange; - - synchronized (exchange = ((RequestMock) request).exchange) { - - super.handleGetRideRequestData(request,response); - - exchange.notify(); - } - } - - - /** - * handle POST (Ride) - * - wait for Ride to be booked - * - send OK to Client - */ - @Override - protected void handlePostRide(HttpServletRequest request, HttpServletResponse response) throws IOException, InterruptedException { - - final ExchangeMock exchange; - - synchronized (exchange = ((RequestMock) request).exchange) { - - super.handlePostRide(request,response); - - exchange.notify(); - } - } -} diff --git a/mispmock/src/com/olexyn/misp/mock/BridgeRunnable.java b/mispmock/src/com/olexyn/misp/mock/BridgeRunnable.java deleted file mode 100644 index 8874863..0000000 --- a/mispmock/src/com/olexyn/misp/mock/BridgeRunnable.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.olexyn.misp.mock; - -/** - * Pass the MockSet. - * Provide a Runnable. - */ -public class BridgeRunnable implements Runnable { - - MockSet mockSet; - - public BridgeRunnable(MockSet mockSet){ - super(); - this.mockSet = mockSet; - } - - @Override - public void run() { - new BridgeMock(mockSet); - } - -} diff --git a/mispmock/src/com/olexyn/misp/mock/Main.java b/mispmock/src/com/olexyn/misp/mock/Main.java deleted file mode 100644 index 5274457..0000000 --- a/mispmock/src/com/olexyn/misp/mock/Main.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.olexyn.misp.mock; - -import com.olexyn.misp.mock.actor.AppMock; -import com.olexyn.misp.mock.actor.UserMock; - -public class Main { - - - - - - public static void main(String... args){ - - MockSet mockSet = new MockSet(); - - Runnable publicRunnable = new UserMock(mockSet); - Runnable bridgeRunable = new BridgeRunnable(mockSet); - Runnable adapterRunnable = new AdapterRunnable(mockSet); - //Runnable clientRunnable = new ClientRunnable(mockSet); - Runnable appRunnable = new AppMock(mockSet); - - Thread userThread = new Thread(publicRunnable); - Thread bridgeThread = new Thread(bridgeRunable); - Thread adapterThread = new Thread(adapterRunnable); - //Thread clientThread = new Thread(clientRunnable); - Thread appThread = new Thread(appRunnable); - - userThread.setName("userThread"); - userThread.start(); - bridgeThread.setName("bridgeThread"); - bridgeThread.start(); - adapterThread.setName("adapterThread"); - adapterThread.start(); - //clientThread.setName("clientThread"); - //clientThread.start(); - appThread.setName("appThread"); - appThread.start(); - } -} - - - diff --git a/mispmock/src/com/olexyn/misp/mock/MockSet.java b/mispmock/src/com/olexyn/misp/mock/MockSet.java deleted file mode 100644 index 533a1ec..0000000 --- a/mispmock/src/com/olexyn/misp/mock/MockSet.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.olexyn.misp.mock; - -import com.olexyn.misp.mock.actor.AppMock; -import com.olexyn.misp.mock.actor.UserMock; - -public class MockSet { - public UserMock userMock; - public BridgeMock bridgeMock; - public AdapterMock adapterMock; - public AppMock appMock; -} \ No newline at end of file diff --git a/mispmock/src/com/olexyn/misp/mock/actor/ActorRunnable.java b/mispmock/src/com/olexyn/misp/mock/actor/ActorRunnable.java deleted file mode 100644 index 115db66..0000000 --- a/mispmock/src/com/olexyn/misp/mock/actor/ActorRunnable.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.olexyn.misp.mock.actor; - -import com.olexyn.misp.mock.MockSet; -import com.olexyn.misp.mock.exchange.ExchangeMock; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - - - -/** - * Generic Runnable. - * Serves as basis for Actors that are not Servlets. - */ -public abstract class ActorRunnable implements Runnable { - - - List exchanges = new ArrayList<>(); - - protected MockSet mockSet; - - - - public ActorRunnable(MockSet mockSet){ - this.mockSet = mockSet; - - } - - - - - @Override - public void run() { - // - } - - - public void processExchange(ExchangeMock exchange) throws IOException, ServletException { - - - if (exchange.request.getMethod().equalsIgnoreCase("GET")) { - doGet(exchange.request, exchange.response); - } else if (exchange.request.getMethod().equalsIgnoreCase("POST")) { - doPost(exchange.request, exchange.response); - } - } - - - public abstract void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException; - - public abstract void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException; - -} diff --git a/mispmock/src/com/olexyn/misp/mock/actor/AppMock.java b/mispmock/src/com/olexyn/misp/mock/actor/AppMock.java deleted file mode 100644 index b3463ea..0000000 --- a/mispmock/src/com/olexyn/misp/mock/actor/AppMock.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.olexyn.misp.mock.actor; - - - -import com.olexyn.misp.mock.MockSet; -import com.olexyn.misp.mock.exchange.ExchangeMock; -import com.olexyn.misp.mock.exchange.RequestMock; -import org.apache.commons.io.IOUtils; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.PrintWriter; - -public class AppMock extends ActorRunnable { - - public AppMock(MockSet mockSet) { - super(mockSet); - mockSet.appMock = this; - } - - - @Override - public void run() { - while (true) { - - - } - } - - @Override - public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { - - RequestMock mockRequest = (RequestMock) request; - ExchangeMock exchange = mockRequest.exchange; - - synchronized (exchange) { - String parsedRequest = IOUtils.toString(request.getReader()); - - String dataString = "DATA-" + parsedRequest; - - exchange.response.setStatus(200); - PrintWriter writer = exchange.response.getWriter(); - writer.write(dataString); - writer.flush(); - writer.close(); - - exchange.notify(); - } - } - - @Override - public void doPost(HttpServletRequest request, HttpServletResponse response) { - - } -} diff --git a/mispmock/src/com/olexyn/misp/mock/actor/UserMock.java b/mispmock/src/com/olexyn/misp/mock/actor/UserMock.java deleted file mode 100644 index cb384c1..0000000 --- a/mispmock/src/com/olexyn/misp/mock/actor/UserMock.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.olexyn.misp.mock.actor; - -import com.olexyn.misp.mock.MockSet; -import com.olexyn.misp.mock.exchange.ExchangeMock; - - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - - - - -public class UserMock extends ActorRunnable { - - - - final String longRequest; - - int requestCount = 0; - - public UserMock(MockSet mockSet){ - super(mockSet); - mockSet.userMock = this; - - - StringBuilder sb = new StringBuilder(); - for (int i=0;i<100;i++){ - sb.append("foo"); - } - longRequest = sb.toString(); - - - } - - @Override - public void run() { - while (true){ - try { - sendGetRequest(); - } catch (IOException | InterruptedException e) { - e.printStackTrace(); - } - - } - } - - @Override - public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { - - } - - @Override - public void doPost(HttpServletRequest request, HttpServletResponse response) { - - } - - - - /** - * # send GET (Request) - * Generated by Loop - */ - void sendGetRequest() throws IOException, InterruptedException { - - // Mock Exchange - ExchangeMock exchange = new ExchangeMock(); - - exchange.request.setMethod("GET"); - //exchange.request.setContentType("application/json"); - - //String requestBody = longRequest+"-"+(++requestCount); - String requestBody = "REQUEST-"+(++requestCount); - String jsonString = "{\"request\":\""+requestBody+ "\"}"; - jsonString = "asdfasdfa"; - exchange.request.setContent(jsonString.getBytes()); - - synchronized (exchange){ - // Mock GET (Request) - exchange.notify(); - mockSet.bridgeMock.doGet(exchange.request,exchange.response); - exchange.wait(); - - // handle OK (Data) - String data = exchange.response.getContentAsString(); - System.out.println(data + " of "+requestBody); - exchange.notify(); - } - } - -} diff --git a/mispmock/src/com/olexyn/misp/mock/exchange/ExchangeMock.java b/mispmock/src/com/olexyn/misp/mock/exchange/ExchangeMock.java deleted file mode 100644 index 1e0c0e3..0000000 --- a/mispmock/src/com/olexyn/misp/mock/exchange/ExchangeMock.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.olexyn.misp.mock.exchange; - - -import java.util.ArrayList; -import java.util.List; - -/** - * How "exchange" mocks an exchange:
- *
- * An "exchange" corresponds to request & reply pair.
- * - i.e. a GET & OK pair.
- * Steps:
- * 1. new Exchange()
- * 2. set properties of .request
- * 3. "send" request by using exchange.notify(); recipient.doGet();
- * 4. recipient does someting with request
- * - - recipient sets proerties of .response
- * - - recipient sends reply using exchange.notify();
- * 5. "receive" response by using exchange.wait(); - */ -public class ExchangeMock { - - public static List exchangeList = new ArrayList<>(); - - - private static int next_id=0; - public int id; - - public RequestMock request =new RequestMock(this); - public ResponseMock response = new ResponseMock(this); - - public ExchangeMock(){ - id = next_id++; - exchangeList.add(this); - } - - - - - - - - - -} - - - - - diff --git a/mispmock/src/com/olexyn/misp/mock/exchange/RequestMock.java b/mispmock/src/com/olexyn/misp/mock/exchange/RequestMock.java deleted file mode 100644 index 0665303..0000000 --- a/mispmock/src/com/olexyn/misp/mock/exchange/RequestMock.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.olexyn.misp.mock.exchange; - -import org.springframework.mock.web.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 final ExchangeMock exchange; - - public RequestMock(ExchangeMock exchange){ - 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/com/olexyn/misp/mock/exchange/ResponseMock.java b/mispmock/src/com/olexyn/misp/mock/exchange/ResponseMock.java deleted file mode 100644 index fb7ff89..0000000 --- a/mispmock/src/com/olexyn/misp/mock/exchange/ResponseMock.java +++ /dev/null @@ -1,209 +0,0 @@ -package com.olexyn.misp.mock.exchange; - - -import org.springframework.mock.web.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.io.UnsupportedEncodingException; -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; - - public ResponseMock(ExchangeMock exchange){ - super(); - this.exchange = exchange; - } - - - @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() throws UnsupportedEncodingException { - return super.getWriter(); - } - - @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 69bfa466749491c8e39a95f98aed93455eaac352..56871eeeef73da3b459f9a8d5ddc92116f9b630e 100644 GIT binary patch literal 34047 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 NjD!Lz=c@k0{{acS$4meK literal 34558 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%0DU6l`KO1Y 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 UMLClass - 1030 - 630 + 1210 + 480 90 30 @@ -16,8 +16,8 @@ lt=- UMLClass - 630 - 630 + 810 + 480 120 70 @@ -29,8 +29,8 @@ modem UMLClass - 800 - 630 + 980 + 480 100 30 @@ -42,8 +42,8 @@ layer=-1 UMLClass - 1030 - 670 + 1210 + 520 90 30 @@ -54,12 +54,12 @@ bg=#90CAF9 UMLClass - 800 - 670 + 980 + 520 100 30 - misp.fwd + forward bg=#B39DDB layer=-1 @@ -67,8 +67,8 @@ layer=-1 Relation - 550 - 720 + 730 + 570 280 50 @@ -80,8 +80,8 @@ Generated by Loop Relation - 880 - 760 + 1060 + 610 200 40 @@ -93,12 +93,12 @@ fg=#1E88E5 UMLClass - 470 - 670 + 650 + 520 100 30 - misp.rev + reverse bg=#B39DDB layer=-1 @@ -106,8 +106,8 @@ layer=-1 Relation - 550 - 870 + 730 + 720 280 50 @@ -119,8 +119,8 @@ GET (Ride)(Request) Relation - 880 - 890 + 1060 + 740 200 40 @@ -132,8 +132,8 @@ fg=#1E88E5 Relation - 550 - 930 + 730 + 780 280 40 @@ -144,8 +144,8 @@ OK (Ride) UMLClass - 270 - 670 + 450 + 520 80 30 @@ -156,8 +156,8 @@ bg=#90CAF9 Relation - 310 - 800 + 490 + 650 190 40 @@ -169,8 +169,8 @@ fg=#1E88E5 Relation - 310 - 850 + 490 + 700 190 40 @@ -182,8 +182,8 @@ fg=#1E88E5 Relation - 550 - 780 + 730 + 630 280 40 @@ -194,8 +194,8 @@ OK (Ride)(Request) UMLClass - 270 - 630 + 450 + 480 300 30 @@ -206,8 +206,8 @@ lt=- UMLClass - 240 - 600 + 420 + 450 910 400 @@ -219,8 +219,8 @@ layer=-10 UMLClass - 810 - 740 + 990 + 590 80 40 @@ -233,8 +233,8 @@ transparency=0 UMLClass - 480 - 740 + 660 + 590 80 60 @@ -247,8 +247,8 @@ transparency=0 UMLClass - 810 - 780 + 990 + 630 80 110 @@ -262,8 +262,8 @@ layer=1 UMLClass - 480 - 800 + 660 + 650 80 70 @@ -276,8 +276,8 @@ transparency=0 UMLClass - 480 - 870 + 660 + 720 80 80 @@ -290,8 +290,8 @@ transparency=0 UMLClass - 810 - 890 + 990 + 740 80 60 @@ -304,8 +304,8 @@ transparency=0 Relation - 1060 - 690 + 1240 + 540 30 310 @@ -316,8 +316,8 @@ fg=#1E88E5 Relation - 300 - 690 + 480 + 540 30 310 @@ -328,8 +328,8 @@ fg=#1E88E5 UMLClass - 1060 - 780 + 1240 + 630 20 130 @@ -342,8 +342,8 @@ layer=4 UMLClass - 300 - 820 + 480 + 670 20 50 @@ -356,8 +356,8 @@ layer=4 Relation - 840 - 690 + 1020 + 540 30 310 @@ -369,8 +369,8 @@ layer=-4 Relation - 510 - 690 + 690 + 540 30 310 diff --git a/reverse/install-locally.sh b/reverse/install-locally.sh new file mode 100755 index 0000000..ccf9951 --- /dev/null +++ b/reverse/install-locally.sh @@ -0,0 +1,11 @@ +#!/bin/bash +version="0.1" +artifactId="reverse" +file="target/${artifactId}-${version}.jar" +groupId="com.olexyn.misp.reverse" + + + + +mvn package +mvn install:install-file -Dfile=${file} -DgroupId=${groupId} -DartifactId=${artifactId} -Dversion=${version} -Dpackaging=jar -DgeneratePom=true diff --git a/misp-fwd/pom.xml b/reverse/pom.xml similarity index 61% rename from misp-fwd/pom.xml rename to reverse/pom.xml index 1611c74..538df90 100644 --- a/misp-fwd/pom.xml +++ b/reverse/pom.xml @@ -4,18 +4,18 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.olexyn.misp.fwd - misp-fwd + com.olexyn.misp.reverse + reverse 0.1 - war - misp-fwd Maven Webapp + reverse http://www.example.com UTF-8 - + 11 + 11 @@ -25,42 +25,28 @@ 4.11 test - - com.olexyn.misp.helper - misp-helper - 0.1 - compile - - - commons-io - commons-io - 2.6 - compile - - - org.eclipse.jetty.orbit - javax.servlet - 3.0.0.v201112011016 - compile - + + com.olexyn.misp.helper + misp-helper + 0.1 + compile + org.json json 20190722 - compile - - + maven-clean-plugin 3.1.0 - + maven-resources-plugin 3.0.2 @@ -68,20 +54,14 @@ maven-compiler-plugin 3.8.0 - - - 11 - 11 - true - maven-surefire-plugin 2.22.1 - maven-war-plugin - 3.2.2 + maven-jar-plugin + 3.0.2 maven-install-plugin @@ -91,6 +71,15 @@ maven-deploy-plugin 2.8.2 + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + diff --git a/reverse/src/main/java/com/olexyn/misp/reverse/GetRequestRunnable.java b/reverse/src/main/java/com/olexyn/misp/reverse/GetRequestRunnable.java new file mode 100644 index 0000000..04fdfb7 --- /dev/null +++ b/reverse/src/main/java/com/olexyn/misp/reverse/GetRequestRunnable.java @@ -0,0 +1,26 @@ +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(); + try { reverse.sendGetRequest(ride); } catch (IOException ignored) {} + } + } + } + } +} diff --git a/reverse/src/main/java/com/olexyn/misp/reverse/GetRideRequestDataRunnable.java b/reverse/src/main/java/com/olexyn/misp/reverse/GetRideRequestDataRunnable.java new file mode 100644 index 0000000..be0cdb0 --- /dev/null +++ b/reverse/src/main/java/com/olexyn/misp/reverse/GetRideRequestDataRunnable.java @@ -0,0 +1,26 @@ +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(); + try { reverse.sendGetRideRequestData(ride); } catch (IOException ignored) {} + } + } + } + } +} diff --git a/reverse/src/main/java/com/olexyn/misp/reverse/PostRideRunnable.java b/reverse/src/main/java/com/olexyn/misp/reverse/PostRideRunnable.java new file mode 100644 index 0000000..256f46a --- /dev/null +++ b/reverse/src/main/java/com/olexyn/misp/reverse/PostRideRunnable.java @@ -0,0 +1,25 @@ +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.size() < reverse.AVAILABLE_RIDES_OVERHEAD_TRIGGER) { + for (int i = 0; i < reverse.AVAILABLE_RIDES_OVERHEAD; i++) { + try {reverse.sendPostRide();} catch (IOException ignored) {} + } + } + } + } + } +} diff --git a/reverse/src/main/java/com/olexyn/misp/reverse/README.md b/reverse/src/main/java/com/olexyn/misp/reverse/README.md new file mode 100644 index 0000000..43d0100 --- /dev/null +++ b/reverse/src/main/java/com/olexyn/misp/reverse/README.md @@ -0,0 +1,3 @@ +* Run from `ReverseApp` : + * as `main()` + * or as `Runnable` from somewhere else. \ No newline at end of file diff --git a/misp-rev/src/main/java/com/olexyn/misp/rev/RevProxy.java b/reverse/src/main/java/com/olexyn/misp/reverse/Reverse.java similarity index 52% rename from misp-rev/src/main/java/com/olexyn/misp/rev/RevProxy.java rename to reverse/src/main/java/com/olexyn/misp/reverse/Reverse.java index c171c00..32178f2 100644 --- a/misp-rev/src/main/java/com/olexyn/misp/rev/RevProxy.java +++ b/reverse/src/main/java/com/olexyn/misp/reverse/Reverse.java @@ -1,4 +1,4 @@ -package com.olexyn.misp.rev; +package com.olexyn.misp.reverse; import com.olexyn.misp.helper.Ride; @@ -13,13 +13,13 @@ import java.util.HashMap; import java.util.Map; -public class RevProxy { +public class Reverse { - protected static final String MISP_BRIDGE_URL = "http://localhost:9090/mispbridge/core"; - protected static final String APP_URL = "http://localhost:9090/mirror/core"; + public String FORWARD_URL = "http://localhost:8090/bridge"; + public String APP_URL = "http://localhost:8090/app"; - public static final int AVAILABLE_RIDES_OVERHEAD_TRIGGER = 4; - public static final int AVAILABLE_RIDES_OVERHEAD = 8; + public int AVAILABLE_RIDES_OVERHEAD_TRIGGER = 1; + public int AVAILABLE_RIDES_OVERHEAD = 2; public final Map available = new HashMap<>(); @@ -27,8 +27,7 @@ public class RevProxy { public final Map loaded = new HashMap<>(); - public RevProxy() { - + public void start() { Thread postRideThread = new Thread(new PostRideRunnable(this)); postRideThread.setName("postRideThread"); postRideThread.start(); @@ -49,7 +48,7 @@ public class RevProxy { synchronized (available) { available.put(ride.getID(), ride); } - final String result = send("POST", MISP_BRIDGE_URL, ride.json()); + final String result = send("POST", FORWARD_URL, ride.json()); synchronized (available) { available.remove(ride.getID()); @@ -73,7 +72,7 @@ public class RevProxy { void sendGetRideRequestData(Ride ride) throws IOException { - send("GET", MISP_BRIDGE_URL, ride.json()); + send("GET", FORWARD_URL, ride.json()); synchronized (loaded) {loaded.remove(ride.getID()); } } @@ -87,10 +86,15 @@ public class RevProxy { connection.setDoOutput(true); DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); - outputStream.writeBytes(body); + + if (body != null) { + outputStream.writeBytes(body); + } + outputStream.flush(); outputStream.close(); + int i = connection.getResponseCode(); BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String out; StringBuilder sb = new StringBuilder(); @@ -100,70 +104,7 @@ public class RevProxy { } -} - - -class PostRideRunnable implements Runnable { - - final private RevProxy adapter; - - public PostRideRunnable(RevProxy adapter) { - this.adapter = adapter; - } - - @Override - public void run() { - while (true) { - synchronized (adapter.available) { - if (adapter.available.size() < RevProxy.AVAILABLE_RIDES_OVERHEAD_TRIGGER) { - for (int i = 0; i < RevProxy.AVAILABLE_RIDES_OVERHEAD; i++) { - try {adapter.sendPostRide();} catch (IOException ignored) {} - } - } - } - } - } -} - - -class GetRequestRunnable implements Runnable { - - final private RevProxy adapter; - public GetRequestRunnable(RevProxy adapter) { - this.adapter = adapter; - } - - @Override - public void run() { - while (true) { - synchronized (adapter.booked) { - if (adapter.booked.size() > 0) { - final Ride ride = adapter.booked.entrySet().iterator().next().getValue(); - try { adapter.sendGetRequest(ride); } catch (IOException ignored) {} - } - } - } - } } -class GetRideRequestDataRunnable implements Runnable { - - final private RevProxy adapter; - - public GetRideRequestDataRunnable(RevProxy adapter) { - this.adapter = adapter; - } - @Override - public void run() { - while (true) { - synchronized (adapter.loaded) { - if (adapter.loaded.size() > 0) { - final Ride ride = adapter.loaded.entrySet().iterator().next().getValue(); - try { adapter.sendGetRideRequestData(ride); } catch (IOException ignored) {} - } - } - } - } -} \ No newline at end of file diff --git a/reverse/src/main/java/com/olexyn/misp/reverse/ReverseApp.java b/reverse/src/main/java/com/olexyn/misp/reverse/ReverseApp.java new file mode 100644 index 0000000..3c60553 --- /dev/null +++ b/reverse/src/main/java/com/olexyn/misp/reverse/ReverseApp.java @@ -0,0 +1,30 @@ +package com.olexyn.misp.reverse; + +public class ReverseApp implements Runnable { + + + public static void main(String... args) { + new ReverseApp().doRun(); + } + + + @Override + public void run() { + + doRun(); + + } + + + private void doRun() { + 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(); + } +} diff --git a/test-proxy/currentconfig.xml b/test-proxy/currentconfig.xml deleted file mode 100644 index a956c02..0000000 --- a/test-proxy/currentconfig.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test-proxy/install-locally.sh b/test-proxy/install-locally.sh deleted file mode 100755 index aeb5dc0..0000000 --- a/test-proxy/install-locally.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -version="0.1" -file="target/test-proxy-${version}.war" -groupId="com.olexyn.test.proxy" -artifactId="test-proxy" - - - -mvn package -mvn install:install-file -Dfile=${file} -DgroupId=${groupId} -DartifactId=${artifactId} -Dversion=${version} -Dpackaging=war -DgeneratePom=true diff --git a/test-proxy/someconfig.xml b/test-proxy/someconfig.xml deleted file mode 100644 index ab71816..0000000 --- a/test-proxy/someconfig.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - org.eclipse.jetty.servlets.ProxyServlet$Transparent - /proxy/* - - maxThreads - - - - - - maxConnections - - - - - - idleTimeout - - - - - - timeout - - - - - - ProxyTo - http://localhost:8080/misp-mirror - - - Prefix - /proxy - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/test-proxy/src/main/webapp/WEB-INF/web.xml b/test-proxy/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index dcc0494..0000000 --- a/test-proxy/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - misp-proxy - - - test-proxy - com.olexyn.test.proxy.ProxyServlet - - - - test-proxy - /core - - - diff --git a/test-proxy/src/main/webapp/index.jsp b/test-proxy/src/main/webapp/index.jsp deleted file mode 100644 index 1ed1b19..0000000 --- a/test-proxy/src/main/webapp/index.jsp +++ /dev/null @@ -1,20 +0,0 @@ - - -test-proxy - - - - - - - - - - -
- -
-

test-proxy

-
- - diff --git a/mispmock/threads-in-mock.png b/threads-in-mock.png similarity index 100% rename from mispmock/threads-in-mock.png rename to threads-in-mock.png diff --git a/mispmock/threads-in-mock.uxf b/threads-in-mock.uxf similarity index 100% rename from mispmock/threads-in-mock.uxf rename to threads-in-mock.uxf