JAMES-2648 cassandra list sources support implementation
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/9799f43a Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/9799f43a Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/9799f43a Branch: refs/heads/master Commit: 9799f43a896474ee0caea82a8573b1a2ed6133c4 Parents: 2160369 Author: Rene Cordier <rcord...@linagora.com> Authored: Tue Jan 22 17:18:58 2019 +0700 Committer: Benoit Tellier <btell...@linagora.com> Committed: Wed Jan 23 17:40:41 2019 +0700 ---------------------------------------------------------------------- .../james/rrt/api/RecipientRewriteTable.java | 7 +- .../CassandraRecipientRewriteTable.java | 30 ++++++- .../CassandraRecipientRewriteTableTest.java | 71 ---------------- .../CassandraRecipientRewriteTableV6Test.java | 89 ++++++++++++++++++++ .../CassandraRecipientRewriteTableV7Test.java | 89 ++++++++++++++++++++ .../james/rrt/cassandra/CassandraStepdefs.java | 10 ++- .../james/webadmin/routes/AliasRoutes.java | 1 - 7 files changed, 217 insertions(+), 80 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/9799f43a/server/data/data-api/src/main/java/org/apache/james/rrt/api/RecipientRewriteTable.java ---------------------------------------------------------------------- diff --git a/server/data/data-api/src/main/java/org/apache/james/rrt/api/RecipientRewriteTable.java b/server/data/data-api/src/main/java/org/apache/james/rrt/api/RecipientRewriteTable.java index ec0b363..1f067c5 100644 --- a/server/data/data-api/src/main/java/org/apache/james/rrt/api/RecipientRewriteTable.java +++ b/server/data/data-api/src/main/java/org/apache/james/rrt/api/RecipientRewriteTable.java @@ -20,7 +20,6 @@ package org.apache.james.rrt.api; import java.util.Comparator; import java.util.EnumSet; -import java.util.List; import java.util.Map; import java.util.stream.Stream; @@ -30,7 +29,6 @@ import org.apache.james.rrt.lib.MappingSource; import org.apache.james.rrt.lib.Mappings; import org.apache.james.rrt.lib.MappingsImpl; -import com.github.steveash.guavate.Guavate; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; @@ -115,15 +113,14 @@ public interface RecipientRewriteTable { */ Map<MappingSource, Mappings> getAllMappings() throws RecipientRewriteTableException; - default List<MappingSource> listSources(Mapping mapping) throws RecipientRewriteTableException { + default Stream<MappingSource> listSources(Mapping mapping) throws RecipientRewriteTableException { Preconditions.checkArgument(listSourcesSupportedType.contains(mapping.getType()), String.format("Not supported mapping of type %s", mapping.getType())); return getAllMappings() .entrySet().stream() .filter(entry -> entry.getValue().contains(mapping)) - .map(Map.Entry::getKey) - .collect(Guavate.toImmutableList()); + .map(Map.Entry::getKey); } default Stream<MappingSource> getSourcesForType(Mapping.Type type) throws RecipientRewriteTableException { http://git-wip-us.apache.org/repos/asf/james-project/blob/9799f43a/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTable.java ---------------------------------------------------------------------- diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTable.java b/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTable.java index 0a51ec1..bcd7283 100644 --- a/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTable.java +++ b/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTable.java @@ -19,10 +19,15 @@ package org.apache.james.rrt.cassandra; import java.util.Map; +import java.util.stream.Stream; import javax.inject.Inject; +import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionDAO; +import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManager; +import org.apache.james.backends.cassandra.versions.SchemaVersion; import org.apache.james.core.Domain; +import org.apache.james.rrt.api.RecipientRewriteTableException; import org.apache.james.rrt.lib.AbstractRecipientRewriteTable; import org.apache.james.rrt.lib.Mapping; import org.apache.james.rrt.lib.MappingSource; @@ -31,15 +36,22 @@ import org.apache.james.rrt.lib.MappingsImpl; import org.apache.james.util.OptionalUtils; import com.github.steveash.guavate.Guavate; +import com.google.common.base.Preconditions; public class CassandraRecipientRewriteTable extends AbstractRecipientRewriteTable { + private static final SchemaVersion MAPPINGS_SOURCES_SUPPORTED_VERSION = new SchemaVersion(7); + private final CassandraRecipientRewriteTableDAO cassandraRecipientRewriteTableDAO; private final CassandraMappingsSourcesDAO cassandraMappingsSourcesDAO; + private final CassandraSchemaVersionDAO cassandraSchemaVersionDAO; @Inject - public CassandraRecipientRewriteTable(CassandraRecipientRewriteTableDAO cassandraRecipientRewriteTableDAO, CassandraMappingsSourcesDAO cassandraMappingsSourcesDAO) { + public CassandraRecipientRewriteTable(CassandraRecipientRewriteTableDAO cassandraRecipientRewriteTableDAO, + CassandraMappingsSourcesDAO cassandraMappingsSourcesDAO, + CassandraSchemaVersionDAO cassandraSchemaVersionDAO) { this.cassandraRecipientRewriteTableDAO = cassandraRecipientRewriteTableDAO; this.cassandraMappingsSourcesDAO = cassandraMappingsSourcesDAO; + this.cassandraSchemaVersionDAO = cassandraSchemaVersionDAO; } @Override @@ -80,4 +92,20 @@ public class CassandraRecipientRewriteTable extends AbstractRecipientRewriteTabl () -> cassandraRecipientRewriteTableDAO.retrieveMappings(MappingSource.fromDomain(domain)).blockOptional()) .orElse(MappingsImpl.empty()); } + + @Override + public Stream<MappingSource> listSources(Mapping mapping) throws RecipientRewriteTableException { + Preconditions.checkArgument(listSourcesSupportedType.contains(mapping.getType()), + String.format("Not supported mapping of type %s", mapping.getType())); + + SchemaVersion schemaVersion = cassandraSchemaVersionDAO.getCurrentSchemaVersion() + .join() + .orElse(CassandraSchemaVersionManager.MIN_VERSION); + + if (schemaVersion.isBefore(MAPPINGS_SOURCES_SUPPORTED_VERSION)) { + return super.listSources(mapping); + } + + return cassandraMappingsSourcesDAO.retrieveSources(mapping).toStream(); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/9799f43a/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableTest.java ---------------------------------------------------------------------- diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableTest.java deleted file mode 100644 index f9d27a1..0000000 --- a/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableTest.java +++ /dev/null @@ -1,71 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ -package org.apache.james.rrt.cassandra; - -import org.apache.commons.configuration.DefaultConfigurationBuilder; -import org.apache.james.backends.cassandra.CassandraCluster; -import org.apache.james.backends.cassandra.DockerCassandraRule; -import org.apache.james.backends.cassandra.utils.CassandraUtils; -import org.apache.james.rrt.lib.AbstractRecipientRewriteTable; -import org.apache.james.rrt.lib.AbstractRecipientRewriteTableTest; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.ClassRule; - -public class CassandraRecipientRewriteTableTest extends AbstractRecipientRewriteTableTest { - - @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule(); - - private static CassandraCluster cassandra; - - @BeforeClass - public static void setUpClass() { - cassandra = CassandraCluster.create(CassandraRRTModule.MODULE, cassandraServer.getHost()); - } - - @Override - @Before - public void setUp() throws Exception { - super.setUp(); - } - - @Override - @After - public void tearDown() throws Exception { - super.tearDown(); - cassandra.clearTables(); - } - - @AfterClass - public static void tearDownClass() { - cassandra.closeCluster(); - } - - @Override - protected AbstractRecipientRewriteTable getRecipientRewriteTable() throws Exception { - CassandraRecipientRewriteTable rrt = new CassandraRecipientRewriteTable( - new CassandraRecipientRewriteTableDAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION), - new CassandraMappingsSourcesDAO(cassandra.getConf())); - rrt.configure(new DefaultConfigurationBuilder()); - return rrt; - } - -} http://git-wip-us.apache.org/repos/asf/james-project/blob/9799f43a/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableV6Test.java ---------------------------------------------------------------------- diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableV6Test.java b/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableV6Test.java new file mode 100644 index 0000000..31a32e8 --- /dev/null +++ b/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableV6Test.java @@ -0,0 +1,89 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.rrt.cassandra; + +import org.apache.commons.configuration.DefaultConfigurationBuilder; +import org.apache.james.backends.cassandra.CassandraCluster; +import org.apache.james.backends.cassandra.DockerCassandraRule; +import org.apache.james.backends.cassandra.components.CassandraModule; +import org.apache.james.backends.cassandra.utils.CassandraUtils; +import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionDAO; +import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule; +import org.apache.james.backends.cassandra.versions.SchemaVersion; +import org.apache.james.rrt.lib.AbstractRecipientRewriteTable; +import org.apache.james.rrt.lib.AbstractRecipientRewriteTableTest; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.ClassRule; + +public class CassandraRecipientRewriteTableV6Test extends AbstractRecipientRewriteTableTest { + private static final SchemaVersion SCHEMA_VERSION_V6 = new SchemaVersion(6); + + private static final CassandraModule MODULE = CassandraModule.aggregateModules( + CassandraRRTModule.MODULE, + CassandraSchemaVersionModule.MODULE); + + @ClassRule + public static DockerCassandraRule cassandraServer = new DockerCassandraRule(); + + protected static CassandraCluster cassandra; + + @BeforeClass + public static void setUpClass() { + cassandra = CassandraCluster.create(MODULE, cassandraServer.getHost()); + } + + @Override + @Before + public void setUp() throws Exception { + super.setUp(); + } + + @Override + @After + public void tearDown() throws Exception { + super.tearDown(); + cassandra.clearTables(); + } + + @AfterClass + public static void tearDownClass() { + cassandra.closeCluster(); + } + + @Override + protected AbstractRecipientRewriteTable getRecipientRewriteTable() throws Exception { + CassandraSchemaVersionDAO cassandraSchemaVersionDAO = new CassandraSchemaVersionDAO( + cassandra.getConf(), + CassandraUtils.WITH_DEFAULT_CONFIGURATION); + + CassandraRecipientRewriteTable rrt = new CassandraRecipientRewriteTable( + new CassandraRecipientRewriteTableDAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION), + new CassandraMappingsSourcesDAO(cassandra.getConf()), + cassandraSchemaVersionDAO); + rrt.configure(new DefaultConfigurationBuilder()); + + cassandraSchemaVersionDAO.updateVersion(SCHEMA_VERSION_V6); + + return rrt; + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/9799f43a/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableV7Test.java ---------------------------------------------------------------------- diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableV7Test.java b/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableV7Test.java new file mode 100644 index 0000000..c7711b1 --- /dev/null +++ b/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableV7Test.java @@ -0,0 +1,89 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.rrt.cassandra; + +import org.apache.commons.configuration.DefaultConfigurationBuilder; +import org.apache.james.backends.cassandra.CassandraCluster; +import org.apache.james.backends.cassandra.DockerCassandraRule; +import org.apache.james.backends.cassandra.components.CassandraModule; +import org.apache.james.backends.cassandra.utils.CassandraUtils; +import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionDAO; +import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule; +import org.apache.james.backends.cassandra.versions.SchemaVersion; +import org.apache.james.rrt.lib.AbstractRecipientRewriteTable; +import org.apache.james.rrt.lib.AbstractRecipientRewriteTableTest; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.ClassRule; + +public class CassandraRecipientRewriteTableV7Test extends AbstractRecipientRewriteTableTest { + private static final SchemaVersion SCHEMA_VERSION_V7 = new SchemaVersion(7); + + private static final CassandraModule MODULE = CassandraModule.aggregateModules( + CassandraRRTModule.MODULE, + CassandraSchemaVersionModule.MODULE); + + @ClassRule + public static DockerCassandraRule cassandraServer = new DockerCassandraRule(); + + protected static CassandraCluster cassandra; + + @BeforeClass + public static void setUpClass() { + cassandra = CassandraCluster.create(MODULE, cassandraServer.getHost()); + } + + @Override + @Before + public void setUp() throws Exception { + super.setUp(); + } + + @Override + @After + public void tearDown() throws Exception { + super.tearDown(); + cassandra.clearTables(); + } + + @AfterClass + public static void tearDownClass() { + cassandra.closeCluster(); + } + + @Override + protected AbstractRecipientRewriteTable getRecipientRewriteTable() throws Exception { + CassandraSchemaVersionDAO cassandraSchemaVersionDAO = new CassandraSchemaVersionDAO( + cassandra.getConf(), + CassandraUtils.WITH_DEFAULT_CONFIGURATION); + + CassandraRecipientRewriteTable rrt = new CassandraRecipientRewriteTable( + new CassandraRecipientRewriteTableDAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION), + new CassandraMappingsSourcesDAO(cassandra.getConf()), + cassandraSchemaVersionDAO); + rrt.configure(new DefaultConfigurationBuilder()); + + cassandraSchemaVersionDAO.updateVersion(SCHEMA_VERSION_V7); + + return rrt; + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/9799f43a/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraStepdefs.java ---------------------------------------------------------------------- diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraStepdefs.java b/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraStepdefs.java index d9aeac4..c609267 100644 --- a/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraStepdefs.java +++ b/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraStepdefs.java @@ -20,7 +20,10 @@ package org.apache.james.rrt.cassandra; import org.apache.commons.configuration.DefaultConfigurationBuilder; import org.apache.james.backends.cassandra.CassandraCluster; +import org.apache.james.backends.cassandra.components.CassandraModule; import org.apache.james.backends.cassandra.utils.CassandraUtils; +import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionDAO; +import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule; import org.apache.james.rrt.lib.AbstractRecipientRewriteTable; import org.apache.james.rrt.lib.RewriteTablesStepdefs; @@ -39,7 +42,9 @@ public class CassandraStepdefs { @Before public void setup() throws Throwable { - cassandra = CassandraCluster.create(CassandraRRTModule.MODULE, RewriteTablesTest.cassandraServer.getHost()); + cassandra = CassandraCluster.create( + CassandraModule.aggregateModules(CassandraRRTModule.MODULE, CassandraSchemaVersionModule.MODULE), + RewriteTablesTest.cassandraServer.getHost()); mainStepdefs.rewriteTable = getRecipientRewriteTable(); } @@ -51,7 +56,8 @@ public class CassandraStepdefs { private AbstractRecipientRewriteTable getRecipientRewriteTable() throws Exception { CassandraRecipientRewriteTable rrt = new CassandraRecipientRewriteTable( new CassandraRecipientRewriteTableDAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION), - new CassandraMappingsSourcesDAO(cassandra.getConf())); + new CassandraMappingsSourcesDAO(cassandra.getConf()), + new CassandraSchemaVersionDAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION)); rrt.configure(new DefaultConfigurationBuilder()); return rrt; } http://git-wip-us.apache.org/repos/asf/james-project/blob/9799f43a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/AliasRoutes.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/AliasRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/AliasRoutes.java index 475a428..8a7ffd9 100644 --- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/AliasRoutes.java +++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/AliasRoutes.java @@ -219,7 +219,6 @@ public class AliasRoutes implements Routes { MailAddress destinationAddress = MailAddressParser.parseMailAddress(request.params(ALIAS_DESTINATION_ADDRESS), ADDRESS_TYPE); return recipientRewriteTable.listSources(Mapping.alias(destinationAddress.asString())) - .stream() .sorted(Comparator.comparing(MappingSource::asMailAddressString)) .map(AliasSourcesResponse::new) .collect(Guavate.toImmutableSet()); --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org