From c2fda1ffaf9171d259a5694980f69913d1a92334 Mon Sep 17 00:00:00 2001 From: John Ahlroos Date: Sat, 5 May 2018 09:20:04 +0300 Subject: [PATCH] Improve demo --- .../devsoap/dbt/data/BlockTransaction.groovy | 3 +- .../dbt/handlers/ExecutorHandler.groovy | 31 +++++--- .../services/TransactionManagerService.groovy | 8 +- dbt-demo/build.gradle | 1 + dbt-demo/src/ratpack/Ratpack.groovy | 62 +++++++++------ .../src/ratpack/handlebars/index.html.hbs | 78 +++++++++++++++++++ 6 files changed, 145 insertions(+), 38 deletions(-) create mode 100644 dbt-demo/src/ratpack/handlebars/index.html.hbs diff --git a/dbt-core/src/main/groovy/com/devsoap/dbt/data/BlockTransaction.groovy b/dbt-core/src/main/groovy/com/devsoap/dbt/data/BlockTransaction.groovy index fb4bf5f..390cf03 100644 --- a/dbt-core/src/main/groovy/com/devsoap/dbt/data/BlockTransaction.groovy +++ b/dbt-core/src/main/groovy/com/devsoap/dbt/data/BlockTransaction.groovy @@ -1,7 +1,5 @@ package com.devsoap.dbt.data -import com.fasterxml.jackson.annotation.JsonValue -import com.fasterxml.jackson.databind.JsonNode import groovy.transform.ToString import java.nio.charset.StandardCharsets @@ -54,6 +52,7 @@ class BlockTransaction implements Serializable { long timeStamp Map result + String resultError Query() { // For serialization diff --git a/dbt-core/src/main/groovy/com/devsoap/dbt/handlers/ExecutorHandler.groovy b/dbt-core/src/main/groovy/com/devsoap/dbt/handlers/ExecutorHandler.groovy index e8c130d..de9737f 100644 --- a/dbt-core/src/main/groovy/com/devsoap/dbt/handlers/ExecutorHandler.groovy +++ b/dbt-core/src/main/groovy/com/devsoap/dbt/handlers/ExecutorHandler.groovy @@ -82,17 +82,28 @@ class ExecutorHandler implements Handler { def tx = Transaction.create { ds.connection } tx.wrap { Promise.sync { - transaction.queries.each { block -> - log.info "Executing $block.query ..." - if(block.query.toLowerCase().startsWith("select")){ - log.info('Saving result from Select query') - def result = txDs.connection - .createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE) - .executeQuery(block.query) - block.result = toMap(result) - } else { - txDs.connection.createStatement().execute(block.query) + try { + transaction.queries.each { block -> + try{ + def result = txDs.connection + .createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE) + .executeQuery(block.query) + block.result = toMap(result) + log.info "Executing $block.query ..." + if(block.query.toLowerCase().startsWith("select")){ + log.info('Saving result from Select query') + } else { + txDs.connection.createStatement().execute(block.query) + } + } catch (Exception e) { + block.resultError = e.message + throw e + } } + } catch (Exception e) { + log.error("Failed to execute transaction $transaction.id, transaction rolled back", e) + tx.rollback() + transaction.rolledback = true } transaction } diff --git a/dbt-core/src/main/groovy/com/devsoap/dbt/services/TransactionManagerService.groovy b/dbt-core/src/main/groovy/com/devsoap/dbt/services/TransactionManagerService.groovy index 03c0d63..5116960 100644 --- a/dbt-core/src/main/groovy/com/devsoap/dbt/services/TransactionManagerService.groovy +++ b/dbt-core/src/main/groovy/com/devsoap/dbt/services/TransactionManagerService.groovy @@ -55,13 +55,13 @@ class TransactionManagerService implements Service { httpClient.get(config.ledger.remoteUrl.toURI(), { spec -> spec.headers.add('X-Transaction-Id', transactionId) }).flatMap { response -> + if(response.status == Status.of(404)) { + throw new RuntimeException("Transaction with id '$transactionId' could not be found") + } if(response.status != Status.OK) { - throw new RuntimeException("Server returned ${response.statusCode} ${response.status.message}") + throw new RuntimeException("Ledger returned ${response.statusCode} ${response.status.message} for $transactionId") } def oldTransaction = mapper.readValue(response.body.text, BlockTransaction) - if(oldTransaction == null) { - throw new RuntimeException("Transaction with id $transactionId could not be found") - } if(oldTransaction.completed) { throw new RuntimeException("Cannot modify a completed transaction") } diff --git a/dbt-demo/build.gradle b/dbt-demo/build.gradle index f6fc46c..33e43af 100644 --- a/dbt-demo/build.gradle +++ b/dbt-demo/build.gradle @@ -3,6 +3,7 @@ apply plugin: "org.flywaydb.flyway" dependencies { compile project(':dbt-core') + runtime ratpack.dependency('handlebars') runtime ratpack.dependency('h2') runtime ratpack.dependency('jdbc-tx') diff --git a/dbt-demo/src/ratpack/Ratpack.groovy b/dbt-demo/src/ratpack/Ratpack.groovy index c2aaae6..972109e 100644 --- a/dbt-demo/src/ratpack/Ratpack.groovy +++ b/dbt-demo/src/ratpack/Ratpack.groovy @@ -3,10 +3,14 @@ import com.devsoap.dbt.config.DBTConfig import com.devsoap.dbt.demo.DatabaseService import com.devsoap.dbt.services.TransactionManagerService import org.h2.jdbcx.JdbcDataSource +import ratpack.form.Form +import ratpack.handlebars.HandlebarsModule +import ratpack.http.Status import javax.sql.DataSource import static ratpack.groovy.Groovy.ratpack +import static ratpack.handlebars.Template.handlebarsTemplate ratpack { @@ -16,6 +20,8 @@ ratpack { } bindings { + module HandlebarsModule + module (DBTModule) { it.ledger.remoteUrl = 'http://localhost:5050/ledger' it.executor.remoteUrl = 'http://localhost:5050/executor' @@ -27,31 +33,43 @@ ratpack { handlers { - /** - * Consumer services - */ - get('') { - get(TransactionManagerService).execute { transaction -> - transaction.query("INSERT INTO LOGS(LOG_ID,LOG_VALUE) VALUES (${new Random().nextInt()}, 'HELLO')") - }.then { - redirect("/gateway/${it['id'].textValue()}") + get { + render handlebarsTemplate('index.html') + } + + post('addQueryToTransaction') { + def transactionManager = get(TransactionManagerService) + parse(Form).then { Form form -> + def query = form.get('query') + def transactionId = form.get('transactionId') + if(transactionId) { + transactionManager.execute(transactionId) { + it.query(query) + } .then { + response.send(it.toString()) + } + } else { + transactionManager.execute { + it.query(query) + } .then { + response.send(it.toString()) + } + } } } - get('gateway/:transactionId?') { - get(TransactionManagerService).execute(pathTokens.transactionId, { transaction -> - transaction.query("INSERT INTO LOGS(LOG_ID,LOG_VALUE) VALUES (${new Random().nextInt()}, 'WORLD')") - }).then { - redirect("/gateway2/${it['id'].textValue()}") - } - } - - get('gateway2/:transactionId?') { - get(TransactionManagerService).execute(pathTokens.transactionId, { transaction -> - transaction.query("SELECT * FROM LOGS") - transaction.complete() - }).then { - redirect('/ledger') + post('executeTransaction') { + def transactionManager = get(TransactionManagerService) + parse(Form).then { Form form -> + def transactionId = form.get('transactionId') + transactionManager.execute(transactionId) { + it.complete() + }.onError { + response.status(Status.of(501)) + response.send(it.message) + }.then { + response.send(it.toString()) + } } } } diff --git a/dbt-demo/src/ratpack/handlebars/index.html.hbs b/dbt-demo/src/ratpack/handlebars/index.html.hbs new file mode 100644 index 0000000..dfcd797 --- /dev/null +++ b/dbt-demo/src/ratpack/handlebars/index.html.hbs @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + +
+

Transactions

+
+ + + +
+
+ + +
+
+ + + + + + +