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:29 UTC

[7/7] james-project git commit: JAMES-1718 rely on runtime exceptions

JAMES-1718 rely on runtime exceptions


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/e71a7cd5
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/e71a7cd5
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/e71a7cd5

Branch: refs/heads/master
Commit: e71a7cd5a96ab507c0a0d87900100f1d18c70f51
Parents: 7e39d44
Author: Benoit Tellier <bt...@linagora.com>
Authored: Wed Apr 13 09:45:20 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Apr 15 15:50:30 2016 +0700

----------------------------------------------------------------------
 server/data/data-jmap-cassandra/pom.xml         |  5 -----
 .../access/CassandraAccessTokenDAO.java         | 10 +++++++--
 .../access/CassandraAccessTokenRepository.java  | 13 ++++-------
 .../CassandraAccessTokenRepositoryTest.java     |  2 +-
 server/data/data-jmap/pom.xml                   |  4 ----
 .../jmap/api/access/AccessTokenRepository.java  |  4 +---
 .../access/MemoryAccessTokenRepository.java     |  7 +++---
 .../AbstractAccessTokenRepositoryTest.java      | 23 ++++++++++++--------
 .../jmap/crypto/AccessTokenManagerImpl.java     | 15 ++++++++-----
 .../jmap/crypto/AccessTokenManagerImplTest.java |  2 +-
 10 files changed, 43 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/e71a7cd5/server/data/data-jmap-cassandra/pom.xml
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/pom.xml b/server/data/data-jmap-cassandra/pom.xml
index 10cae1a..f07ab0d 100644
--- a/server/data/data-jmap-cassandra/pom.xml
+++ b/server/data/data-jmap-cassandra/pom.xml
@@ -229,11 +229,6 @@
                     <groupId>org.slf4j</groupId>
                     <artifactId>slf4j-api</artifactId>
                 </dependency>
-                <dependency>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-simple</artifactId>
-                    <scope>test</scope>
-                </dependency>
             </dependencies>
         </profile>
         <profile>

