You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2018/07/26 07:02:37 UTC

[19/27] james-project git commit: MAILBOX-342 Introduce a builder for CassandraModule

MAILBOX-342 Introduce a builder for CassandraModule


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/dd7020d9
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/dd7020d9
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/dd7020d9

Branch: refs/heads/master
Commit: dd7020d974f98c6bb576d40021919f391455a2a7
Parents: 1b27146
Author: benwa <bt...@linagora.com>
Authored: Tue Jul 24 14:31:03 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Thu Jul 26 13:47:39 2018 +0700

----------------------------------------------------------------------
 .../cassandra/components/CassandraModule.java   | 104 +++++++++++++++++++
 1 file changed, 104 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/dd7020d9/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraModule.java
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraModule.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraModule.java
index 3655b5a..a082fc1 100644
--- a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraModule.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraModule.java
@@ -20,9 +20,113 @@
 package org.apache.james.backends.cassandra.components;
 
 import java.util.List;
+import java.util.function.Function;
+
+import com.datastax.driver.core.Statement;
+import com.datastax.driver.core.schemabuilder.Create;
+import com.datastax.driver.core.schemabuilder.CreateType;
+import com.datastax.driver.core.schemabuilder.SchemaBuilder;
+import com.google.common.collect.ImmutableList;
 
 public interface CassandraModule {
 
+    class Impl implements CassandraModule {
+        private final List<CassandraTable> tables;
+        private final List<CassandraType> types;
+
+        private Impl(List<CassandraTable> tables, List<CassandraType> types) {
+            this.tables = tables;
+            this.types = types;
+        }
+
+        @Override
+        public List<CassandraTable> moduleTables() {
+            return tables;
+        }
+
+        @Override
+        public List<CassandraType> moduleTypes() {
+            return types;
+        }
+    }
+
+    class Builder {
+        private ImmutableList.Builder<CassandraTable> tables;
+        private ImmutableList.Builder<CassandraType> types;
+
+        private Builder() {
+            tables = ImmutableList.builder();
+            types = ImmutableList.builder();
+        }
+
+        public TableBuilder table(String tableName) {
+            return new TableBuilder(this, tableName);
+        }
+
+        public TypeBuilder type(String typeName) {
+            return new TypeBuilder(this, typeName);
+        }
+
+        public Impl build() {
+            return new Impl(
+                tables.build(),
+                types.build());
+        }
+
+        private Builder addTable(CassandraTable table) {
+            tables.add(table);
+            return this;
+        }
+
+        private Builder addType(CassandraType type) {
+            types.add(type);
+            return this;
+        }
+    }
+
+    class TableBuilder {
+        private final Builder originalBuilderReference;
+        private final String tableName;
+
+        private TableBuilder(Builder originalBuilderReference, String tableName) {
+            this.originalBuilderReference = originalBuilderReference;
+            this.tableName = tableName;
+        }
+
+        public Builder statement(Function<Create, Statement> createStatement) {
+            return originalBuilderReference.addTable(
+                new CassandraTable(tableName, createStatement.apply(SchemaBuilder.createTable(tableName))));
+        }
+    }
+
+    class TypeBuilder {
+        private final Builder originalBuilderReference;
+        private final String typeName;
+
+        private TypeBuilder(Builder originalBuilderReference, String typeName) {
+            this.originalBuilderReference = originalBuilderReference;
+            this.typeName = typeName;
+        }
+
+        public Builder statement(Function<CreateType, CreateType> createStatement) {
+            return originalBuilderReference.addType(
+                new CassandraType(typeName, createStatement.apply(
+                    SchemaBuilder.createType(typeName))));
+        }
+    }
+
+    static Builder builder() {
+        return new Builder();
+    }
+
+    static TypeBuilder type(String typeName) {
+        return builder().type(typeName);
+    }
+
+    static TableBuilder table(String tableName) {
+        return builder().table(tableName);
+    }
+
     List<CassandraTable> moduleTables();
 
     List<CassandraType> moduleTypes();


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org