diff --git a/pom.xml b/pom.xml index 3673b88..6069bb4 100644 --- a/pom.xml +++ b/pom.xml @@ -60,6 +60,11 @@ 4.12 test + + io.vertx + vertx-rx-java + 3.4.0 + io.vertx vertx-unit @@ -95,14 +100,14 @@ + implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> io.vertx.core.Launcher ${main.verticle} + implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> META-INF/services/io.vertx.core.spi.VerticleFactory diff --git a/src/main/java/com/tidyjava/example/ActivityModule.java b/src/main/java/com/tidyjava/example/ActivityModule.java index e840c0e..cdc4c8d 100644 --- a/src/main/java/com/tidyjava/example/ActivityModule.java +++ b/src/main/java/com/tidyjava/example/ActivityModule.java @@ -5,9 +5,9 @@ import com.tidyjava.example.gateways.ActivityGatewayImpl; import com.tidyjava.example.usecases.listActivities.ListActivitiesInputBoundary; import com.tidyjava.example.usecases.listActivities.ListActivitiesUseCase; -import io.vertx.core.Vertx; import io.vertx.core.json.JsonObject; -import io.vertx.ext.jdbc.JDBCClient; +import io.vertx.rxjava.core.Vertx; +import io.vertx.rxjava.ext.jdbc.JDBCClient; public class ActivityModule extends AbstractModule { private final Vertx vertx; diff --git a/src/main/java/com/tidyjava/example/MainVerticle.java b/src/main/java/com/tidyjava/example/MainVerticle.java index 716d220..9bf5f7e 100644 --- a/src/main/java/com/tidyjava/example/MainVerticle.java +++ b/src/main/java/com/tidyjava/example/MainVerticle.java @@ -5,18 +5,22 @@ import com.tidyjava.example.usecases.listActivities.ListActivitiesInputBoundary; import com.tidyjava.example.usecases.listActivities.ListActivitiesUseCase; import com.tidyjava.example.usecases.listActivities.ListActivitiesView; -import io.vertx.core.AbstractVerticle; -import io.vertx.ext.jdbc.JDBCClient; -import io.vertx.ext.sql.SQLConnection; -import io.vertx.ext.web.Router; +import io.vertx.core.Future; +import io.vertx.rxjava.core.AbstractVerticle; +import io.vertx.rxjava.ext.jdbc.JDBCClient; +import io.vertx.rxjava.ext.sql.SQLConnection; +import io.vertx.rxjava.ext.web.Router; +import rx.Single; public class MainVerticle extends AbstractVerticle { @Override - public void start() { - initDatabase(); - + public void start(Future startFuture) throws Exception { + initDatabase().subscribe(c -> { + startFuture.complete(); + }, startFuture::fail); Router router = Router.router(vertx); + Injector injector = Guice.createInjector(new ActivityModule(vertx, config())); ListActivitiesInputBoundary listActivitiesUseCase = injector.getInstance(ListActivitiesUseCase.class); @@ -26,33 +30,14 @@ public void start() { }); vertx.createHttpServer() - .requestHandler(router::accept) - .listen(8080); + .requestHandler(router::accept) + .listen(8080); } - private void initDatabase() { + private Single initDatabase() { JDBCClient client = JDBCClient.createShared(vertx, config()); - - client.getConnection(res -> { - if (res.succeeded()) { - SQLConnection connection = res.result(); - connection.update("CREATE TABLE ACTIVITIES(ID VARCHAR(255) PRIMARY KEY, NAME VARCHAR(255));", upres -> { - if (upres.succeeded()) { - System.out.println("Success 1!"); - } else { - System.out.println("Almost 1!"); - } - }); - connection.update("INSERT INTO ACTIVITIES(id, name) VALUES ('id1', 'name1');", upres -> { - if (upres.succeeded()) { - System.out.println("Success 2!"); - } else { - System.out.println("Almost 2!"); - } - }); - } else { - System.out.println("Holy Moly!"); - } - }); + return client.rxGetConnection() + .flatMap(connection -> connection.rxUpdate("CREATE TABLE ACTIVITIES(ID VARCHAR(255) PRIMARY KEY, NAME VARCHAR(255));").map(r -> connection)) + .flatMap(connection -> connection.rxUpdate("INSERT INTO ACTIVITIES(id, name) VALUES ('id1', 'name1');").map(r -> connection)); } } diff --git a/src/main/java/com/tidyjava/example/gateways/ActivityGateway.java b/src/main/java/com/tidyjava/example/gateways/ActivityGateway.java index 642db5f..1a701d9 100644 --- a/src/main/java/com/tidyjava/example/gateways/ActivityGateway.java +++ b/src/main/java/com/tidyjava/example/gateways/ActivityGateway.java @@ -1,10 +1,12 @@ package com.tidyjava.example.gateways; +import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader; import com.tidyjava.example.callback.Callback; import com.tidyjava.example.entities.Activity; +import rx.Single; import java.util.List; public interface ActivityGateway { - void findAll(Callback> callback); + Single> findAll(); } diff --git a/src/main/java/com/tidyjava/example/gateways/ActivityGatewayImpl.java b/src/main/java/com/tidyjava/example/gateways/ActivityGatewayImpl.java index d4e8e8c..4eea3fa 100644 --- a/src/main/java/com/tidyjava/example/gateways/ActivityGatewayImpl.java +++ b/src/main/java/com/tidyjava/example/gateways/ActivityGatewayImpl.java @@ -1,14 +1,12 @@ package com.tidyjava.example.gateways; -import com.tidyjava.example.callback.Callback; import com.tidyjava.example.entities.Activity; import io.vertx.core.json.JsonObject; -import io.vertx.ext.jdbc.JDBCClient; -import io.vertx.ext.sql.SQLConnection; +import io.vertx.rxjava.ext.jdbc.JDBCClient; +import rx.Single; import javax.inject.Inject; import java.util.List; -import java.util.function.Consumer; import java.util.stream.Collectors; public class ActivityGatewayImpl implements ActivityGateway { @@ -20,32 +18,14 @@ public ActivityGatewayImpl(JDBCClient jdbcClient) { } @Override - public void findAll(Callback> callback) { - getConnection(connection -> connection.query("SELECT * FROM Activities;", asyncRs -> { - if (asyncRs.succeeded()) { - List activities = asyncRs.result() - .getRows() - .stream() - .map(this::toActivity) - .collect(Collectors.toList()); - - callback.success(activities); - } else { - callback.failure(asyncRs.cause()); - } - }), callback::failure); - } - - private void getConnection(Consumer sqlConnectionConsumer, Consumer onFailure) { - jdbcClient.getConnection(asyncConn -> { - if (asyncConn.succeeded()) { - SQLConnection connection = asyncConn.result(); - sqlConnectionConsumer.accept(connection); - connection.close(); - } else { - onFailure.accept(asyncConn.cause()); - } - }); + public Single> findAll() { + return jdbcClient.rxGetConnection() + .flatMap(connection -> connection.rxQuery("SELECT * FROM Activities;")) + .map(result -> result + .getRows() + .stream() + .map(this::toActivity) + .collect(Collectors.toList())); } private Activity toActivity(JsonObject row) { diff --git a/src/main/java/com/tidyjava/example/usecases/listActivities/ListActivitiesUseCase.java b/src/main/java/com/tidyjava/example/usecases/listActivities/ListActivitiesUseCase.java index 09f3f66..be30dab 100644 --- a/src/main/java/com/tidyjava/example/usecases/listActivities/ListActivitiesUseCase.java +++ b/src/main/java/com/tidyjava/example/usecases/listActivities/ListActivitiesUseCase.java @@ -1,6 +1,5 @@ package com.tidyjava.example.usecases.listActivities; -import com.tidyjava.example.callback.Callback; import com.tidyjava.example.entities.Activity; import com.tidyjava.example.gateways.ActivityGateway; @@ -18,16 +17,17 @@ public ListActivitiesUseCase(ActivityGateway activityGateway) { @Override public void listActivities(ListActivitiesOutputBoundary presenter) { - activityGateway.findAll(Callback.of( - activities -> presenter.success(toResponseModel(activities)), - presenter::failure)); + activityGateway + .findAll() + .map(this::toResponseModel) + .subscribe(presenter::success, presenter::failure); } private List toResponseModel(List activities) { return activities - .stream() - .map(Activity::getName) - .map(ActivityDetails::new) - .collect(Collectors.toList()); + .stream() + .map(Activity::getName) + .map(ActivityDetails::new) + .collect(Collectors.toList()); } } diff --git a/src/main/java/com/tidyjava/example/usecases/listActivities/ListActivitiesView.java b/src/main/java/com/tidyjava/example/usecases/listActivities/ListActivitiesView.java index b9f5f6c..ada1688 100644 --- a/src/main/java/com/tidyjava/example/usecases/listActivities/ListActivitiesView.java +++ b/src/main/java/com/tidyjava/example/usecases/listActivities/ListActivitiesView.java @@ -1,7 +1,7 @@ package com.tidyjava.example.usecases.listActivities; -import io.vertx.ext.web.RoutingContext; -import io.vertx.ext.web.templ.FreeMarkerTemplateEngine; +import io.vertx.rxjava.ext.web.RoutingContext; +import io.vertx.rxjava.ext.web.templ.FreeMarkerTemplateEngine; import java.util.List; diff --git a/src/test/java/com/tidyjava/example/MainVerticleTest.java b/src/test/java/com/tidyjava/example/MainVerticleTest.java index f18ab98..f998875 100644 --- a/src/test/java/com/tidyjava/example/MainVerticleTest.java +++ b/src/test/java/com/tidyjava/example/MainVerticleTest.java @@ -1,6 +1,8 @@ package com.tidyjava.example; +import io.vertx.core.DeploymentOptions; import io.vertx.core.Vertx; +import io.vertx.core.json.JsonObject; import io.vertx.ext.unit.Async; import io.vertx.ext.unit.TestContext; import io.vertx.ext.unit.junit.VertxUnitRunner; @@ -16,8 +18,11 @@ public class MainVerticleTest { @Before public void setUp(TestContext tc) { + JsonObject config = new JsonObject(); + config.put("url", "jdbc:h2:mem:test"); + config.put("driver_class", "org.h2.Driver"); vertx = Vertx.vertx(); - vertx.deployVerticle(MainVerticle.class.getName(), tc.asyncAssertSuccess()); + vertx.deployVerticle(MainVerticle.class.getName(), new DeploymentOptions().setConfig(config), tc.asyncAssertSuccess()); } @After @@ -37,4 +42,4 @@ public void testThatTheServerIsStarted(TestContext tc) { }); } -} \ No newline at end of file +}