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 <[email protected]> Authored: Tue Jul 24 14:31:03 2018 +0700 Committer: benwa <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
