Author: matthieu Date: Mon Nov 2 14:54:34 2015 New Revision: 1712031 URL: http://svn.apache.org/viewvc?rev=1712031&view=rev Log: JAMES-1587 Add Cassandra based Domain List
Contributed by Benoit Tellier and Raphael Ouazana Added: james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/CassandraDataModule.java james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/ james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/ james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/tables/ james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/tables/CassandraDomainsTable.java james/project/trunk/server/data/data-cassandra/src/test/java/org/apache/james/domainlist/ james/project/trunk/server/data/data-cassandra/src/test/java/org/apache/james/domainlist/cassandra/ james/project/trunk/server/data/data-cassandra/src/test/java/org/apache/james/domainlist/cassandra/CassandraDomainListTest.java Added: james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/CassandraDataModule.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/CassandraDataModule.java?rev=1712031&view=auto ============================================================================== --- james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/CassandraDataModule.java (added) +++ james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/CassandraDataModule.java Mon Nov 2 14:54:34 2015 @@ -0,0 +1,64 @@ +/**************************************************************** + * 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; + +import static com.datastax.driver.core.DataType.text; + +import java.util.List; + +import org.apache.james.backends.cassandra.components.CassandraIndex; +import org.apache.james.backends.cassandra.components.CassandraModule; +import org.apache.james.backends.cassandra.components.CassandraTable; +import org.apache.james.backends.cassandra.components.CassandraType; +import org.apache.james.tables.CassandraDomainsTable; + +import com.datastax.driver.core.schemabuilder.SchemaBuilder; +import com.google.common.collect.ImmutableList; + +public class CassandraDataModule implements CassandraModule { + private final List<CassandraTable> tables; + private final List<CassandraIndex> index; + private final List<CassandraType> types; + + public CassandraDataModule() { + tables = ImmutableList.of( + new CassandraTable(CassandraDomainsTable.TABLE_NAME, + SchemaBuilder.createTable(CassandraDomainsTable.TABLE_NAME) + .ifNotExists() + .addPartitionKey(CassandraDomainsTable.DOMAIN, text()))); + index = ImmutableList.of(); + types = ImmutableList.of(); + } + + @Override + public List<CassandraTable> moduleTables() { + return tables; + } + + @Override + public List<CassandraIndex> moduleIndex() { + return index; + } + + @Override + public List<CassandraType> moduleTypes() { + return types; + } +} Added: james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java?rev=1712031&view=auto ============================================================================== --- james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java (added) +++ james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java Mon Nov 2 14:54:34 2015 @@ -0,0 +1,91 @@ +/**************************************************************** + * 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.domainlist.cassandra; + +import static com.datastax.driver.core.querybuilder.QueryBuilder.delete; +import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; +import static com.datastax.driver.core.querybuilder.QueryBuilder.insertInto; +import static com.datastax.driver.core.querybuilder.QueryBuilder.select; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; + +import org.apache.james.backends.cassandra.utils.CassandraConstants; +import org.apache.james.backends.cassandra.utils.CassandraUtils; +import org.apache.james.domainlist.api.DomainListException; +import org.apache.james.domainlist.lib.AbstractDomainList; +import org.apache.james.tables.CassandraDomainsTable; + +import com.datastax.driver.core.ResultSet; +import com.datastax.driver.core.Session; + +public class CassandraDomainList extends AbstractDomainList { + + private Session session; + + @Inject + @Resource + public void setSession(@Named("cassandra-session") Session session) { + this.session = session; + } + + @Override + protected List<String> getDomainListInternal() throws DomainListException { + return CassandraUtils.convertToStream(session.execute(select(CassandraDomainsTable.DOMAIN).from(CassandraDomainsTable.TABLE_NAME))) + .map(row -> row.getString(CassandraDomainsTable.DOMAIN)) + .collect(Collectors.toList()); + } + + @Override + public boolean containsDomain(String domain) throws DomainListException { + return session.execute(select(CassandraDomainsTable.DOMAIN) + .from(CassandraDomainsTable.TABLE_NAME) + .where(eq(CassandraDomainsTable.DOMAIN, domain.toLowerCase()))) + .one() != null; + } + + @Override + public void addDomain(String domain) throws DomainListException { + boolean executed = session.execute(insertInto(CassandraDomainsTable.TABLE_NAME) + .ifNotExists() + .value(CassandraDomainsTable.DOMAIN, domain.toLowerCase())) + .one() + .getBool(CassandraConstants.LIGHTWEIGHT_TRANSACTION_APPLIED); + if (!executed) { + throw new DomainListException(domain.toLowerCase() + " already exists."); + } + } + + @Override + public void removeDomain(String domain) throws DomainListException { + ResultSet resultSet = session.execute(delete() + .from(CassandraDomainsTable.TABLE_NAME) + .ifExists() + .where(eq(CassandraDomainsTable.DOMAIN, domain.toLowerCase()))); + if (!resultSet.one().getBool(CassandraConstants.LIGHTWEIGHT_TRANSACTION_APPLIED)) { + throw new DomainListException(domain + " was not found"); + } + } + +} \ No newline at end of file Added: james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/tables/CassandraDomainsTable.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/tables/CassandraDomainsTable.java?rev=1712031&view=auto ============================================================================== --- james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/tables/CassandraDomainsTable.java (added) +++ james/project/trunk/server/data/data-cassandra/src/main/java/org/apache/james/tables/CassandraDomainsTable.java Mon Nov 2 14:54:34 2015 @@ -0,0 +1,26 @@ +/**************************************************************** + * 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.tables; + +public interface CassandraDomainsTable { + String TABLE_NAME = "domains"; + + String DOMAIN = "domain"; +} Added: james/project/trunk/server/data/data-cassandra/src/test/java/org/apache/james/domainlist/cassandra/CassandraDomainListTest.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/data/data-cassandra/src/test/java/org/apache/james/domainlist/cassandra/CassandraDomainListTest.java?rev=1712031&view=auto ============================================================================== --- james/project/trunk/server/data/data-cassandra/src/test/java/org/apache/james/domainlist/cassandra/CassandraDomainListTest.java (added) +++ james/project/trunk/server/data/data-cassandra/src/test/java/org/apache/james/domainlist/cassandra/CassandraDomainListTest.java Mon Nov 2 14:54:34 2015 @@ -0,0 +1,44 @@ +/**************************************************************** + * 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.domainlist.cassandra; + +import org.apache.james.CassandraDataModule; +import org.apache.james.backends.cassandra.CassandraCluster; +import org.apache.james.domainlist.api.DomainList; +import org.apache.james.domainlist.lib.AbstractDomainListTest; +import org.slf4j.LoggerFactory; + +public class CassandraDomainListTest extends AbstractDomainListTest { + + private CassandraCluster cassandra; + + @Override + protected DomainList createDomainList() { + CassandraDomainList testee = new CassandraDomainList(); + cassandra = CassandraCluster.create(new CassandraDataModule()); + testee.setSession(cassandra.getConf()); + testee.setLog(LoggerFactory.getLogger(getClass())); + testee.setDNSService(getDNSServer("localhost")); + testee.setAutoDetect(false); + testee.setAutoDetectIP(false); + return testee; + } + +} --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org