diff --git a/java/lc-esp-eo-engine/src/main/java/lc/esp/eo/EOTransaction.java b/java/lc-esp-eo-engine/src/main/java/lc/esp/eo/EOTransaction.java index 99469fbaa738f9d7350d4bf71d52b9f0615e0dd3..a6bc5b46bb0901007f76221a2f05b5a8bbf0d379 100644 --- a/java/lc-esp-eo-engine/src/main/java/lc/esp/eo/EOTransaction.java +++ b/java/lc-esp-eo-engine/src/main/java/lc/esp/eo/EOTransaction.java @@ -1,46 +1,78 @@ package lc.esp.eo; +import com.mongodb.BasicDBObject; +import com.mongodb.TransactionOptions; +import com.mongodb.WriteConcern; import com.mongodb.client.ClientSession; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; +import lc.mecha.log.MechaLogger; +import lc.mecha.log.MechaLoggerFactory; import org.bson.Document; +import org.bson.types.ObjectId; import java.io.Serializable; import java.util.Map; public class EOTransaction implements AutoCloseable { + private static final MechaLogger logger = MechaLoggerFactory.getLogger(EOTransaction.class); private final ClientSession session; private final MongoClient client; - private final String lparName; + private final String databaseName; private final MongoDatabase db; - public EOTransaction(MongoClient client, String lparName) { + public EOTransaction(MongoClient client, String databaseName) { this.client = client; this.session = this.client.startSession(); - this.lparName = lparName; - this.db = client.getDatabase("eo_" + lparName); + this.session.startTransaction(TransactionOptions.builder().writeConcern(WriteConcern.MAJORITY).build()); + this.databaseName = databaseName; + this.db = client.getDatabase("eo_" + databaseName); } - public void objCreate(String type, Map values) { + public ObjectId objCreate(String type, Map values) { + // FIXME: Returning ObjectId here is a leaky abstraction MongoCollection col = db.getCollection("eo_obj"); Document d = new Document(); d.append("data", values); d.append("type", type); - col.insertOne(d); + col.insertOne(session, d); + return d.getObjectId("_id"); + } + + public void getObject(ObjectId value) { + MongoCollection col = db.getCollection("eo_obj"); + + BasicDBObject query = new BasicDBObject(); + query.put("_id", value); + + Document doc = col.find(session, query).first(); + logger.info("Read object from Mongo: {}", doc); } public void commit() { session.commitTransaction(); + session.startTransaction(); } + /** + * Roll back the current transaction and start a new one. + */ public void rollback() { session.abortTransaction(); + session.startTransaction(); } @Override - public void close() throws Exception { + public void close() { session.close(); client.close(); } + + /** + * Drop the database associated with this transaction. + */ + public void drop() { + client.getDatabase("eo_" + databaseName).drop(); + } } diff --git a/java/lc-esp-eo-engine/src/test/java/lc/esp/eo/EOTransactionTest.java b/java/lc-esp-eo-engine/src/test/java/lc/esp/eo/EOTransactionTest.java index 91578976b06040246cbdb183e01c11d960212db0..42b4b95482af8dfe5dc7343f1a527ad4f8b81717 100644 --- a/java/lc-esp-eo-engine/src/test/java/lc/esp/eo/EOTransactionTest.java +++ b/java/lc-esp-eo-engine/src/test/java/lc/esp/eo/EOTransactionTest.java @@ -1,17 +1,26 @@ package lc.esp.eo; +import lc.mecha.log.MechaLogger; +import lc.mecha.log.MechaLoggerFactory; +import org.bson.types.ObjectId; import org.junit.jupiter.api.Test; import java.util.Map; import java.util.UUID; public class EOTransactionTest { + private static final MechaLogger logger = MechaLoggerFactory.getLogger(EOTransactionTest.class); @Test public void testThing() throws Exception { try (EOClient client = new EOClient()) { try (EOTransaction txn = client.getTransaction("junit_" + UUID.randomUUID())) { - txn.objCreate("test", Map.of("first", "Alex")); - // Do nothing + ObjectId id = txn.objCreate("test", Map.of("first", "Alex")); + logger.info("Created EO. [obj: {}]", id); + // txn.commit(); + txn.getObject(id); + txn.rollback(); + txn.getObject(id); + txn.drop(); } } }