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 2016/04/15 10:53:26 UTC
[4/7] james-project git commit: JAMES-1718 Separate logic from data
access in CassandraAccessTokenRepository
JAMES-1718 Separate logic from data access in CassandraAccessTokenRepository
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/7a59d2da
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/7a59d2da
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/7a59d2da
Branch: refs/heads/master
Commit: 7a59d2da353f2844ed74478f5c28ae1236139c57
Parents: 86ba885
Author: Benoit Tellier <bt...@linagora.com>
Authored: Mon Apr 11 16:43:42 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Apr 15 15:49:52 2016 +0700
----------------------------------------------------------------------
.../access/CassandraAccessTokenDAO.java | 85 ++++++++++++++++++++
.../access/CassandraAccessTokenRepository.java | 57 ++-----------
2 files changed, 91 insertions(+), 51 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/7a59d2da/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenDAO.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenDAO.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenDAO.java
new file mode 100644
index 0000000..1dcd903
--- /dev/null
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenDAO.java
@@ -0,0 +1,85 @@
+/****************************************************************
+ * 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.jmap.cassandra.access;
+
+import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker;
+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 static com.datastax.driver.core.querybuilder.QueryBuilder.ttl;
+
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+
+import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
+import org.apache.james.jmap.api.access.AccessToken;
+import org.apache.james.jmap.cassandra.access.table.CassandraAccessTokenTable;
+
+import com.datastax.driver.core.PreparedStatement;
+import com.datastax.driver.core.Session;
+
+public class CassandraAccessTokenDAO {
+
+ private static final String TTL = "ttl";
+
+ private final CassandraAsyncExecutor cassandraAsyncExecutor;
+ private final PreparedStatement removeStatement;
+ private final PreparedStatement insertStatement;
+ private final PreparedStatement selectStatement;
+ private final int durationInSeconds;
+
+ public CassandraAccessTokenDAO(Session session, long durationInMilliseconds) {
+ this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session);
+ this.durationInSeconds = (int) (durationInMilliseconds / 1000);
+
+ this.removeStatement = session.prepare(delete()
+ .from(CassandraAccessTokenTable.TABLE_NAME)
+ .where(eq(CassandraAccessTokenTable.TOKEN, bindMarker(CassandraAccessTokenTable.TOKEN))));
+
+ this.insertStatement = session.prepare(insertInto(CassandraAccessTokenTable.TABLE_NAME)
+ .ifNotExists()
+ .value(CassandraAccessTokenTable.TOKEN, bindMarker(CassandraAccessTokenTable.TOKEN))
+ .value(CassandraAccessTokenTable.USERNAME, bindMarker(CassandraAccessTokenTable.USERNAME))
+ .using(ttl(bindMarker(TTL))));
+
+ this.selectStatement = session.prepare(select()
+ .from(CassandraAccessTokenTable.TABLE_NAME)
+ .where(eq(CassandraAccessTokenTable.TOKEN, bindMarker(CassandraAccessTokenTable.TOKEN))));
+ }
+
+ public CompletableFuture<Boolean> addToken(String username, AccessToken accessToken) {
+ return cassandraAsyncExecutor.executeReturnApplied(insertStatement.bind()
+ .setUUID(CassandraAccessTokenTable.TOKEN, accessToken.getToken())
+ .setString(CassandraAccessTokenTable.USERNAME, username)
+ .setInt(TTL, durationInSeconds));
+ }
+
+ public CompletableFuture<Void> removeToken(AccessToken accessToken) {
+ return cassandraAsyncExecutor.executeVoid(removeStatement.bind()
+ .setUUID(CassandraAccessTokenTable.TOKEN, accessToken.getToken()));
+ }
+
+ public CompletableFuture<Optional<String>> getUsernameFromToken(AccessToken accessToken) {
+ return cassandraAsyncExecutor.executeSingleRow(selectStatement.bind()
+ .setUUID(CassandraAccessTokenTable.TOKEN, accessToken.getToken()))
+ .thenApply(optional -> optional.map(row -> row.getString(CassandraAccessTokenTable.USERNAME)));
+ }
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/7a59d2da/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenRepository.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenRepository.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenRepository.java
index 9683503..2afd24d 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenRepository.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenRepository.java
@@ -19,57 +19,24 @@
package org.apache.james.jmap.cassandra.access;
-import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker;
-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 static com.datastax.driver.core.querybuilder.QueryBuilder.ttl;
-
-import java.util.Optional;
-
import javax.inject.Inject;
import javax.inject.Named;
-import org.apache.james.backends.cassandra.utils.CassandraConstants;
-import org.apache.james.jmap.cassandra.access.table.CassandraAccessTokenTable;
import org.apache.james.jmap.api.access.AccessToken;
import org.apache.james.jmap.api.access.AccessTokenRepository;
import org.apache.james.jmap.api.access.exceptions.AccessTokenAlreadyStored;
import org.apache.james.jmap.api.access.exceptions.InvalidAccessToken;
-import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.Session;
import com.google.common.base.Preconditions;
public class CassandraAccessTokenRepository implements AccessTokenRepository {
- private static final String TTL = "ttl";
-
- private final Session session;
- private final PreparedStatement removeStatement;
- private final PreparedStatement insertStatement;
- private final PreparedStatement selectStatement;
- private final int durationInSeconds;
+ private final CassandraAccessTokenDAO cassandraAccessTokenDAO;
@Inject
public CassandraAccessTokenRepository(Session session, @Named(TOKEN_EXPIRATION_IN_MS) long durationInMilliseconds) {
- this.session = session;
- this.durationInSeconds = (int) (durationInMilliseconds / 1000);
-
- this.removeStatement = this.session.prepare(delete()
- .from(CassandraAccessTokenTable.TABLE_NAME)
- .where(eq(CassandraAccessTokenTable.TOKEN, bindMarker(CassandraAccessTokenTable.TOKEN))));
-
- this.insertStatement = this.session.prepare(insertInto(CassandraAccessTokenTable.TABLE_NAME)
- .ifNotExists()
- .value(CassandraAccessTokenTable.TOKEN, bindMarker(CassandraAccessTokenTable.TOKEN))
- .value(CassandraAccessTokenTable.USERNAME, bindMarker(CassandraAccessTokenTable.USERNAME))
- .using(ttl(bindMarker(TTL))));
-
- this.selectStatement = this.session.prepare(select()
- .from(CassandraAccessTokenTable.TABLE_NAME)
- .where(eq(CassandraAccessTokenTable.TOKEN, bindMarker(CassandraAccessTokenTable.TOKEN))));
+ this.cassandraAccessTokenDAO = new CassandraAccessTokenDAO(session, durationInMilliseconds);
}
@Override
@@ -78,14 +45,7 @@ public class CassandraAccessTokenRepository implements AccessTokenRepository {
Preconditions.checkArgument(! username.isEmpty(), "Username should not be empty");
Preconditions.checkNotNull(accessToken);
- boolean applied = session.execute(insertStatement.bind()
- .setUUID(CassandraAccessTokenTable.TOKEN, accessToken.getToken())
- .setString(CassandraAccessTokenTable.USERNAME, username)
- .setInt(TTL, durationInSeconds))
- .one()
- .getBool(CassandraConstants.LIGHTWEIGHT_TRANSACTION_APPLIED);
-
- if (!applied) {
+ if (!cassandraAccessTokenDAO.addToken(username, accessToken).join()) {
throw new AccessTokenAlreadyStored(accessToken);
}
}
@@ -94,20 +54,15 @@ public class CassandraAccessTokenRepository implements AccessTokenRepository {
public void removeToken(AccessToken accessToken) {
Preconditions.checkNotNull(accessToken);
- session.execute(removeStatement.bind()
- .setUUID(CassandraAccessTokenTable.TOKEN, accessToken.getToken()));
+ cassandraAccessTokenDAO.removeToken(accessToken).join();
}
@Override
public String getUsernameFromToken(AccessToken accessToken) throws InvalidAccessToken {
Preconditions.checkNotNull(accessToken);
- return Optional.ofNullable(
- session.execute(
- selectStatement.bind()
- .setUUID(CassandraAccessTokenTable.TOKEN, accessToken.getToken()))
- .one())
- .map(row -> row.getString(CassandraAccessTokenTable.USERNAME))
+ return cassandraAccessTokenDAO.getUsernameFromToken(accessToken)
+ .join()
.orElseThrow(() -> new InvalidAccessToken(accessToken));
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org