From 68f11afdb2319908b0ccb0f52047ee4650018908 Mon Sep 17 00:00:00 2001 From: Fabio Esposito Date: Fri, 18 Aug 2017 13:17:03 +0200 Subject: [PATCH] fatjar --- README.md | 28 +++++++++++++------ build.gradle | 10 +++++++ settings.gradle | 1 + survey-api/build.gradle | 16 +++++++++++ .../java/com/surveygorilla/common/Poll.java | 11 ++++++-- .../com/surveygorilla/event/MainEvent.java | 18 ++++++++++++ .../event/SurveyEventVerticle.java | 24 ++++++++++++++++ survey-read/build.gradle | 17 +++++++++++ .../read/SurveyReadVerticle.java | 10 ++++++- survey-write/build.gradle | 16 +++++++++++ .../write/SurveyWriteVerticle.java | 16 +++++++++-- 11 files changed, 153 insertions(+), 14 deletions(-) create mode 100644 survey-events/src/main/java/com/surveygorilla/event/MainEvent.java create mode 100644 survey-events/src/main/java/com/surveygorilla/event/SurveyEventVerticle.java diff --git a/README.md b/README.md index eabe9c2..ec71e22 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,38 @@ # Survey Gorilla Survey monkey clone using vertx - -## Todo - - - Statistics - - Event sourcing - - Docker ## Components survey-api +API for all frontends survey-common +Shared VOs used by all services + +survey-write +Handle all write-side requests (POST/PUT/DELETE) survey-read +Answer all read-side requests (GET) -survey-write +survey-event +Log all events happening on the system ## How to run -`docker-compose up` +`gradle clean build` + +`java -jar survey-api/build/libs/survey-api-1.0-SNAPSHOT.jar` + +`java -jar survey-read/build/libs/survey-read-1.0-SNAPSHOT.jar` + +`java -jar survey-write/build/libs/survey-write-1.0-SNAPSHOT.jar` + +`java -jar survey-events/build/libs/survey-events-1.0-SNAPSHOT.jar` + + +## How to use `curl -X GET \ http://localhost:8080/api/polls` diff --git a/build.gradle b/build.gradle index 7ec00ed..a6751ef 100644 --- a/build.gradle +++ b/build.gradle @@ -1,9 +1,19 @@ group 'gorilla' version '1.0-SNAPSHOT' +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.1' + } +} + subprojects { apply plugin: 'java' + apply plugin: 'com.github.johnrengelman.shadow' sourceCompatibility = 1.8 diff --git a/settings.gradle b/settings.gradle index c9e4755..a11ee9c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,4 +4,5 @@ include 'survey-write' include 'survey-api' include 'survey-common' include 'survey-api' +include 'survey-events' diff --git a/survey-api/build.gradle b/survey-api/build.gradle index ea46462..354a52b 100644 --- a/survey-api/build.gradle +++ b/survey-api/build.gradle @@ -1,3 +1,19 @@ +apply plugin: 'application' + dependencies { compile project(":survey-common") } + +shadowJar { + classifier = 'fat' + mainClassName = 'com.surveygorilla.api.MainApi' + + /*manifest { + attributes 'Main-Verticle': 'com.surveygorilla.api.SurveyApiVerticle' + }*/ + mergeServiceFiles { + include 'META-INF/survey-api/io.vertx.core.spi.VerticleFactory' + } +} + +build.dependsOn(shadowJar) diff --git a/survey-common/src/main/java/com/surveygorilla/common/Poll.java b/survey-common/src/main/java/com/surveygorilla/common/Poll.java index ed46f71..f8c7de9 100644 --- a/survey-common/src/main/java/com/surveygorilla/common/Poll.java +++ b/survey-common/src/main/java/com/surveygorilla/common/Poll.java @@ -17,9 +17,11 @@ public class Poll { private Map answers; - public Poll(Integer pollID, String question, Map options, Map answers) throws PollCreationException { + private Map stats; - if (pollID == null || question == null || options == null || answers == null) { + public Poll(Integer pollID, String question, Map options, Map answers, Map stats) throws PollCreationException { + + if (pollID == null || question == null || options == null || answers == null || stats == null) { throw new PollCreationException("Unable to create a new poll"); } @@ -27,6 +29,7 @@ public Poll(Integer pollID, String question, Map options, Map getOptions() { public Map getAnswers() { return answers; } + + public Map getStats() { + return stats; + } } diff --git a/survey-events/src/main/java/com/surveygorilla/event/MainEvent.java b/survey-events/src/main/java/com/surveygorilla/event/MainEvent.java new file mode 100644 index 0000000..7b5a95f --- /dev/null +++ b/survey-events/src/main/java/com/surveygorilla/event/MainEvent.java @@ -0,0 +1,18 @@ +package com.surveygorilla.event; + +import io.vertx.core.Vertx; +import io.vertx.core.VertxOptions; + +/** + * Created by fabio.pires on 18.08.17. + */ +public class MainEvent { + public static void main(String[] args) { + Vertx.clusteredVertx(new VertxOptions().setClustered(true), cluster -> { + if (cluster.succeeded()) { + final Vertx vertx = cluster.result(); + vertx.deployVerticle(SurveyEventVerticle.class.getName()); + } + }); + } +} diff --git a/survey-events/src/main/java/com/surveygorilla/event/SurveyEventVerticle.java b/survey-events/src/main/java/com/surveygorilla/event/SurveyEventVerticle.java new file mode 100644 index 0000000..153bc7a --- /dev/null +++ b/survey-events/src/main/java/com/surveygorilla/event/SurveyEventVerticle.java @@ -0,0 +1,24 @@ +package com.surveygorilla.event; + +import io.vertx.core.AbstractVerticle; +import io.vertx.core.Future; +import io.vertx.core.logging.Logger; +import io.vertx.core.logging.LoggerFactory; + +/** + * Created by fabio.pires on 18.08.17. + */ +public class SurveyEventVerticle extends AbstractVerticle { + + private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + + @Override + public void start(Future start) throws Exception { + logger.info("SurveyEventVerticle started"); + vertx.eventBus().addInterceptor(message -> { + logger.info("NEW EVENT:", message.message().body()); + }); + + start.complete(); + } +} diff --git a/survey-read/build.gradle b/survey-read/build.gradle index ea46462..397a1dc 100644 --- a/survey-read/build.gradle +++ b/survey-read/build.gradle @@ -1,3 +1,20 @@ +apply plugin: 'application' + dependencies { compile project(":survey-common") } + +shadowJar { + classifier = 'fat' + mainClassName = 'com.surveygorilla.read.MainRead' + /* + manifest { + Attributes 'Main-Verticle': 'com.surveygorilla.read.SurveyReadVerticle' + } + */ + mergeServiceFiles { + include 'META-INF/survey-api/io.vertx.core.spi.VerticleFactory' + } +} + +build.dependsOn(shadowJar) diff --git a/survey-read/src/main/java/com/surveygorilla/read/SurveyReadVerticle.java b/survey-read/src/main/java/com/surveygorilla/read/SurveyReadVerticle.java index b86fbcb..04174af 100644 --- a/survey-read/src/main/java/com/surveygorilla/read/SurveyReadVerticle.java +++ b/survey-read/src/main/java/com/surveygorilla/read/SurveyReadVerticle.java @@ -51,7 +51,15 @@ private Handler> pollCreatedEventListener() { PollCreatedEvent.class); try { - polls.put(pollCreatedEvent.getPollID(), new Poll(pollCreatedEvent.getPollID(), pollCreatedEvent.getQuestion(), pollCreatedEvent.getOptions(), new HashMap<>())); + polls.put( + pollCreatedEvent.getPollID(), + new Poll( + pollCreatedEvent.getPollID(), + pollCreatedEvent.getQuestion(), + pollCreatedEvent.getOptions(), + new HashMap<>(), + new HashMap<>() + )); } catch (PollCreationException e) { e.printStackTrace(); } diff --git a/survey-write/build.gradle b/survey-write/build.gradle index ea46462..c4d4e61 100644 --- a/survey-write/build.gradle +++ b/survey-write/build.gradle @@ -1,3 +1,19 @@ +apply plugin: 'application' + dependencies { compile project(":survey-common") } + +shadowJar { + classifier = 'fat' + mainClassName = 'com.surveygorilla.write.MainWrite' + + /*manifest { + Attributes 'Main-Verticle': 'com.surveygorilla.write.SurveyWriteVerticle' + }*/ + mergeServiceFiles { + include 'META-INF/survey-api/io.vertx.core.spi.VerticleFactory' + } +} + +build.dependsOn(shadowJar) diff --git a/survey-write/src/main/java/com/surveygorilla/write/SurveyWriteVerticle.java b/survey-write/src/main/java/com/surveygorilla/write/SurveyWriteVerticle.java index 9efead0..ff6123d 100644 --- a/survey-write/src/main/java/com/surveygorilla/write/SurveyWriteVerticle.java +++ b/survey-write/src/main/java/com/surveygorilla/write/SurveyWriteVerticle.java @@ -18,6 +18,7 @@ import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; /** @@ -52,10 +53,14 @@ private Handler> addPoll() { count.addAndGet(1), createPollCommand.getQuestion(), createPollCommand.getOptions(), + new HashMap<>(), new HashMap<>() ); - createPollCommand.getOptions().keySet().forEach(o -> p.getAnswers().merge(o, 0, Integer::sum)); + createPollCommand.getOptions().keySet().forEach(o -> { + p.getAnswers().merge(o, 0, Integer::sum); + p.getStats().merge(o, 0.0, Double::sum); + }); polls.put(count.get(), p); @@ -82,8 +87,13 @@ private Handler> submitAnswer() { Poll p = polls.get(submitAnswerCommand.getPollID()); if (p != null){ - submitAnswerCommand.getAnswers().forEach(a -> p.getAnswers().merge(a, 1, Integer::sum)); - polls.put(p.getPollID(), p); + submitAnswerCommand.getAnswers().forEach(a -> { + p.getAnswers().merge(a, 1, Integer::sum); + }); + + // TODO stats + + polls.put(p.getPollID(), p); final AnswerSubmitted answerSubmitted = new AnswerSubmitted(p.getPollID(), p.getAnswers()); vertx.eventBus().send("answerSubmittedEvent", Json.encode(answerSubmitted));