http://git-wip-us.apache.org/repos/asf/james-project/blob/e71a7cd5/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
index b5c884c..5bdd9be 100644
--- 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
@@ -25,9 +25,14 @@ 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 static org.apache.james.jmap.api.access.AccessTokenRepository.TOKEN_EXPIRATION_IN_MS;
 
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+
+import javax.inject.Inject;
+import javax.inject.Named;
 
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.jmap.api.access.AccessToken;
@@ -47,9 +52,10 @@ public class CassandraAccessTokenDAO {
     private final PreparedStatement selectStatement;
     private final int durationInSeconds;
 
-    public CassandraAccessTokenDAO(Session session, long durationInMilliseconds) {
+    @Inject
+    public CassandraAccessTokenDAO(Session session, @Named(TOKEN_EXPIRATION_IN_MS) long durationInMilliseconds) {
         this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session);
-        this.durationInSeconds = Ints.checkedCast(durationInMilliseconds / 1000);
+        this.durationInSeconds = Ints.checkedCast(TimeUnit.MILLISECONDS.toSeconds(durationInMilliseconds));
 
         this.removeStatement = session.prepare(delete()
             .from(CassandraAccessTokenTable.TABLE_NAME)

http://git-wip-us.apache.org/repos/asf/james-project/blob/e71a7cd5/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 4ddbc1c..1dac5e7 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
@@ -22,23 +22,20 @@ package org.apache.james.jmap.cassandra.access;
 import java.util.concurrent.CompletableFuture;
 
 import javax.inject.Inject;
-import javax.inject.Named;
 
 import org.apache.james.jmap.api.access.AccessToken;
 import org.apache.james.jmap.api.access.AccessTokenRepository;
 import org.apache.james.jmap.api.access.exceptions.InvalidAccessToken;
 
-import com.datastax.driver.core.Session;
 import com.google.common.base.Preconditions;
-import com.jasongoodwin.monads.Try;
 
 public class CassandraAccessTokenRepository implements AccessTokenRepository {
 
     private final CassandraAccessTokenDAO cassandraAccessTokenDAO;
 
     @Inject
-    public CassandraAccessTokenRepository(Session session, @Named(TOKEN_EXPIRATION_IN_MS) long durationInMilliseconds) {
-        this.cassandraAccessTokenDAO = new CassandraAccessTokenDAO(session, durationInMilliseconds);
+    public CassandraAccessTokenRepository(CassandraAccessTokenDAO cassandraAccessTokenDAO) {
+        this.cassandraAccessTokenDAO = cassandraAccessTokenDAO;
     }
 
     @Override
@@ -58,13 +55,11 @@ public class CassandraAccessTokenRepository implements AccessTokenRepository {
     }
 
     @Override
-    public CompletableFuture<Try<String>> getUsernameFromToken(AccessToken accessToken) throws InvalidAccessToken {
+    public CompletableFuture<String> getUsernameFromToken(AccessToken accessToken) throws InvalidAccessToken {
         Preconditions.checkNotNull(accessToken);
 
         return cassandraAccessTokenDAO.getUsernameFromToken(accessToken)
             .thenApply(
-                optional -> Try.ofFailable(
-                    () -> optional.orElseThrow(
-                        () -> new InvalidAccessToken(accessToken))));
+                optional -> optional.<InvalidAccessToken>orElseThrow(() -> new InvalidAccessToken(accessToken)));
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/e71a7cd5/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenRepositoryTest.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenRepositoryTest.java b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenRepositoryTest.java
index 355e45d..1217698 100644
--- a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenRepositoryTest.java
+++ b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenRepositoryTest.java
@@ -31,7 +31,7 @@ public class CassandraAccessTokenRepositoryTest extends AbstractAccessTokenRepos
     @Override
     protected AccessTokenRepository createAccessTokenRepository() {
         cassandra = CassandraCluster.create(new CassandraAccessModule());
-        return new CassandraAccessTokenRepository(cassandra.getConf(), TTL_IN_MS);
+        return new CassandraAccessTokenRepository(new CassandraAccessTokenDAO(cassandra.getConf(), TTL_IN_MS));
     }
 
     @After

http://git-wip-us.apache.org/repos/asf/james-project/blob/e71a7cd5/server/data/data-jmap/pom.xml
----------------------------------------------------------------------
diff --git a/server/data/data-jmap/pom.xml b/server/data/data-jmap/pom.xml
index 4166b7e..48b55ff 100644
--- a/server/data/data-jmap/pom.xml
+++ b/server/data/data-jmap/pom.xml
@@ -182,10 +182,6 @@
                     <artifactId>guava</artifactId>
                 </dependency>
                 <dependency>
-                    <groupId>com.jason-goodwin</groupId>
-                    <artifactId>better-monads</artifactId>
-                </dependency>
-                <dependency>
                     <groupId>org.apache.commons</groupId>
                     <artifactId>commons-collections4</artifactId>
                 </dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/e71a7cd5/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/access/AccessTokenRepository.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/access/AccessTokenRepository.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/access/AccessTokenRepository.java
index a2a7e2f..525fea9 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/access/AccessTokenRepository.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/access/AccessTokenRepository.java
@@ -23,8 +23,6 @@ import java.util.concurrent.CompletableFuture;
 
 import org.apache.james.jmap.api.access.exceptions.InvalidAccessToken;
 
-import com.jasongoodwin.monads.Try;
-
 public interface AccessTokenRepository {
 
     String TOKEN_EXPIRATION_IN_MS = "tokenExpirationInMs";
@@ -33,6 +31,6 @@ public interface AccessTokenRepository {
 
     CompletableFuture<Void> removeToken(AccessToken accessToken);
 
-    CompletableFuture<Try<String>> getUsernameFromToken(AccessToken accessToken) throws InvalidAccessToken;
+    CompletableFuture<String> getUsernameFromToken(AccessToken accessToken) throws InvalidAccessToken;
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/e71a7cd5/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/access/MemoryAccessTokenRepository.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/access/MemoryAccessTokenRepository.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/access/MemoryAccessTokenRepository.java
index 0a67751..b236599 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/access/MemoryAccessTokenRepository.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/access/MemoryAccessTokenRepository.java
@@ -21,6 +21,7 @@ package org.apache.james.jmap.memory.access;
 
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionException;
 
 import javax.inject.Inject;
 import javax.inject.Named;
@@ -32,7 +33,6 @@ import org.apache.james.jmap.api.access.AccessTokenRepository;
 import org.apache.james.jmap.api.access.exceptions.InvalidAccessToken;
 
 import com.google.common.base.Preconditions;
-import com.jasongoodwin.monads.Try;
 
 @Singleton
 public class MemoryAccessTokenRepository implements AccessTokenRepository {
@@ -65,11 +65,12 @@ public class MemoryAccessTokenRepository implements AccessTokenRepository {
     }
 
     @Override
-    public CompletableFuture<Try<String>> getUsernameFromToken(AccessToken accessToken) throws InvalidAccessToken {
+    public CompletableFuture<String> getUsernameFromToken(AccessToken accessToken) throws InvalidAccessToken {
         Preconditions.checkNotNull(accessToken);
         synchronized (tokensExpirationDates) {
             return CompletableFuture.completedFuture(
-                Try.ofFailable(() -> Optional.ofNullable(tokensExpirationDates.get(accessToken)).orElseThrow(() -> new InvalidAccessToken(accessToken))));
+                Optional.ofNullable(tokensExpirationDates.get(accessToken))
+                    .<CompletionException>orElseThrow(() -> new CompletionException(new InvalidAccessToken(accessToken))));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/e71a7cd5/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/access/AbstractAccessTokenRepositoryTest.java
----------------------------------------------------------------------
diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/access/AbstractAccessTokenRepositoryTest.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/access/AbstractAccessTokenRepositoryTest.java
index 95953ec..34de4f5 100644
--- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/access/AbstractAccessTokenRepositoryTest.java
+++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/access/AbstractAccessTokenRepositoryTest.java
@@ -22,6 +22,8 @@ package org.apache.james.jmap.api.access;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
+import java.util.concurrent.CompletionException;
+
 import org.apache.james.jmap.api.access.exceptions.InvalidAccessToken;
 import org.junit.Before;
 import org.junit.Test;
@@ -30,7 +32,7 @@ public abstract class AbstractAccessTokenRepositoryTest {
 
     private static final AccessToken TOKEN = AccessToken.generate();
     private static final String USERNAME = "username";
-    public static final long TTL_IN_MS = 1000;
+    protected static final long TTL_IN_MS = 1000;
 
     private AccessTokenRepository accessTokenRepository;
 
@@ -43,27 +45,30 @@ public abstract class AbstractAccessTokenRepositoryTest {
 
     @Test
     public void validTokenMustBeRetrieved() throws Throwable {
-        accessTokenRepository.addToken(USERNAME, TOKEN);
-        assertThat(accessTokenRepository.getUsernameFromToken(TOKEN).join().get()).isEqualTo(USERNAME);
+        accessTokenRepository.addToken(USERNAME, TOKEN).join();
+        assertThat(accessTokenRepository.getUsernameFromToken(TOKEN).join()).isEqualTo(USERNAME);
     }
 
     @Test
     public void absentTokensMustBeInvalid() throws Exception {
-        assertThatThrownBy(() -> accessTokenRepository.getUsernameFromToken(TOKEN).join().get()).isInstanceOf(InvalidAccessToken.class);
+        assertThatThrownBy(() -> accessTokenRepository.getUsernameFromToken(TOKEN).join()).isInstanceOf(CompletionException.class);
+        assertThatThrownBy(() -> accessTokenRepository.getUsernameFromToken(TOKEN).join()).hasCauseInstanceOf(InvalidAccessToken.class);
     }
 
     @Test
     public void removedTokensMustBeInvalid() throws Exception {
-        accessTokenRepository.addToken(USERNAME, TOKEN);
-        accessTokenRepository.removeToken(TOKEN);
-        assertThatThrownBy(() -> accessTokenRepository.getUsernameFromToken(TOKEN).join().get()).isInstanceOf(InvalidAccessToken.class);
+        accessTokenRepository.addToken(USERNAME, TOKEN).join();
+        accessTokenRepository.removeToken(TOKEN).join();
+        assertThatThrownBy(() -> accessTokenRepository.getUsernameFromToken(TOKEN).join()).isInstanceOf(CompletionException.class);
+        assertThatThrownBy(() -> accessTokenRepository.getUsernameFromToken(TOKEN).join()).hasCauseInstanceOf(InvalidAccessToken.class);
     }
 
     @Test
     public void outDatedTokenMustBeInvalid() throws Exception {
-        accessTokenRepository.addToken(USERNAME, TOKEN);
+        accessTokenRepository.addToken(USERNAME, TOKEN).join();
         Thread.sleep(2 * TTL_IN_MS);
-        assertThatThrownBy(() -> accessTokenRepository.getUsernameFromToken(TOKEN).join().get()).isInstanceOf(InvalidAccessToken.class);
+        assertThatThrownBy(() -> accessTokenRepository.getUsernameFromToken(TOKEN).join()).isInstanceOf(CompletionException.class);
+        assertThatThrownBy(() -> accessTokenRepository.getUsernameFromToken(TOKEN).join()).hasCauseInstanceOf(InvalidAccessToken.class);
     }
 
     @Test(expected = NullPointerException.class)

http://git-wip-us.apache.org/repos/asf/james-project/blob/e71a7cd5/server/protocols/jmap/src/main/java/org/apache/james/jmap/crypto/AccessTokenManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/crypto/AccessTokenManagerImpl.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/crypto/AccessTokenManagerImpl.java
index 0131071..e5a5cbc 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/crypto/AccessTokenManagerImpl.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/crypto/AccessTokenManagerImpl.java
@@ -19,6 +19,9 @@
 
 package org.apache.james.jmap.crypto;
 
+import java.util.concurrent.CompletionException;
+import java.util.concurrent.ExecutionException;
+
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
@@ -51,11 +54,13 @@ public class AccessTokenManagerImpl implements AccessTokenManager {
     @Override
     public String getUsernameFromToken(AccessToken token) throws InvalidAccessToken {
         try {
-            return accessTokenRepository.getUsernameFromToken(token).join().get();
-        } catch (InvalidAccessToken invalidAccessToken) {
-            throw invalidAccessToken;
-        } catch (Throwable throwable) {
-            throw Throwables.propagate(throwable);
+            return accessTokenRepository.getUsernameFromToken(token).join();
+        } catch (CompletionException completionException) {
+            if (completionException.getCause() instanceof InvalidAccessToken) {
+                throw (InvalidAccessToken) completionException.getCause();
+            } else {
+                throw Throwables.propagate(completionException);
+            }
         }
     }
     

http://git-wip-us.apache.org/repos/asf/james-project/blob/e71a7cd5/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/AccessTokenManagerImplTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/AccessTokenManagerImplTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/AccessTokenManagerImplTest.java
index fb3716a..acb539b 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/AccessTokenManagerImplTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/AccessTokenManagerImplTest.java
@@ -52,7 +52,7 @@ public class AccessTokenManagerImplTest {
     @Test
     public void grantShouldStoreATokenOnUsername() throws Exception {
         AccessToken token = accessTokenManager.grantAccessToken("username");
-        assertThat(accessTokenRepository.getUsernameFromToken(token).join().get()).isEqualTo("username");
+        assertThat(accessTokenRepository.getUsernameFromToken(token).join()).isEqualTo("username");
     }
     
     @Test(expected=NullPointerException.class)


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org