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: [email protected]
For additional commands, e-mail: [email protected]