From e44313d8dba61804466e61e0d6117935f53d7af9 Mon Sep 17 00:00:00 2001 From: Kateryna Senchenko Date: Fri, 12 Oct 2018 17:56:27 +0300 Subject: [PATCH] Refactored transactional method --- .../java/org/folio/rest/impl/PetsImpl.java | 55 +++++++++++++++---- .../org/folio/rest/utils/PgTransaction.java | 2 + .../folio/rest/utils/TransactionExecutor.java | 42 ++++++++++++++ 3 files changed, 88 insertions(+), 11 deletions(-) create mode 100644 src/main/java/org/folio/rest/utils/TransactionExecutor.java diff --git a/src/main/java/org/folio/rest/impl/PetsImpl.java b/src/main/java/org/folio/rest/impl/PetsImpl.java index d95bebe..b932ee2 100644 --- a/src/main/java/org/folio/rest/impl/PetsImpl.java +++ b/src/main/java/org/folio/rest/impl/PetsImpl.java @@ -15,6 +15,7 @@ import org.folio.rest.persist.interfaces.Results; import org.folio.rest.utils.PgQuery; import org.folio.rest.utils.PgTransaction; +import org.folio.rest.utils.TransactionExecutor; import javax.ws.rs.core.Response; import java.util.List; @@ -176,6 +177,35 @@ public void getPetsAdoptById(String id, Map okapiHeaders, Handle } } +// @Override +// public void postPetsAdoptById(String id, Map okapiHeaders, Handler> asyncResultHandler, Context vertxContext) { +// try { +// vertxContext.runOnContext(v -> { +// Pet entity = new Pet(); +// entity.setId(id); +// PgTransaction pgTransaction = new PgTransaction<>(entity); +// pgTransaction.pgClient = pgClient; +// Future.succeededFuture(pgTransaction) +// .compose(this::startTx) +// .compose(this::findPet) +// .compose(this::vacateShelterPlace) +// .compose(this::adoptPet) +// .compose(this::endTx) +// .setHandler(res -> { +// if (res.failed()) { +// asyncResultHandler.handle(Future.succeededFuture(PostPetsAdoptByIdResponse.respond500WithTextPlain(Response.Status.INTERNAL_SERVER_ERROR.getReasonPhrase()))); +// } else if (res.result().entity == null) { +// asyncResultHandler.handle(Future.succeededFuture(PostPetsAdoptByIdResponse.respond404WithTextPlain(Response.Status.NOT_FOUND.getReasonPhrase()))); +// } else { +// asyncResultHandler.handle(Future.succeededFuture(PostPetsAdoptByIdResponse.respond201WithApplicationJson(res.result().entity))); +// } +// }); +// }); +// } catch (Exception e) { +// asyncResultHandler.handle(Future.succeededFuture(PostPetsAdoptByIdResponse.respond500WithTextPlain(Response.Status.INTERNAL_SERVER_ERROR.getReasonPhrase()))); +// } +// } + @Override public void postPetsAdoptById(String id, Map okapiHeaders, Handler> asyncResultHandler, Context vertxContext) { try { @@ -183,13 +213,16 @@ public void postPetsAdoptById(String id, Map okapiHeaders, Handl Pet entity = new Pet(); entity.setId(id); PgTransaction pgTransaction = new PgTransaction<>(entity); - Future.succeededFuture(pgTransaction) - .compose(this::startTx) - .compose(this::findPet) - .compose(this::vacateShelterPlace) - .compose(this::adoptPet) - .compose(this::endTx) - .setHandler(res -> { + pgTransaction.pgClient = pgClient; + new TransactionExecutor() { + @Override + public Future> runInTransaction(PgTransaction tx) { + return Future.succeededFuture(tx) + .compose(PetsImpl.this::findPet) + .compose(PetsImpl.this::vacateShelterPlace) + .compose(PetsImpl.this::adoptPet); + } + }.executeTransaction(pgTransaction).setHandler(res -> { if (res.failed()) { asyncResultHandler.handle(Future.succeededFuture(PostPetsAdoptByIdResponse.respond500WithTextPlain(Response.Status.INTERNAL_SERVER_ERROR.getReasonPhrase()))); } else if (res.result().entity == null) { @@ -245,14 +278,14 @@ private Future> vacateShelterPlace(PgTransaction tx) { if (reply.succeeded()) { future.complete(tx); } else { - pgClient.rollbackTx(tx.sqlConnection, res -> future.fail(reply.cause())); + future.fail(reply.cause()); } }); } else { future.complete(tx); } } catch (Exception e) { - pgClient.rollbackTx(tx.sqlConnection, reply -> future.fail(e)); + future.fail(e); } return future; } @@ -270,14 +303,14 @@ private Future> adoptPet(PgTransaction tx) { tx.entity = entity; future.complete(tx); } else { - pgClient.rollbackTx(tx.sqlConnection, reply -> future.fail(postReply.cause())); + future.fail(postReply.cause()); } }); } else { future.complete(tx); } } catch (Exception e) { - pgClient.rollbackTx(tx.sqlConnection, reply -> future.fail(e)); + future.fail(e); } return future; } diff --git a/src/main/java/org/folio/rest/utils/PgTransaction.java b/src/main/java/org/folio/rest/utils/PgTransaction.java index 14bfc67..048178a 100644 --- a/src/main/java/org/folio/rest/utils/PgTransaction.java +++ b/src/main/java/org/folio/rest/utils/PgTransaction.java @@ -2,10 +2,12 @@ import io.vertx.core.AsyncResult; import io.vertx.ext.sql.SQLConnection; +import org.folio.rest.persist.PostgresClient; import org.folio.rest.tools.utils.OutStream; public class PgTransaction { public T entity; + public PostgresClient pgClient; public AsyncResult sqlConnection; public OutStream stream; public AsyncResult location; diff --git a/src/main/java/org/folio/rest/utils/TransactionExecutor.java b/src/main/java/org/folio/rest/utils/TransactionExecutor.java new file mode 100644 index 0000000..c321bb8 --- /dev/null +++ b/src/main/java/org/folio/rest/utils/TransactionExecutor.java @@ -0,0 +1,42 @@ +package org.folio.rest.utils; + +import io.vertx.core.Future; + +public abstract class TransactionExecutor { + + public Future> executeTransaction(PgTransaction tx) { + Future> future = Future.future(); + Future.succeededFuture(tx) + .compose(this::startTx) + .compose(this::runInTransaction) + .compose(this::endTx) + .setHandler(res -> { + if (res.failed()) { + tx.pgClient.rollbackTx(tx.sqlConnection, done -> future.fail(res.cause())); + } else { + future.complete(tx); + } + }); + return future; + } + + public abstract Future> runInTransaction(PgTransaction tx); + + private Future> startTx(PgTransaction tx) { + Future> future = Future.future(); + tx.pgClient.startTx(sqlConnection -> { + tx.sqlConnection = sqlConnection; + future.complete(tx); + }); + return future; + } + + private Future> endTx(PgTransaction tx) { + Future> future = Future.future(); + tx.pgClient.endTx(tx.sqlConnection, v -> { + future.complete(tx); + }); + return future; + } + +}