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 ad...@apache.org on 2017/09/20 20:32:00 UTC
[5/5] james-project git commit: JAMES-2145 String typing for Username
JAMES-2145 String typing for Username
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/0e5872cd
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/0e5872cd
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/0e5872cd
Branch: refs/heads/master
Commit: 0e5872cdff268f7e0271930c2ba79910f4683cf6
Parents: 8000999
Author: benwa <bt...@linagora.com>
Authored: Wed Sep 20 16:41:46 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Sep 20 16:25:36 2017 +0200
----------------------------------------------------------------------
.../mail/CassandraAttachmentMapper.java | 5 +-
.../mail/CassandraAttachmentOwnerDAO.java | 13 ++--
.../mail/CassandraAttachmentOwnerDAOTest.java | 5 +-
.../inmemory/mail/InMemoryAttachmentMapper.java | 7 +-
.../mailbox/store/StoreAttachmentManager.java | 7 +-
.../mailbox/store/mail/AttachmentMapper.java | 5 +-
.../mailbox/store/mail/model/Username.java | 74 ++++++++++++++++++++
.../store/mail/model/AttachmentMapperTest.java | 16 ++---
.../mailbox/store/mail/model/UsernameTest.java | 72 +++++++++++++++++++
9 files changed, 179 insertions(+), 25 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/0e5872cd/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java
index a0d2749..1eccb88 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java
@@ -35,6 +35,7 @@ import org.apache.james.mailbox.model.Attachment;
import org.apache.james.mailbox.model.AttachmentId;
import org.apache.james.mailbox.model.MessageId;
import org.apache.james.mailbox.store.mail.AttachmentMapper;
+import org.apache.james.mailbox.store.mail.model.Username;
import org.apache.james.util.FluentFutureStream;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
@@ -122,7 +123,7 @@ public class CassandraAttachmentMapper implements AttachmentMapper {
}
@Override
- public void storeAttachmentForOwner(Attachment attachment, String owner) throws MailboxException {
+ public void storeAttachmentForOwner(Attachment attachment, Username owner) throws MailboxException {
ownerDAO.addOwner(attachment.getAttachmentId(), owner)
.thenCompose(any -> blobsDAO.save(attachment.getBytes()))
.thenApply(blobId -> CassandraAttachmentDAOV2.from(attachment, blobId))
@@ -145,7 +146,7 @@ public class CassandraAttachmentMapper implements AttachmentMapper {
}
@Override
- public Collection<String> getOwners(AttachmentId attachmentId) throws MailboxException {
+ public Collection<Username> getOwners(AttachmentId attachmentId) throws MailboxException {
return ownerDAO.retrieveOwners(attachmentId).join();
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/0e5872cd/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAO.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAO.java
index fe2d361..1be5175 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAO.java
@@ -37,6 +37,7 @@ import javax.inject.Inject;
import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
import org.apache.james.backends.cassandra.utils.CassandraUtils;
import org.apache.james.mailbox.model.AttachmentId;
+import org.apache.james.mailbox.store.mail.model.Username;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.Row;
@@ -74,14 +75,14 @@ public class CassandraAttachmentOwnerDAO {
.where(eq(ID, bindMarker(ID))));
}
- public CompletableFuture<Void> addOwner(AttachmentId attachmentId, String owner) {
+ public CompletableFuture<Void> addOwner(AttachmentId attachmentId, Username owner) {
return executor.executeVoid(
addStatement.bind()
.setUUID(ID, attachmentId.asUUID())
- .setString(OWNER, owner));
+ .setString(OWNER, owner.getValue()));
}
- public CompletableFuture<Collection<String>> retrieveOwners(AttachmentId attachmentId) {
+ public CompletableFuture<Collection<Username>> retrieveOwners(AttachmentId attachmentId) {
return executor.execute(
selectStatement.bind()
.setUUID(ID, attachmentId.asUUID()))
@@ -89,7 +90,9 @@ public class CassandraAttachmentOwnerDAO {
.thenApply(this::toOwners);
}
- private ImmutableList<String> toOwners(Stream<Row> stream) {
- return stream.map(row -> row.getString(OWNER)).collect(Guavate.toImmutableList());
+ private ImmutableList<Username> toOwners(Stream<Row> stream) {
+ return stream.map(row -> row.getString(OWNER))
+ .map(Username::fromRawValue)
+ .collect(Guavate.toImmutableList());
}
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/0e5872cd/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAOTest.java
index 8082f5b..9f75612 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAOTest.java
@@ -26,14 +26,15 @@ import org.apache.james.backends.cassandra.DockerCassandraRule;
import org.apache.james.backends.cassandra.utils.CassandraUtils;
import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
import org.apache.james.mailbox.model.AttachmentId;
+import org.apache.james.mailbox.store.mail.model.Username;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Test;
public class CassandraAttachmentOwnerDAOTest {
public static final AttachmentId ATTACHMENT_ID = AttachmentId.from("id1");
- public static final String OWNER_1 = "owner1";
- public static final String OWNER_2 = "owner2";
+ public static final Username OWNER_1 = Username.fromRawValue("owner1");
+ public static final Username OWNER_2 = Username.fromRawValue("owner2");
@ClassRule
public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
http://git-wip-us.apache.org/repos/asf/james-project/blob/0e5872cd/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAttachmentMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAttachmentMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAttachmentMapper.java
index 4ba0691..e97e65f 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAttachmentMapper.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAttachmentMapper.java
@@ -29,6 +29,7 @@ import org.apache.james.mailbox.model.Attachment;
import org.apache.james.mailbox.model.AttachmentId;
import org.apache.james.mailbox.model.MessageId;
import org.apache.james.mailbox.store.mail.AttachmentMapper;
+import org.apache.james.mailbox.store.mail.model.Username;
import com.google.common.base.Preconditions;
import com.google.common.collect.HashMultimap;
@@ -42,7 +43,7 @@ public class InMemoryAttachmentMapper implements AttachmentMapper {
private static final int INITIAL_SIZE = 128;
private final Map<AttachmentId, Attachment> attachmentsById;
private final Multimap<AttachmentId, MessageId> messageIdsByAttachmentId;
- private final Multimap<AttachmentId, String> ownersByAttachmentId;
+ private final Multimap<AttachmentId, Username> ownersByAttachmentId;
public InMemoryAttachmentMapper() {
attachmentsById = new ConcurrentHashMap<>(INITIAL_SIZE);
@@ -72,7 +73,7 @@ public class InMemoryAttachmentMapper implements AttachmentMapper {
}
@Override
- public void storeAttachmentForOwner(Attachment attachment, String owner) throws MailboxException {
+ public void storeAttachmentForOwner(Attachment attachment, Username owner) throws MailboxException {
attachmentsById.put(attachment.getAttachmentId(), attachment);
ownersByAttachmentId.put(attachment.getAttachmentId(), owner);
}
@@ -101,7 +102,7 @@ public class InMemoryAttachmentMapper implements AttachmentMapper {
}
@Override
- public Collection<String> getOwners(final AttachmentId attachmentId) throws MailboxException {
+ public Collection<Username> getOwners(final AttachmentId attachmentId) throws MailboxException {
return ownersByAttachmentId.get(attachmentId);
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/james-project/blob/0e5872cd/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentManager.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentManager.java
index 7b6ce8a..6708d67 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentManager.java
@@ -33,6 +33,7 @@ import org.apache.james.mailbox.model.Attachment;
import org.apache.james.mailbox.model.AttachmentId;
import org.apache.james.mailbox.model.MessageId;
import org.apache.james.mailbox.store.mail.AttachmentMapperFactory;
+import org.apache.james.mailbox.store.mail.model.Username;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -71,7 +72,7 @@ public class StoreAttachmentManager implements AttachmentManager {
@Override
public void storeAttachment(Attachment attachment, MailboxSession mailboxSession) throws MailboxException {
attachmentMapperFactory.getAttachmentMapper(mailboxSession)
- .storeAttachmentForOwner(attachment, mailboxSession.getUser().getUserName());
+ .storeAttachmentForOwner(attachment, Username.fromMailboxSession(mailboxSession));
}
@Override
@@ -97,10 +98,10 @@ public class StoreAttachmentManager implements AttachmentManager {
}
private boolean isExplicitlyAOwner(AttachmentId attachmentId, MailboxSession mailboxSession) throws MailboxException {
- Collection<String> explicitOwners = attachmentMapperFactory.getAttachmentMapper(mailboxSession)
+ Collection<Username> explicitOwners = attachmentMapperFactory.getAttachmentMapper(mailboxSession)
.getOwners(attachmentId);
return explicitOwners.stream()
- .anyMatch(username -> mailboxSession.getUser().isSameUser(username));
+ .anyMatch(username -> mailboxSession.getUser().isSameUser(username.getValue()));
}
private Collection<MessageId> getRelatedMessageIds(AttachmentId attachmentId, MailboxSession mailboxSession) throws MailboxException {
http://git-wip-us.apache.org/repos/asf/james-project/blob/0e5872cd/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AttachmentMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AttachmentMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AttachmentMapper.java
index 7973a20..09b444d 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AttachmentMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AttachmentMapper.java
@@ -26,6 +26,7 @@ import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.model.Attachment;
import org.apache.james.mailbox.model.AttachmentId;
import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.store.mail.model.Username;
import org.apache.james.mailbox.store.transaction.Mapper;
public interface AttachmentMapper extends Mapper {
@@ -34,11 +35,11 @@ public interface AttachmentMapper extends Mapper {
List<Attachment> getAttachments(Collection<AttachmentId> attachmentIds);
- void storeAttachmentForOwner(Attachment attachment, String owner) throws MailboxException;
+ void storeAttachmentForOwner(Attachment attachment, Username owner) throws MailboxException;
void storeAttachmentsForMessage(Collection<Attachment> attachments, MessageId ownerMessageId) throws MailboxException;
Collection<MessageId> getRelatedMessageIds(AttachmentId attachmentId) throws MailboxException;
- Collection<String> getOwners(AttachmentId attachmentId) throws MailboxException;
+ Collection<Username> getOwners(AttachmentId attachmentId) throws MailboxException;
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/james-project/blob/0e5872cd/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Username.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Username.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Username.java
new file mode 100644
index 0000000..5dacc38
--- /dev/null
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Username.java
@@ -0,0 +1,74 @@
+/****************************************************************
+ * 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.mailbox.store.mail.model;
+
+import java.util.Objects;
+
+import org.apache.james.mailbox.MailboxSession;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Preconditions;
+
+public class Username {
+ public static Username fromMailboxSession(MailboxSession mailboxSession) {
+ Preconditions.checkNotNull(mailboxSession);
+ Preconditions.checkNotNull(mailboxSession.getUser());
+
+ return fromRawValue(mailboxSession.getUser().getUserName());
+ }
+
+ public static Username fromRawValue(String value) {
+ return new Username(value);
+ }
+
+ private final String value;
+
+ private Username(final String value) {
+ Preconditions.checkNotNull(value);
+
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public final boolean equals(final Object o) {
+ if (o instanceof Username) {
+ Username username = (Username) o;
+
+ return Objects.equals(this.value, username.value);
+ }
+ return false;
+ }
+
+ @Override
+ public final int hashCode() {
+ return Objects.hash(value);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("value", value)
+ .toString();
+ }
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/0e5872cd/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
index bc411a9..01514bb 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
@@ -40,8 +40,8 @@ import com.google.common.collect.ImmutableList;
public abstract class AttachmentMapperTest {
private static final AttachmentId UNKNOWN_ATTACHMENT_ID = AttachmentId.forPayloadAndType("unknown".getBytes(Charsets.UTF_8), "type");
- public static final String OWNER = "owner";
- public static final String ADDITIONAL_OWNER = "additionalOwner";
+ public static final Username OWNER = Username.fromRawValue("owner");
+ public static final Username ADDITIONAL_OWNER = Username.fromRawValue("additionalOwner");
private AttachmentMapper attachmentMapper;
@@ -278,8 +278,8 @@ public abstract class AttachmentMapperTest {
attachmentMapper.storeAttachmentForOwner(attachment, OWNER);
//When
- Collection<String> expectedOwners = ImmutableList.of(OWNER);
- Collection<String> actualOwners = attachmentMapper.getOwners(attachmentId);
+ Collection<Username> expectedOwners = ImmutableList.of(OWNER);
+ Collection<Username> actualOwners = attachmentMapper.getOwners(attachmentId);
//Then
assertThat(actualOwners).containsOnlyElementsOf(expectedOwners);
}
@@ -296,7 +296,7 @@ public abstract class AttachmentMapperTest {
attachmentMapper.storeAttachmentsForMessage(ImmutableList.of(attachment), generateMessageId());
//When
- Collection<String> actualOwners = attachmentMapper.getOwners(attachmentId);
+ Collection<Username> actualOwners = attachmentMapper.getOwners(attachmentId);
//Then
assertThat(actualOwners).isEmpty();
}
@@ -314,15 +314,15 @@ public abstract class AttachmentMapperTest {
attachmentMapper.storeAttachmentForOwner(attachment, ADDITIONAL_OWNER);
//When
- Collection<String> expectedOwners = ImmutableList.of(OWNER, ADDITIONAL_OWNER);
- Collection<String> actualOwners = attachmentMapper.getOwners(attachmentId);
+ Collection<Username> expectedOwners = ImmutableList.of(OWNER, ADDITIONAL_OWNER);
+ Collection<Username> actualOwners = attachmentMapper.getOwners(attachmentId);
//Then
assertThat(actualOwners).containsOnlyElementsOf(expectedOwners);
}
@Test
public void getOwnersShouldReturnEmptyWhenUnknownAttachmentId() throws Exception {
- Collection<String> actualOwners = attachmentMapper.getOwners(AttachmentId.from("any"));
+ Collection<Username> actualOwners = attachmentMapper.getOwners(AttachmentId.from("any"));
assertThat(actualOwners).isEmpty();
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/0e5872cd/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/UsernameTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/UsernameTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/UsernameTest.java
new file mode 100644
index 0000000..225449b
--- /dev/null
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/UsernameTest.java
@@ -0,0 +1,72 @@
+/****************************************************************
+ * 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.mailbox.store.mail.model;
+
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.apache.james.mailbox.MailboxSession;
+import org.junit.Test;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+
+public class UsernameTest {
+
+ @Test
+ public void shouldRespectBeanContract() {
+ EqualsVerifier.forClass(Username.class)
+ .allFieldsShouldBeUsed()
+ .verify();
+ }
+
+ @Test
+ public void fromRawValueShouldThrowOnNull() {
+ assertThatThrownBy(() -> Username.fromRawValue(null))
+ .isInstanceOf(NullPointerException.class);
+ }
+
+ @Test
+ public void fromMailboxSessionShouldThrowOnNull() {
+ assertThatThrownBy(() -> Username.fromMailboxSession(null))
+ .isInstanceOf(NullPointerException.class);
+ }
+
+ @Test
+ public void fromMailboxSessionShouldThrowOnNullUser() {
+ MailboxSession mailboxSession = mock(MailboxSession.class);
+ when(mailboxSession.getUser()).thenReturn(null);
+
+ assertThatThrownBy(() -> Username.fromMailboxSession(mailboxSession))
+ .isInstanceOf(NullPointerException.class);
+ }
+
+ @Test
+ public void fromMailboxSessionShouldThrowOnNullUsername() {
+ MailboxSession mailboxSession = mock(MailboxSession.class);
+ MailboxSession.User user = mock(MailboxSession.User.class);
+ when(mailboxSession.getUser()).thenReturn(user);
+ when(user.getUserName()).thenReturn(null);
+
+ assertThatThrownBy(() -> Username.fromMailboxSession(mailboxSession))
+ .isInstanceOf(NullPointerException.class);
+ }
+
+}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org