http://git-wip-us.apache.org/repos/asf/james-project/blob/3d0a5534/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveDAO.java ---------------------------------------------------------------------- diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveDAO.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveDAO.java index 9e3c7aa..429ca4b 100644 --- a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveDAO.java +++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveDAO.java @@ -40,7 +40,9 @@ import java.util.concurrent.CompletableFuture; import javax.inject.Inject; import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor; +import org.apache.james.core.User; import org.apache.james.sieve.cassandra.model.Script; +import org.apache.james.sieverepository.api.ScriptName; import org.apache.james.sieverepository.api.ScriptSummary; import com.datastax.driver.core.PreparedStatement; @@ -96,37 +98,37 @@ public class CassandraSieveDAO { .where(eq(USER_NAME, bindMarker(USER_NAME))); } - public CompletableFuture<Void> insertScript(String user, Script script) { + public CompletableFuture<Void> insertScript(User user, Script script) { return cassandraAsyncExecutor.executeVoid( insertScriptStatement.bind() - .setString(USER_NAME, user) - .setString(SCRIPT_NAME, script.getName()) - .setString(SCRIPT_CONTENT, script.getContent()) + .setString(USER_NAME, user.asString()) + .setString(SCRIPT_NAME, script.getName().getValue()) + .setString(SCRIPT_CONTENT, script.getContent().getValue()) .setBool(IS_ACTIVE, script.isActive()) .setLong(SIZE, script.getSize())); } - public CompletableFuture<List<ScriptSummary>> listScripts(String user) { + public CompletableFuture<List<ScriptSummary>> listScripts(User user) { return cassandraAsyncExecutor.execute( selectScriptsStatement.bind() - .setString(USER_NAME, user)) + .setString(USER_NAME, user.asString())) .thenApply(resultSet -> resultSet.all() .stream() .map(row -> new ScriptSummary( - row.getString(SCRIPT_NAME), + new ScriptName(row.getString(SCRIPT_NAME)), row.getBool(IS_ACTIVE))) .collect(Guavate.toImmutableList())); } - public CompletableFuture<Boolean> updateScriptActivation(String user, String scriptName, boolean active) { + public CompletableFuture<Boolean> updateScriptActivation(User user, ScriptName scriptName, boolean active) { return cassandraAsyncExecutor.executeReturnApplied( updateScriptActivationStatement.bind() - .setString(USER_NAME, user) - .setString(SCRIPT_NAME, scriptName) + .setString(USER_NAME, user.asString()) + .setString(SCRIPT_NAME, scriptName.getValue()) .setBool(IS_ACTIVE, active)); } - public CompletableFuture<Optional<Script>> getScript(String user, String name) { + public CompletableFuture<Optional<Script>> getScript(User user, ScriptName name) { return getScriptRow(user, name).thenApply(opt -> opt.map(row -> Script.builder() .content(row.getString(SCRIPT_CONTENT)) .isActive(row.getBool(IS_ACTIVE)) @@ -135,18 +137,18 @@ public class CassandraSieveDAO { .build())); } - public CompletableFuture<Boolean> deleteScriptInCassandra(String user, String name) { + public CompletableFuture<Boolean> deleteScriptInCassandra(User user, ScriptName name) { return cassandraAsyncExecutor.executeReturnApplied( deleteScriptStatement.bind() - .setString(USER_NAME, user) - .setString(SCRIPT_NAME, name)); + .setString(USER_NAME, user.asString()) + .setString(SCRIPT_NAME, name.getValue())); } - private CompletableFuture<Optional<Row>> getScriptRow(String user, String name) { + private CompletableFuture<Optional<Row>> getScriptRow(User user, ScriptName name) { return cassandraAsyncExecutor.executeSingleRow( selectScriptStatement.bind() - .setString(USER_NAME, user) - .setString(SCRIPT_NAME, name)); + .setString(USER_NAME, user.asString()) + .setString(SCRIPT_NAME, name.getValue())); } }
http://git-wip-us.apache.org/repos/asf/james-project/blob/3d0a5534/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAO.java ---------------------------------------------------------------------- diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAO.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAO.java index eaeb39e..b20ea30 100644 --- a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAO.java +++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAO.java @@ -33,6 +33,8 @@ import java.util.concurrent.CompletableFuture; import javax.inject.Inject; import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor; +import org.apache.james.core.User; +import org.apache.james.core.quota.QuotaSize; import org.apache.james.sieve.cassandra.tables.CassandraSieveClusterQuotaTable; import org.apache.james.sieve.cassandra.tables.CassandraSieveQuotaTable; import org.apache.james.sieve.cassandra.tables.CassandraSieveSpaceTable; @@ -97,32 +99,33 @@ public class CassandraSieveQuotaDAO { .where(eq(CassandraSieveQuotaTable.USER_NAME, bindMarker(CassandraSieveQuotaTable.USER_NAME)))); } - public CompletableFuture<Long> spaceUsedBy(String user) { + public CompletableFuture<Long> spaceUsedBy(User user) { return cassandraAsyncExecutor.executeSingleRow( selectSpaceUsedByUserStatement.bind() - .setString(CassandraSieveSpaceTable.USER_NAME, user)) + .setString(CassandraSieveSpaceTable.USER_NAME, user.asString())) .thenApply(optional -> optional.map(row -> row.getLong(CassandraSieveSpaceTable.SPACE_USED)) .orElse(0L)); } - public CompletableFuture<Void> updateSpaceUsed(String user, long spaceUsed) { + public CompletableFuture<Void> updateSpaceUsed(User user, long spaceUsed) { return cassandraAsyncExecutor.executeVoid( updateSpaceUsedStatement.bind() .setLong(CassandraSieveSpaceTable.SPACE_USED, spaceUsed) - .setString(CassandraSieveSpaceTable.USER_NAME, user)); + .setString(CassandraSieveSpaceTable.USER_NAME, user.asString())); } - public CompletableFuture<Optional<Long>> getQuota() { + public CompletableFuture<Optional<QuotaSize>> getQuota() { return cassandraAsyncExecutor.executeSingleRow( selectClusterQuotaStatement.bind() .setString(CassandraSieveClusterQuotaTable.NAME, CassandraSieveClusterQuotaTable.DEFAULT_NAME)) - .thenApply(optional -> optional.map(row -> row.getLong(CassandraSieveClusterQuotaTable.VALUE))); + .thenApply(optional -> optional.map(row -> + QuotaSize.size(row.getLong(CassandraSieveClusterQuotaTable.VALUE)))); } - public CompletableFuture<Void> setQuota(long quota) { + public CompletableFuture<Void> setQuota(QuotaSize quota) { return cassandraAsyncExecutor.executeVoid( updateClusterQuotaStatement.bind() - .setLong(CassandraSieveClusterQuotaTable.VALUE, quota) + .setLong(CassandraSieveClusterQuotaTable.VALUE, quota.asLong()) .setString(CassandraSieveClusterQuotaTable.NAME, CassandraSieveClusterQuotaTable.DEFAULT_NAME)); } @@ -132,24 +135,25 @@ public class CassandraSieveQuotaDAO { .setString(CassandraSieveClusterQuotaTable.NAME, CassandraSieveClusterQuotaTable.DEFAULT_NAME)); } - public CompletableFuture<Optional<Long>> getQuota(String user) { + public CompletableFuture<Optional<QuotaSize>> getQuota(User user) { return cassandraAsyncExecutor.executeSingleRow( selectUserQuotaStatement.bind() - .setString(CassandraSieveQuotaTable.USER_NAME, user)) - .thenApply(optional -> optional.map(row -> row.getLong(CassandraSieveQuotaTable.QUOTA))); + .setString(CassandraSieveQuotaTable.USER_NAME, user.asString())) + .thenApply(optional -> optional.map(row -> + QuotaSize.size(row.getLong(CassandraSieveQuotaTable.QUOTA)))); } - public CompletableFuture<Void> setQuota(String user, long quota) { + public CompletableFuture<Void> setQuota(User user, QuotaSize quota) { return cassandraAsyncExecutor.executeVoid( updateUserQuotaStatement.bind() - .setLong(CassandraSieveQuotaTable.QUOTA, quota) - .setString(CassandraSieveQuotaTable.USER_NAME, user)); + .setLong(CassandraSieveQuotaTable.QUOTA, quota.asLong()) + .setString(CassandraSieveQuotaTable.USER_NAME, user.asString())); } - public CompletableFuture<Void> removeQuota(String user) { + public CompletableFuture<Void> removeQuota(User user) { return cassandraAsyncExecutor.executeVoid( deleteUserQuotaStatement.bind() - .setString(CassandraSieveQuotaTable.USER_NAME, user)); + .setString(CassandraSieveQuotaTable.USER_NAME, user.asString())); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/3d0a5534/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepository.java ---------------------------------------------------------------------- diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepository.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepository.java index d6e656e..73e4626 100644 --- a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepository.java +++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepository.java @@ -28,9 +28,13 @@ import java.util.concurrent.CompletableFuture; import javax.inject.Inject; import org.apache.commons.io.IOUtils; +import org.apache.james.core.User; +import org.apache.james.core.quota.QuotaSize; import org.apache.james.sieve.cassandra.model.ActiveScriptInfo; import org.apache.james.sieve.cassandra.model.Script; import org.apache.james.sieve.cassandra.model.SieveQuota; +import org.apache.james.sieverepository.api.ScriptContent; +import org.apache.james.sieverepository.api.ScriptName; import org.apache.james.sieverepository.api.ScriptSummary; import org.apache.james.sieverepository.api.SieveRepository; import org.apache.james.sieverepository.api.exception.DuplicateException; @@ -56,32 +60,33 @@ public class CassandraSieveRepository implements SieveRepository { } @Override - public DateTime getActivationDateForActiveScript(String user) throws StorageException, ScriptNotFoundException { + public DateTime getActivationDateForActiveScript(User user) throws StorageException, ScriptNotFoundException { return cassandraActiveScriptDAO.getActiveSctiptInfo(user).join() .orElseThrow(ScriptNotFoundException::new) .getActivationDate(); } @Override - public void haveSpace(String user, String name, long newSize) throws QuotaExceededException, StorageException { + public void haveSpace(User user, ScriptName name, long newSize) throws QuotaExceededException, StorageException { throwOnOverQuota(user, spaceThatWillBeUsedByNewScript(user, name, newSize)); } - private void throwOnOverQuota(String user, CompletableFuture<Long> sizeDifference) throws QuotaExceededException, StorageException { - CompletableFuture<Optional<Long>> userQuotaFuture = cassandraSieveQuotaDAO.getQuota(user); - CompletableFuture<Optional<Long>> globalQuotaFuture = cassandraSieveQuotaDAO.getQuota(); + private void throwOnOverQuota(User user, CompletableFuture<Long> sizeDifference) throws QuotaExceededException, StorageException { + CompletableFuture<Optional<QuotaSize>> userQuotaFuture = cassandraSieveQuotaDAO.getQuota(user); + CompletableFuture<Optional<QuotaSize>> globalQuotaFuture = cassandraSieveQuotaDAO.getQuota(); CompletableFuture<Long> spaceUsedFuture = cassandraSieveQuotaDAO.spaceUsedBy(user); - new SieveQuota(spaceUsedFuture.join(), limitToUse(userQuotaFuture, globalQuotaFuture)).checkOverQuotaUponModification(sizeDifference.join()); + new SieveQuota(spaceUsedFuture.join(), limitToUse(userQuotaFuture, globalQuotaFuture)) + .checkOverQuotaUponModification(sizeDifference.join()); } - public CompletableFuture<Long> spaceThatWillBeUsedByNewScript(String user, String name, long scriptSize) { + public CompletableFuture<Long> spaceThatWillBeUsedByNewScript(User user, ScriptName name, long scriptSize) { return cassandraSieveDAO.getScript(user, name) .thenApply(optional -> optional.map(Script::getSize).orElse(0L)) .thenApply(sizeOfStoredScript -> scriptSize - sizeOfStoredScript); } - private Optional<Long> limitToUse(CompletableFuture<Optional<Long>> userQuota, CompletableFuture<Optional<Long>> globalQuota) { + private Optional<QuotaSize> limitToUse(CompletableFuture<Optional<QuotaSize>> userQuota, CompletableFuture<Optional<QuotaSize>> globalQuota) { if (userQuota.join().isPresent()) { return userQuota.join(); } @@ -89,7 +94,7 @@ public class CassandraSieveRepository implements SieveRepository { } @Override - public void putScript(String user, String name, String content) throws QuotaExceededException, StorageException { + public void putScript(User user, ScriptName name, ScriptContent content) throws QuotaExceededException, StorageException { CompletableFuture<Long> spaceUsed = spaceThatWillBeUsedByNewScript(user, name, content.length()); throwOnOverQuota(user, spaceUsed); @@ -104,7 +109,7 @@ public class CassandraSieveRepository implements SieveRepository { .join(); } - public CompletableFuture<Void> updateSpaceUsed(String user, long spaceUsed) { + public CompletableFuture<Void> updateSpaceUsed(User user, long spaceUsed) { if (spaceUsed == 0) { return CompletableFuture.completedFuture(null); } @@ -112,12 +117,12 @@ public class CassandraSieveRepository implements SieveRepository { } @Override - public List<ScriptSummary> listScripts(String user) { + public List<ScriptSummary> listScripts(User user) { return cassandraSieveDAO.listScripts(user).join(); } @Override - public InputStream getActive(String user) throws ScriptNotFoundException { + public InputStream getActive(User user) throws ScriptNotFoundException { return IOUtils.toInputStream( cassandraActiveScriptDAO.getActiveSctiptInfo(user) .thenCompose(optionalActiveName -> optionalActiveName @@ -125,11 +130,12 @@ public class CassandraSieveRepository implements SieveRepository { .orElse(CompletableFuture.completedFuture(Optional.empty()))) .join() .orElseThrow(ScriptNotFoundException::new) - .getContent(), StandardCharsets.UTF_8); + .getContent() + .getValue(), StandardCharsets.UTF_8); } @Override - public void setActive(String user, String name) throws ScriptNotFoundException { + public void setActive(User user, ScriptName name) throws ScriptNotFoundException { CompletableFuture<Boolean> activateNewScript = unactivateOldScript(user) .thenCompose(any -> updateScriptActivation(user, name, true) @@ -141,7 +147,7 @@ public class CassandraSieveRepository implements SieveRepository { } } - private CompletableFuture<Void> unactivateOldScript(String user) { + private CompletableFuture<Void> unactivateOldScript(User user) { return cassandraActiveScriptDAO.getActiveSctiptInfo(user) .thenCompose(scriptNameOptional -> scriptNameOptional .map(activeScriptInfo -> updateScriptActivation(user, activeScriptInfo.getName(), false) @@ -149,7 +155,7 @@ public class CassandraSieveRepository implements SieveRepository { .orElse(CompletableFuture.completedFuture(null))); } - private CompletableFuture<Boolean> updateScriptActivation(String user, String scriptName, boolean active) { + private CompletableFuture<Boolean> updateScriptActivation(User user, ScriptName scriptName, boolean active) { if (!scriptName.equals(SieveRepository.NO_SCRIPT_NAME)) { return cassandraSieveDAO.updateScriptActivation(user, scriptName, active); } @@ -157,30 +163,30 @@ public class CassandraSieveRepository implements SieveRepository { } @Override - public InputStream getScript(String user, String name) throws ScriptNotFoundException { + public InputStream getScript(User user, ScriptName name) throws ScriptNotFoundException { return cassandraSieveDAO.getScript(user, name) .join() - .map(script -> IOUtils.toInputStream(script.getContent(), StandardCharsets.UTF_8)) + .map(script -> IOUtils.toInputStream(script.getContent().getValue(), StandardCharsets.UTF_8)) .orElseThrow(ScriptNotFoundException::new); } @Override - public void deleteScript(String user, String name) throws ScriptNotFoundException, IsActiveException { + public void deleteScript(User user, ScriptName name) throws ScriptNotFoundException, IsActiveException { ensureIsNotActive(user, name); if (!cassandraSieveDAO.deleteScriptInCassandra(user, name).join()) { throw new ScriptNotFoundException(); } } - private void ensureIsNotActive(String user, String name) throws IsActiveException { - Optional<String> activeName = cassandraActiveScriptDAO.getActiveSctiptInfo(user).join().map(ActiveScriptInfo::getName); + private void ensureIsNotActive(User user, ScriptName name) throws IsActiveException { + Optional<ScriptName> activeName = cassandraActiveScriptDAO.getActiveSctiptInfo(user).join().map(ActiveScriptInfo::getName); if (activeName.isPresent() && name.equals(activeName.get())) { throw new IsActiveException(); } } @Override - public void renameScript(String user, String oldName, String newName) throws ScriptNotFoundException, DuplicateException { + public void renameScript(User user, ScriptName oldName, ScriptName newName) throws ScriptNotFoundException, DuplicateException { CompletableFuture<Boolean> scriptExistsFuture = cassandraSieveDAO.getScript(user, newName) .thenApply(Optional::isPresent); CompletableFuture<Optional<Script>> oldScriptFuture = cassandraSieveDAO.getScript(user, oldName); @@ -195,7 +201,7 @@ public class CassandraSieveRepository implements SieveRepository { oldScriptFuture.join().orElseThrow(ScriptNotFoundException::new)); } - private void performScriptRename(String user, String newName, Script oldScript) { + private void performScriptRename(User user, ScriptName newName, Script oldScript) { CompletableFuture.allOf( cassandraSieveDAO.insertScript(user, Script.builder() @@ -207,7 +213,7 @@ public class CassandraSieveRepository implements SieveRepository { .join(); } - private CompletableFuture<Void> performActiveScriptRename(String user, String oldName, String newName) { + private CompletableFuture<Void> performActiveScriptRename(User user, ScriptName oldName, ScriptName newName) { return cassandraActiveScriptDAO.getActiveSctiptInfo(user) .thenCompose(optionalActivationInfo -> optionalActivationInfo .filter(activeScriptInfo -> activeScriptInfo.getName().equals(oldName)) @@ -223,14 +229,14 @@ public class CassandraSieveRepository implements SieveRepository { } @Override - public long getQuota() throws QuotaNotFoundException { + public QuotaSize getQuota() throws QuotaNotFoundException { return cassandraSieveQuotaDAO.getQuota() .join() .orElseThrow(QuotaNotFoundException::new); } @Override - public void setQuota(long quota) { + public void setQuota(QuotaSize quota) { cassandraSieveQuotaDAO.setQuota(quota).join(); } @@ -240,7 +246,7 @@ public class CassandraSieveRepository implements SieveRepository { } @Override - public boolean hasQuota(String user) { + public boolean hasQuota(User user) { return CompletableFutureUtil.combine( cassandraSieveQuotaDAO.getQuota(user).thenApply(Optional::isPresent), cassandraSieveQuotaDAO.getQuota().thenApply(Optional::isPresent), @@ -249,19 +255,19 @@ public class CassandraSieveRepository implements SieveRepository { } @Override - public long getQuota(String user) throws QuotaNotFoundException { + public QuotaSize getQuota(User user) throws QuotaNotFoundException { return cassandraSieveQuotaDAO.getQuota(user) .join() .orElseThrow(QuotaNotFoundException::new); } @Override - public void setQuota(String user, long quota) { + public void setQuota(User user, QuotaSize quota) { cassandraSieveQuotaDAO.setQuota(user, quota).join(); } @Override - public void removeQuota(String user) throws QuotaNotFoundException { + public void removeQuota(User user) throws QuotaNotFoundException { cassandraSieveQuotaDAO.removeQuota(user).join(); } http://git-wip-us.apache.org/repos/asf/james-project/blob/3d0a5534/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/ActiveScriptInfo.java ---------------------------------------------------------------------- diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/ActiveScriptInfo.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/ActiveScriptInfo.java index b3377be..051d7a4 100644 --- a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/ActiveScriptInfo.java +++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/ActiveScriptInfo.java @@ -21,19 +21,20 @@ package org.apache.james.sieve.cassandra.model; import java.util.Date; +import org.apache.james.sieverepository.api.ScriptName; import org.joda.time.DateTime; public class ActiveScriptInfo { - private final String name; + private final ScriptName name; private final DateTime activationDate; - public ActiveScriptInfo(String content, Date date) { - this.name = content; + public ActiveScriptInfo(ScriptName name, Date date) { + this.name = name; this.activationDate = new DateTime(date); } - public String getName() { + public ScriptName getName() { return name; } http://git-wip-us.apache.org/repos/asf/james-project/blob/3d0a5534/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/Script.java ---------------------------------------------------------------------- diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/Script.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/Script.java index 8424a41..de68ade 100644 --- a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/Script.java +++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/Script.java @@ -6,6 +6,8 @@ import java.nio.charset.StandardCharsets; import java.util.Objects; import java.util.Optional; +import org.apache.james.sieverepository.api.ScriptContent; +import org.apache.james.sieverepository.api.ScriptName; import org.apache.james.sieverepository.api.ScriptSummary; import com.google.common.base.Preconditions; @@ -17,16 +19,20 @@ public class Script { } public static class Builder { - private String name; - private String content; + private ScriptName name; + private ScriptContent content; private Optional<Boolean> isActive = Optional.empty(); private Optional<Long> size = Optional.empty(); - public Builder name(String name) { + public Builder name(ScriptName name) { this.name = name; return this; } + public Builder name(String name) { + return this.name(new ScriptName(name)); + } + public Builder copyOf(Script script) { this.name = script.getName(); this.content = script.getContent(); @@ -35,11 +41,15 @@ public class Script { return this; } - public Builder content(String content) { + public Builder content(ScriptContent content) { this.content = content; return this; } + public Builder content(String content) { + return this.content(new ScriptContent(content)); + } + public Builder size(long size) { this.size = Optional.of(size); return this; @@ -58,28 +68,28 @@ public class Script { return new Script(name, content, isActive.get(), - size.orElse((long) content.getBytes(StandardCharsets.UTF_8).length)); + size.orElse((long) content.getValue().getBytes(StandardCharsets.UTF_8).length)); } } - private final String name; - private final String content; + private final ScriptName name; + private final ScriptContent content; private final boolean isActive; private final long size; - private Script(String name, String content, boolean isActive, long size) { + private Script(ScriptName name, ScriptContent content, boolean isActive, long size) { this.name = name; this.content = content; this.isActive = isActive; this.size = size; } - public String getName() { + public ScriptName getName() { return name; } - public String getContent() { + public ScriptContent getContent() { return content; } http://git-wip-us.apache.org/repos/asf/james-project/blob/3d0a5534/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/SieveQuota.java ---------------------------------------------------------------------- diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/SieveQuota.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/SieveQuota.java index c1a44d6..b8a0154 100644 --- a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/SieveQuota.java +++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/SieveQuota.java @@ -22,6 +22,7 @@ package org.apache.james.sieve.cassandra.model; import java.util.Optional; +import org.apache.james.core.quota.QuotaSize; import org.apache.james.sieverepository.api.exception.QuotaExceededException; import com.google.common.base.Preconditions; @@ -29,11 +30,11 @@ import com.google.common.base.Preconditions; public class SieveQuota { private final long currentUsage; - private final Optional<Long> limit; + private final Optional<QuotaSize> limit; - public SieveQuota(long currentUsage, Optional<Long> limit) { + public SieveQuota(long currentUsage, Optional<QuotaSize> limit) { Preconditions.checkArgument(currentUsage >= 0, "Current usage should be positive or equal to zero"); - limit.ifPresent(limitValue -> Preconditions.checkArgument(limitValue >= 0, "Limit value should be positive or equal to zero")); + limit.ifPresent(limitValue -> Preconditions.checkArgument(limitValue.asLong() >= 0, "Limit value should be positive or equal to zero")); this.currentUsage = currentUsage; this.limit = limit; } @@ -45,7 +46,7 @@ public class SieveQuota { } public boolean isExceededUponModification(long sizeDifference) { - return limit.map(limitContent -> currentUsage + sizeDifference > limitContent) + return limit.map(limitContent -> !limitContent.isGreaterThan(QuotaSize.size(currentUsage + sizeDifference))) .orElse(false); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/3d0a5534/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAOTest.java ---------------------------------------------------------------------- diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAOTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAOTest.java index 93ac85b..8c7b6ae 100644 --- a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAOTest.java +++ b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAOTest.java @@ -25,7 +25,9 @@ import java.util.Optional; import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.backends.cassandra.DockerCassandraRule; +import org.apache.james.core.User; import org.apache.james.sieve.cassandra.model.ActiveScriptInfo; +import org.apache.james.sieverepository.api.ScriptName; import org.junit.After; import org.junit.Before; import org.junit.ClassRule; @@ -33,9 +35,9 @@ import org.junit.Test; public class CassandraActiveScriptDAOTest { - public static final String USER = "user"; - public static final String SCRIPT_NAME = "sciptName"; - public static final String NEW_SCRIPT_NAME = "newScriptName"; + public static final User USER = User.fromUsername("user"); + public static final ScriptName SCRIPT_NAME = new ScriptName("sciptName"); + public static final ScriptName NEW_SCRIPT_NAME = new ScriptName("newScriptName"); @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule(); http://git-wip-us.apache.org/repos/asf/james-project/blob/3d0a5534/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveDAOTest.java ---------------------------------------------------------------------- diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveDAOTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveDAOTest.java index 95750b9..0c29873 100644 --- a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveDAOTest.java +++ b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveDAOTest.java @@ -26,7 +26,9 @@ import java.util.Optional; import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.backends.cassandra.DockerCassandraRule; +import org.apache.james.core.User; import org.apache.james.sieve.cassandra.model.Script; +import org.apache.james.sieverepository.api.ScriptName; import org.apache.james.sieverepository.api.ScriptSummary; import org.junit.After; import org.junit.Before; @@ -35,9 +37,9 @@ import org.junit.Test; public class CassandraSieveDAOTest { - public static final String USER = "user"; - public static final String SCRIPT_NAME = "scriptName"; - public static final String SCRIPT_NAME2 = "scriptName2"; + public static final User USER = User.fromUsername("user"); + public static final ScriptName SCRIPT_NAME = new ScriptName("scriptName"); + public static final ScriptName SCRIPT_NAME2 = new ScriptName("scriptName2"); public static final Script SCRIPT = Script.builder() .name(SCRIPT_NAME) .content("content") http://git-wip-us.apache.org/repos/asf/james-project/blob/3d0a5534/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java ---------------------------------------------------------------------- diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java index 49de699..869a257 100644 --- a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java +++ b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java @@ -21,10 +21,10 @@ package org.apache.james.sieve.cassandra; import static org.assertj.core.api.Assertions.assertThat; -import java.util.Optional; - import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.backends.cassandra.DockerCassandraRule; +import org.apache.james.core.User; +import org.apache.james.core.quota.QuotaSize; import org.junit.After; import org.junit.Before; import org.junit.ClassRule; @@ -32,9 +32,9 @@ import org.junit.Test; public class CassandraSieveQuotaDAOTest { - public static final String USER = "user"; + public static final User USER = User.fromUsername("user"); + public static final QuotaSize QUOTA_SIZE = QuotaSize.size(15L); - @ClassRule public static DockerCassandraRule cassandraServer = new DockerCassandraRule(); private CassandraCluster cassandra; @@ -53,70 +53,66 @@ public class CassandraSieveQuotaDAOTest { @Test public void getQuotaShouldReturnEmptyByDefault() { - assertThat(sieveQuotaDAO.getQuota().join().isPresent()) - .isFalse(); + assertThat(sieveQuotaDAO.getQuota().join()) + .isEmpty(); } @Test public void getQuotaUserShouldReturnEmptyByDefault() { - assertThat(sieveQuotaDAO.getQuota(USER).join().isPresent()) - .isFalse(); + assertThat(sieveQuotaDAO.getQuota(USER).join()) + .isEmpty(); } @Test public void getQuotaShouldReturnStoredValue() { - long quota = 15L; - sieveQuotaDAO.setQuota(quota).join(); + sieveQuotaDAO.setQuota(QUOTA_SIZE).join(); - Optional<Long> actual = sieveQuotaDAO.getQuota().join(); - assertThat(actual.isPresent()).isTrue(); - assertThat(actual.get()).isEqualTo(quota); + assertThat(sieveQuotaDAO.getQuota().join()) + .contains(QUOTA_SIZE); } @Test public void getQuotaUserShouldReturnStoredValue() { - long quota = 15L; - sieveQuotaDAO.setQuota(USER, quota).join(); + sieveQuotaDAO.setQuota(USER, QUOTA_SIZE).join(); - Optional<Long> actual = sieveQuotaDAO.getQuota(USER).join(); - assertThat(actual.isPresent()).isTrue(); - assertThat(actual.get()).isEqualTo(quota); + assertThat(sieveQuotaDAO.getQuota(USER).join()) + .contains(QUOTA_SIZE); } @Test public void removeQuotaShouldDeleteQuota() { - sieveQuotaDAO.setQuota(15L).join(); + sieveQuotaDAO.setQuota(QUOTA_SIZE).join(); sieveQuotaDAO.removeQuota().join(); - Optional<Long> actual = sieveQuotaDAO.getQuota().join(); - assertThat(actual.isPresent()).isFalse(); + assertThat(sieveQuotaDAO.getQuota().join()) + .isEmpty(); } @Test public void removeQuotaUserShouldDeleteQuotaUser() { - sieveQuotaDAO.setQuota(USER, 15L).join(); + sieveQuotaDAO.setQuota(USER, QUOTA_SIZE).join(); sieveQuotaDAO.removeQuota(USER).join(); - Optional<Long> actual = sieveQuotaDAO.getQuota(USER).join(); - assertThat(actual.isPresent()).isFalse(); + assertThat(sieveQuotaDAO.getQuota(USER).join()) + .isEmpty(); } @Test public void removeQuotaShouldWorkWhenNoneStore() { sieveQuotaDAO.removeQuota().join(); - Optional<Long> actual = sieveQuotaDAO.getQuota().join(); - assertThat(actual.isPresent()).isFalse(); + assertThat(sieveQuotaDAO.getQuota().join()) + .isEmpty(); } @Test public void removeQuotaUserShouldWorkWhenNoneStore() { sieveQuotaDAO.removeQuota(USER).join(); - Optional<Long> actual = sieveQuotaDAO.getQuota(USER).join(); - assertThat(actual.isPresent()).isFalse(); + assertThat(sieveQuotaDAO.getQuota(USER).join()) + .isEmpty(); } @Test http://git-wip-us.apache.org/repos/asf/james-project/blob/3d0a5534/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/model/ScriptTest.java ---------------------------------------------------------------------- diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/model/ScriptTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/model/ScriptTest.java index 95af5ce..ca757d9 100644 --- a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/model/ScriptTest.java +++ b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/model/ScriptTest.java @@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.nio.charset.StandardCharsets; +import org.apache.james.sieverepository.api.ScriptName; import org.apache.james.sieverepository.api.ScriptSummary; import org.junit.Rule; import org.junit.Test; @@ -159,7 +160,7 @@ public class ScriptTest { .size(48L) .build() .toSummary()) - .isEqualTo(new ScriptSummary(name, isActive)); + .isEqualTo(new ScriptSummary(new ScriptName(name), isActive)); } @Test http://git-wip-us.apache.org/repos/asf/james-project/blob/3d0a5534/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/model/SieveQuotaTest.java ---------------------------------------------------------------------- diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/model/SieveQuotaTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/model/SieveQuotaTest.java index fe93a82..3ec44ce 100644 --- a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/model/SieveQuotaTest.java +++ b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/model/SieveQuotaTest.java @@ -21,16 +21,17 @@ package org.apache.james.sieve.cassandra.model; import java.util.Optional; +import org.apache.james.core.quota.QuotaSize; import org.apache.james.sieverepository.api.exception.QuotaExceededException; import org.junit.Test; public class SieveQuotaTest { public static final long INVALID_VALUE = -1L; - public static final long LIMIT_LOW_VALUE = 10L; + public static final QuotaSize LIMIT_LOW_VALUE = QuotaSize.size(10L); public static final long SIZE_DIFFERENCE = 20L; public static final int CURRENT_USAGE = 0; - public static final long LIMIT_HIGH_VALUE = 100L; + public static final QuotaSize LIMIT_HIGH_VALUE = QuotaSize.size(100L); @Test(expected = IllegalArgumentException.class) public void sieveQuotaShouldThrowOnNegativeCurrentValue() { @@ -39,7 +40,7 @@ public class SieveQuotaTest { @Test(expected = IllegalArgumentException.class) public void sieveQuotaShouldThrowOnNegativeLimitValue() { - new SieveQuota(0, Optional.of(INVALID_VALUE)); + new SieveQuota(0, Optional.of(QuotaSize.size(INVALID_VALUE))); } @Test(expected = QuotaExceededException.class) http://git-wip-us.apache.org/repos/asf/james-project/blob/3d0a5534/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveDefaultRepository.java ---------------------------------------------------------------------- diff --git a/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveDefaultRepository.java b/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveDefaultRepository.java index dd865e2..9dcaea3 100644 --- a/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveDefaultRepository.java +++ b/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveDefaultRepository.java @@ -28,7 +28,11 @@ import java.util.List; import javax.inject.Inject; +import org.apache.james.core.User; +import org.apache.james.core.quota.QuotaSize; import org.apache.james.filesystem.api.FileSystem; +import org.apache.james.sieverepository.api.ScriptContent; +import org.apache.james.sieverepository.api.ScriptName; import org.apache.james.sieverepository.api.ScriptSummary; import org.apache.james.sieverepository.api.SieveRepository; import org.apache.james.sieverepository.api.exception.DuplicateException; @@ -55,22 +59,22 @@ public class SieveDefaultRepository implements SieveRepository { } @Override - public void haveSpace(String user, String name, long size) throws QuotaExceededException, StorageException { + public void haveSpace(User user, ScriptName name, long size) throws QuotaExceededException, StorageException { throw apologizeForQuotas(); } @Override - public void putScript(String user, String name, String content) throws StorageException, QuotaExceededException { + public void putScript(User user, ScriptName name, ScriptContent content) throws StorageException, QuotaExceededException { throw new StorageException("This implementation is deprecated and does not support script put operation. You must directly position your scripts in the .sieve folder. Please consider using a SieveFileRepository."); } @Override - public List<ScriptSummary> listScripts(String user) throws StorageException { + public List<ScriptSummary> listScripts(User user) throws StorageException { throw new StorageException("This implementation is deprecated and does not support listScripts operation. Please consider using a SieveFileRepository."); } @Override - public InputStream getActive(String user) throws ScriptNotFoundException, StorageException { + public InputStream getActive(User user) throws ScriptNotFoundException, StorageException { try { return new FileInputStream(retrieveUserFile(user)); } catch (FileNotFoundException e) { @@ -79,13 +83,13 @@ public class SieveDefaultRepository implements SieveRepository { } @Override - public DateTime getActivationDateForActiveScript(String user) throws StorageException, ScriptNotFoundException { + public DateTime getActivationDateForActiveScript(User user) throws StorageException, ScriptNotFoundException { return new DateTime(retrieveUserFile(user).lastModified()); } - public File retrieveUserFile(String user) throws ScriptNotFoundException { + public File retrieveUserFile(User user) throws ScriptNotFoundException { // RFC 5228 permits extensions: .siv .sieve - String sieveFilePrefix = FileSystem.FILE_PROTOCOL + "sieve/" + user + "."; + String sieveFilePrefix = FileSystem.FILE_PROTOCOL + "sieve/" + user.asString() + "."; try { return fileSystem.getFile(sieveFilePrefix + "sieve"); } catch (FileNotFoundException e) { @@ -98,22 +102,22 @@ public class SieveDefaultRepository implements SieveRepository { } @Override - public void setActive(String user, String name) throws ScriptNotFoundException, StorageException { + public void setActive(User user, ScriptName name) throws ScriptNotFoundException, StorageException { throw new StorageException("This implementation is deprecated and does not support script SetActive operation. Your uploaded script is by default the active script. Please consider using a SieveFileRepository."); } @Override - public InputStream getScript(String user, String name) throws ScriptNotFoundException, StorageException { + public InputStream getScript(User user, ScriptName name) throws ScriptNotFoundException, StorageException { return getActive(user); } @Override - public void deleteScript(String user, String name) throws ScriptNotFoundException, IsActiveException, StorageException { + public void deleteScript(User user, ScriptName name) throws ScriptNotFoundException, IsActiveException, StorageException { throw new StorageException("This implementation is deprecated and does not support delete script operation. Please consider using a SieveFileRepository."); } @Override - public void renameScript(String user, String oldName, String newName) throws ScriptNotFoundException, DuplicateException, StorageException { + public void renameScript(User user, ScriptName oldName, ScriptName newName) throws ScriptNotFoundException, DuplicateException, StorageException { throw new StorageException("This implementation is deprecated and does not support rename script operation. Please consider using a SieveFileRepository."); } @@ -123,12 +127,12 @@ public class SieveDefaultRepository implements SieveRepository { } @Override - public long getQuota() throws QuotaNotFoundException, StorageException { + public QuotaSize getQuota() throws QuotaNotFoundException, StorageException { throw apologizeForQuotas(); } @Override - public void setQuota(long quota) throws StorageException { + public void setQuota(QuotaSize quota) throws StorageException { throw apologizeForQuotas(); } @@ -138,22 +142,22 @@ public class SieveDefaultRepository implements SieveRepository { } @Override - public boolean hasQuota(String user) throws StorageException { + public boolean hasQuota(User user) throws StorageException { throw apologizeForQuotas(); } @Override - public long getQuota(String user) throws QuotaNotFoundException, StorageException { + public QuotaSize getQuota(User user) throws QuotaNotFoundException, StorageException { throw apologizeForQuotas(); } @Override - public void setQuota(String user, long quota) throws StorageException { + public void setQuota(User user, QuotaSize quota) throws StorageException { throw apologizeForQuotas(); } @Override - public void removeQuota(String user) throws QuotaNotFoundException, StorageException { + public void removeQuota(User user) throws QuotaNotFoundException, StorageException { throw apologizeForQuotas(); } http://git-wip-us.apache.org/repos/asf/james-project/blob/3d0a5534/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java ---------------------------------------------------------------------- diff --git a/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java b/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java index 400cad5..9c6bbd6 100644 --- a/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java +++ b/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java @@ -39,7 +39,11 @@ import javax.inject.Inject; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; +import org.apache.james.core.User; +import org.apache.james.core.quota.QuotaSize; import org.apache.james.filesystem.api.FileSystem; +import org.apache.james.sieverepository.api.ScriptContent; +import org.apache.james.sieverepository.api.ScriptName; import org.apache.james.sieverepository.api.ScriptSummary; import org.apache.james.sieverepository.api.SieveRepository; import org.apache.james.sieverepository.api.exception.DuplicateException; @@ -143,11 +147,11 @@ public class SieveFileRepository implements SieveRepository { } @Override - public void deleteScript(String user, String name) throws ScriptNotFoundException, IsActiveException, StorageException { + public void deleteScript(User user, ScriptName name) throws ScriptNotFoundException, IsActiveException, StorageException { synchronized (lock) { File file = getScriptFile(user, name); if (isActiveFile(user, file)) { - throw new IsActiveException("User: " + user + "Script: " + name); + throw new IsActiveException("User: " + user.asString() + "Script: " + name); } try { FileUtils.forceDelete(file); @@ -158,7 +162,7 @@ public class SieveFileRepository implements SieveRepository { } @Override - public InputStream getScript(String user, String name) throws ScriptNotFoundException, StorageException { + public InputStream getScript(User user, ScriptName name) throws ScriptNotFoundException, StorageException { InputStream script; try { script = new FileInputStream(getScriptFile(user, name)); @@ -175,9 +179,9 @@ public class SieveFileRepository implements SieveRepository { * The '.quota' file contains a single positive integer value representing the quota in octets. */ @Override - public void haveSpace(String user, String name, long size) throws QuotaExceededException, StorageException { + public void haveSpace(User user, ScriptName name, long size) throws QuotaExceededException, StorageException { long usedSpace = Arrays.stream(getUserDirectory(user).listFiles()) - .filter(file -> !(file.getName().equals(name) || SYSTEM_FILES.contains(file.getName()))) + .filter(file -> !(file.getName().equals(name.getValue()) || SYSTEM_FILES.contains(file.getName()))) .mapToLong(File::length) .sum(); @@ -206,7 +210,7 @@ public class SieveFileRepository implements SieveRepository { } @Override - public List<ScriptSummary> listScripts(String user) throws StorageException { + public List<ScriptSummary> listScripts(User user) throws StorageException { File[] files = getUserDirectory(user).listFiles(); List<ScriptSummary> summaries = new ArrayList<>(files.length); File activeFile = null; @@ -217,7 +221,7 @@ public class SieveFileRepository implements SieveRepository { } for (File file : files) { if (!SYSTEM_FILES.contains(file.getName())) { - summaries.add(new ScriptSummary(file.getName(), isActive(file, activeFile))); + summaries.add(new ScriptSummary(new ScriptName(file.getName()), isActive(file, activeFile))); } } return summaries; @@ -229,22 +233,22 @@ public class SieveFileRepository implements SieveRepository { } @Override - public void putScript(String user, String name, String content) throws StorageException, QuotaExceededException { + public void putScript(User user, ScriptName name, ScriptContent content) throws StorageException, QuotaExceededException { synchronized (lock) { - File file = new File(getUserDirectory(user), name); + File file = new File(getUserDirectory(user), name.getValue()); haveSpace(user, name, content.length()); - toFile(file, content); + toFile(file, content.getValue()); } } @Override - public void renameScript(String user, String oldName, String newName) + public void renameScript(User user, ScriptName oldName, ScriptName newName) throws ScriptNotFoundException, DuplicateException, StorageException { synchronized (lock) { File oldFile = getScriptFile(user, oldName); - File newFile = new File(getUserDirectory(user), newName); + File newFile = new File(getUserDirectory(user), newName.getValue()); if (newFile.exists()) { - throw new DuplicateException("User: " + user + "Script: " + newName); + throw new DuplicateException("User: " + user.asString() + "Script: " + newName); } try { FileUtils.copyFile(oldFile, newFile); @@ -259,7 +263,7 @@ public class SieveFileRepository implements SieveRepository { } @Override - public InputStream getActive(String user) throws ScriptNotFoundException, StorageException { + public InputStream getActive(User user) throws ScriptNotFoundException, StorageException { InputStream script; try { script = new FileInputStream(getActiveFile(user)); @@ -270,12 +274,12 @@ public class SieveFileRepository implements SieveRepository { } @Override - public DateTime getActivationDateForActiveScript(String user) throws StorageException, ScriptNotFoundException { + public DateTime getActivationDateForActiveScript(User user) throws StorageException, ScriptNotFoundException { return new DateTime(getActiveFile(user).lastModified()); } @Override - public void setActive(String user, String name) throws ScriptNotFoundException, StorageException { + public void setActive(User user, ScriptName scriptName) throws ScriptNotFoundException, StorageException { synchronized (lock) { // Turn off currently active script, if any File oldActive = null; @@ -286,9 +290,10 @@ public class SieveFileRepository implements SieveRepository { // This is permissible } // Turn on the new active script if not an empty name + String name = scriptName.getValue(); if ((null != name) && (!name.trim().isEmpty())) { try { - setActiveFile(getScriptFile(user, name), user, true); + setActiveFile(getScriptFile(user, new ScriptName(name)), user, true); } catch (ScriptNotFoundException ex) { if (null != oldActive) { setActiveFile(oldActive, user, true); @@ -307,7 +312,7 @@ public class SieveFileRepository implements SieveRepository { } } - protected File getUserDirectory(String user) throws StorageException { + protected File getUserDirectory(User user) throws StorageException { File file = getUserDirectoryFile(user); if (!file.exists()) { ensureUser(user); @@ -315,22 +320,22 @@ public class SieveFileRepository implements SieveRepository { return file; } - protected File getUserDirectoryFile(String user) throws StorageException { - return new File(getSieveRootDirectory(), user + '/'); + protected File getUserDirectoryFile(User user) throws StorageException { + return new File(getSieveRootDirectory(), user.asString() + '/'); } - protected File getActiveFile(String user) throws ScriptNotFoundException, StorageException { + protected File getActiveFile(User user) throws ScriptNotFoundException, StorageException { File dir = getUserDirectory(user); String content; try { content = toString(new File(dir, FILE_NAME_ACTIVE), UTF_8); } catch (FileNotFoundException ex) { - throw new ScriptNotFoundException("There is no active script for user " + user); + throw new ScriptNotFoundException("There is no active script for user " + user.asString()); } return new File(dir, content); } - protected boolean isActiveFile(String user, File file) throws StorageException { + protected boolean isActiveFile(User user, File file) throws StorageException { try { return 0 == getActiveFile(user).compareTo(file); } catch (ScriptNotFoundException ex) { @@ -338,11 +343,11 @@ public class SieveFileRepository implements SieveRepository { } } - protected void setActiveFile(File scriptToBeActivated, String userName, boolean isActive) throws StorageException { + protected void setActiveFile(File scriptToBeActivated, User userName, boolean isActive) throws StorageException { File personalScriptDirectory = scriptToBeActivated.getParentFile(); File sieveBaseDirectory = personalScriptDirectory.getParentFile(); File activeScriptPersistenceFile = new File(personalScriptDirectory, FILE_NAME_ACTIVE); - File activeScriptCopy = new File(sieveBaseDirectory, userName + SIEVE_EXTENSION); + File activeScriptCopy = new File(sieveBaseDirectory, userName.asString() + SIEVE_EXTENSION); if (isActive) { toFile(activeScriptPersistenceFile, scriptToBeActivated.getName()); try { @@ -360,15 +365,15 @@ public class SieveFileRepository implements SieveRepository { } } - protected File getScriptFile(String user, String name) throws ScriptNotFoundException, StorageException { - File file = new File(getUserDirectory(user), name); + protected File getScriptFile(User user, ScriptName name) throws ScriptNotFoundException, StorageException { + File file = new File(getUserDirectory(user), name.getValue()); if (!file.exists()) { throw new ScriptNotFoundException("User: " + user + "Script: " + name); } return file; } - public void ensureUser(String user) throws StorageException { + public void ensureUser(User user) throws StorageException { synchronized (lock) { try { FileUtils.forceMkdir(getUserDirectoryFile(user)); @@ -388,7 +393,7 @@ public class SieveFileRepository implements SieveRepository { } @Override - public long getQuota() throws QuotaNotFoundException, StorageException { + public QuotaSize getQuota() throws QuotaNotFoundException, StorageException { Long quota = null; File file = getQuotaFile(); if (file.exists()) { @@ -407,7 +412,7 @@ public class SieveFileRepository implements SieveRepository { if (null == quota) { throw new QuotaNotFoundException("No default quota"); } - return quota; + return QuotaSize.size(quota); } @Override @@ -424,23 +429,23 @@ public class SieveFileRepository implements SieveRepository { } @Override - public synchronized void setQuota(long quota) throws StorageException { + public synchronized void setQuota(QuotaSize quota) throws StorageException { File file = getQuotaFile(); - String content = Long.toString(quota); + String content = Long.toString(quota.asLong()); toFile(file, content); } - protected File getQuotaFile(String user) throws StorageException { + protected File getQuotaFile(User user) throws StorageException { return new File(getUserDirectory(user), FILE_NAME_QUOTA); } @Override - public boolean hasQuota(String user) throws StorageException { + public boolean hasQuota(User user) throws StorageException { return getQuotaFile(user).exists(); } @Override - public long getQuota(String user) throws QuotaNotFoundException, StorageException { + public QuotaSize getQuota(User user) throws QuotaNotFoundException, StorageException { Long quota = null; File file = getQuotaFile(user); if (file.exists()) { @@ -457,13 +462,13 @@ public class SieveFileRepository implements SieveRepository { } } if (null == quota) { - throw new QuotaNotFoundException("No quota for user: " + user); + throw new QuotaNotFoundException("No quota for user: " + user.asString()); } - return quota; + return QuotaSize.size(quota); } @Override - public void removeQuota(String user) throws QuotaNotFoundException, StorageException { + public void removeQuota(User user) throws QuotaNotFoundException, StorageException { synchronized (lock) { File file = getQuotaFile(user); if (!file.exists()) { @@ -478,10 +483,10 @@ public class SieveFileRepository implements SieveRepository { } @Override - public void setQuota(String user, long quota) throws StorageException { + public void setQuota(User user, QuotaSize quota) throws StorageException { synchronized (lock) { File file = getQuotaFile(user); - String content = Long.toString(quota); + String content = Long.toString(quota.asLong()); toFile(file, content); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/3d0a5534/server/data/data-library/src/main/java/org/apache/james/sieverepository/lib/SieveRepositoryManagement.java ---------------------------------------------------------------------- diff --git a/server/data/data-library/src/main/java/org/apache/james/sieverepository/lib/SieveRepositoryManagement.java b/server/data/data-library/src/main/java/org/apache/james/sieverepository/lib/SieveRepositoryManagement.java index c5b2ca4..d60cf1a 100644 --- a/server/data/data-library/src/main/java/org/apache/james/sieverepository/lib/SieveRepositoryManagement.java +++ b/server/data/data-library/src/main/java/org/apache/james/sieverepository/lib/SieveRepositoryManagement.java @@ -24,6 +24,8 @@ import javax.inject.Inject; import javax.management.NotCompliantMBeanException; import javax.management.StandardMBean; +import org.apache.james.core.User; +import org.apache.james.core.quota.QuotaSize; import org.apache.james.sieverepository.api.SieveRepository; import org.apache.james.sieverepository.api.SieveRepositoryManagementMBean; import org.apache.james.sieverepository.api.exception.SieveRepositoryException; @@ -43,12 +45,12 @@ public class SieveRepositoryManagement extends StandardMBean implements SieveRep @Override public long getQuota() throws SieveRepositoryException { - return sieveRepository.getQuota(); + return sieveRepository.getQuota().asLong(); } @Override public void setQuota(long quota) throws SieveRepositoryException { - sieveRepository.setQuota(quota); + sieveRepository.setQuota(QuotaSize.size(quota)); } @Override @@ -58,16 +60,16 @@ public class SieveRepositoryManagement extends StandardMBean implements SieveRep @Override public long getQuota(String user) throws SieveRepositoryException { - return sieveRepository.getQuota(user); + return sieveRepository.getQuota(User.fromUsername(user)).asLong(); } @Override public void setQuota(String user, long quota) throws SieveRepositoryException { - sieveRepository.setQuota(user, quota); + sieveRepository.setQuota(User.fromUsername(user), QuotaSize.size(quota)); } @Override public void removeQuota(String user) throws SieveRepositoryException { - sieveRepository.removeQuota(user); + sieveRepository.removeQuota(User.fromUsername(user)); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/3d0a5534/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java ---------------------------------------------------------------------- diff --git a/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java b/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java index 7f5eaa4..fe5b557 100644 --- a/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java +++ b/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java @@ -22,8 +22,13 @@ import static org.assertj.core.api.Assertions.assertThat; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import org.apache.commons.io.IOUtils; +import org.apache.james.core.User; +import org.apache.james.core.quota.QuotaSize; +import org.apache.james.sieverepository.api.ScriptContent; +import org.apache.james.sieverepository.api.ScriptName; import org.apache.james.sieverepository.api.ScriptSummary; import org.apache.james.sieverepository.api.SieveRepository; import org.apache.james.sieverepository.api.exception.DuplicateException; @@ -36,15 +41,14 @@ import org.junit.Test; public abstract class AbstractSieveRepositoryTest { - protected static final String USER = "test"; - protected static final String SCRIPT_NAME = "script"; - protected static final String SCRIPT_CONTENT = "Hello World"; + protected static final User USER = User.fromUsername("test"); + protected static final ScriptName SCRIPT_NAME = new ScriptName("script"); + protected static final ScriptContent SCRIPT_CONTENT = new ScriptContent("Hello World"); - private static final String OTHER_SCRIPT_NAME = "other_script"; - private static final String OTHER_SCRIPT_CONTENT = "Other script content"; - private static final long DEFAULT_QUOTA = Long.MAX_VALUE - 1L; - private static final long USER_QUOTA = Long.MAX_VALUE / 2; - private static final String UTF8_ENCODING = "UTF-8"; + private static final ScriptName OTHER_SCRIPT_NAME = new ScriptName("other_script"); + private static final ScriptContent OTHER_SCRIPT_CONTENT = new ScriptContent("Other script content"); + private static final QuotaSize DEFAULT_QUOTA = QuotaSize.size(Long.MAX_VALUE - 1L); + private static final QuotaSize USER_QUOTA = QuotaSize.size(Long.MAX_VALUE / 2); protected SieveRepository sieveRepository; @@ -79,40 +83,40 @@ public abstract class AbstractSieveRepositoryTest { @Test public void haveSpaceShouldNotThrowWhenUserDoesNotHaveQuota() throws Exception { - sieveRepository.haveSpace(USER, SCRIPT_NAME, DEFAULT_QUOTA + 1L); + sieveRepository.haveSpace(USER, SCRIPT_NAME, DEFAULT_QUOTA.asLong() + 1L); } @Test public void haveSpaceShouldNotThrowWhenQuotaIsNotReached() throws Exception { sieveRepository.setQuota(DEFAULT_QUOTA); - sieveRepository.haveSpace(USER, SCRIPT_NAME, DEFAULT_QUOTA); + sieveRepository.haveSpace(USER, SCRIPT_NAME, DEFAULT_QUOTA.asLong()); } @Test(expected = QuotaExceededException.class) public void haveSpaceShouldThrowWhenQuotaIsExceed() throws Exception { sieveRepository.setQuota(DEFAULT_QUOTA); - sieveRepository.haveSpace(USER, SCRIPT_NAME, DEFAULT_QUOTA + 1); + sieveRepository.haveSpace(USER, SCRIPT_NAME, DEFAULT_QUOTA.asLong() + 1); } @Test public void haveSpaceShouldNotThrowWhenAttemptToReplaceOtherScript() throws Exception { sieveRepository.setQuota(USER, USER_QUOTA); sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT); - sieveRepository.haveSpace(USER, SCRIPT_NAME, USER_QUOTA); + sieveRepository.haveSpace(USER, SCRIPT_NAME, USER_QUOTA.asLong()); } @Test(expected = QuotaExceededException.class) public void haveSpaceShouldThrowWhenAttemptToReplaceOtherScriptWithTooLargeScript() throws Exception { sieveRepository.setQuota(USER, USER_QUOTA); sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT); - sieveRepository.haveSpace(USER, SCRIPT_NAME, USER_QUOTA + 1); + sieveRepository.haveSpace(USER, SCRIPT_NAME, USER_QUOTA.asLong() + 1); } @Test(expected = QuotaExceededException.class) public void haveSpaceShouldTakeAlreadyExistingScriptsIntoAccount() throws Exception { sieveRepository.setQuota(USER, USER_QUOTA); sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT); - sieveRepository.haveSpace(USER, OTHER_SCRIPT_NAME, USER_QUOTA - 1); + sieveRepository.haveSpace(USER, OTHER_SCRIPT_NAME, USER_QUOTA.asLong() - 1); } @Test @@ -120,7 +124,7 @@ public abstract class AbstractSieveRepositoryTest { sieveRepository.setQuota(USER, USER_QUOTA); sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT); sieveRepository.setActive(USER, SCRIPT_NAME); - sieveRepository.haveSpace(USER, SCRIPT_NAME, USER_QUOTA); + sieveRepository.haveSpace(USER, SCRIPT_NAME, USER_QUOTA.asLong()); } @Test @@ -156,15 +160,15 @@ public abstract class AbstractSieveRepositoryTest { @Test(expected = QuotaExceededException.class) public void putScriptShouldThrowWhenScriptTooBig() throws Exception { - sieveRepository.setQuota(SCRIPT_CONTENT.length() - 1); + sieveRepository.setQuota(QuotaSize.size(SCRIPT_CONTENT.length() - 1)); sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT); } @Test(expected = QuotaExceededException.class) public void putScriptShouldThrowWhenQuotaChangedInBetween() throws Exception { - sieveRepository.setQuota(SCRIPT_CONTENT.length()); + sieveRepository.setQuota(QuotaSize.size(SCRIPT_CONTENT.length())); sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT); - sieveRepository.setQuota(SCRIPT_CONTENT.length() - 1); + sieveRepository.setQuota(QuotaSize.size(SCRIPT_CONTENT.length() - 1)); sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT); } @@ -340,7 +344,7 @@ public abstract class AbstractSieveRepositoryTest { } protected String getScriptContent(InputStream inputStream) throws IOException { - return IOUtils.toString(inputStream, UTF8_ENCODING); + return IOUtils.toString(inputStream, StandardCharsets.UTF_8); } protected abstract SieveRepository createSieveRepository() throws Exception; http://git-wip-us.apache.org/repos/asf/james-project/blob/3d0a5534/server/data/data-memory/src/main/java/org/apache/james/sieverepository/memory/InMemorySieveQuotaRepository.java ---------------------------------------------------------------------- diff --git a/server/data/data-memory/src/main/java/org/apache/james/sieverepository/memory/InMemorySieveQuotaRepository.java b/server/data/data-memory/src/main/java/org/apache/james/sieverepository/memory/InMemorySieveQuotaRepository.java index 1e30b9c..8820ee9 100644 --- a/server/data/data-memory/src/main/java/org/apache/james/sieverepository/memory/InMemorySieveQuotaRepository.java +++ b/server/data/data-memory/src/main/java/org/apache/james/sieverepository/memory/InMemorySieveQuotaRepository.java @@ -23,14 +23,16 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; +import org.apache.james.core.User; +import org.apache.james.core.quota.QuotaSize; import org.apache.james.sieverepository.api.SieveQuotaRepository; import org.apache.james.sieverepository.api.exception.QuotaNotFoundException; public class InMemorySieveQuotaRepository implements SieveQuotaRepository { - private Optional<Long> globalQuota = Optional.empty(); + private Optional<QuotaSize> globalQuota = Optional.empty(); - private Map<String, Long> userQuota = new ConcurrentHashMap<>(); + private Map<User, QuotaSize> userQuota = new ConcurrentHashMap<>(); @Override public boolean hasQuota() { @@ -38,12 +40,12 @@ public class InMemorySieveQuotaRepository implements SieveQuotaRepository { } @Override - public long getQuota() throws QuotaNotFoundException { + public QuotaSize getQuota() throws QuotaNotFoundException { return globalQuota.orElseThrow(QuotaNotFoundException::new); } @Override - public void setQuota(long quota) { + public void setQuota(QuotaSize quota) { this.globalQuota = Optional.of(quota); } @@ -56,24 +58,24 @@ public class InMemorySieveQuotaRepository implements SieveQuotaRepository { } @Override - public boolean hasQuota(String user) { + public boolean hasQuota(User user) { return userQuota.containsKey(user); } @Override - public long getQuota(String user) throws QuotaNotFoundException { + public QuotaSize getQuota(User user) throws QuotaNotFoundException { return Optional.ofNullable(userQuota.get(user)) .orElseThrow(QuotaNotFoundException::new); } @Override - public void setQuota(String user, long quota) { + public void setQuota(User user, QuotaSize quota) { userQuota.put(user, quota); } @Override - public void removeQuota(String user) throws QuotaNotFoundException { - Optional<Long> quotaValue = Optional.ofNullable(userQuota.get(user)); + public void removeQuota(User user) throws QuotaNotFoundException { + Optional<QuotaSize> quotaValue = Optional.ofNullable(userQuota.get(user)); if (!quotaValue.isPresent()) { throw new QuotaNotFoundException(); } http://git-wip-us.apache.org/repos/asf/james-project/blob/3d0a5534/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java index 26a3658..6b755fb 100644 --- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java +++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java @@ -29,8 +29,8 @@ import static org.apache.james.mailets.configuration.Constants.awaitAtMostOneMin import static org.assertj.core.api.Assertions.assertThat; import org.apache.james.MemoryJamesServerMain; -import org.apache.james.mailbox.quota.QuotaCount; -import org.apache.james.mailbox.quota.QuotaSize; +import org.apache.james.core.quota.QuotaCount; +import org.apache.james.core.quota.QuotaSize; import org.apache.james.mailets.TemporaryJamesServer; import org.apache.james.mailets.configuration.CommonProcessors; import org.apache.james.mailets.configuration.MailetConfiguration; http://git-wip-us.apache.org/repos/asf/james-project/blob/3d0a5534/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ResourceLocator.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ResourceLocator.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ResourceLocator.java index 736687f..cdb310c 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ResourceLocator.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ResourceLocator.java @@ -21,6 +21,7 @@ package org.apache.james.transport.mailets.jsieve; import java.io.InputStream; import org.apache.james.core.MailAddress; +import org.apache.james.core.User; import org.apache.james.sieverepository.api.SieveRepository; import org.apache.james.user.api.UsersRepository; import org.apache.james.user.api.UsersRepositoryException; @@ -61,16 +62,15 @@ public class ResourceLocator { } public UserSieveInformation get(MailAddress mailAddress) throws Exception { - String username = retrieveUsername(mailAddress); + User username = retrieveUsername(mailAddress); return new UserSieveInformation(sieveRepository.getActivationDateForActiveScript(username), DateTime.now(), sieveRepository.getActive(username)); } - private String retrieveUsername(MailAddress mailAddress) { + private User retrieveUsername(MailAddress mailAddress) { try { - return usersRepository.getUser(mailAddress); + return User.fromUsername(usersRepository.getUser(mailAddress)); } catch (UsersRepositoryException e) { - - return mailAddress.asString(); + return User.fromMailAddress(mailAddress); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/3d0a5534/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ResourceLocatorTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ResourceLocatorTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ResourceLocatorTest.java index 30064ab..12ff8d3 100644 --- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ResourceLocatorTest.java +++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ResourceLocatorTest.java @@ -27,6 +27,7 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; import org.apache.james.core.MailAddress; +import org.apache.james.core.User; import org.apache.james.sieverepository.api.SieveRepository; import org.apache.james.sieverepository.api.exception.ScriptNotFoundException; import org.apache.james.transport.mailets.jsieve.ResourceLocator; @@ -37,6 +38,7 @@ import org.junit.Test; public class ResourceLocatorTest { public static final String RECEIVER_LOCALHOST = "receiver@localhost"; + public static final User USER = User.fromUsername(RECEIVER_LOCALHOST); private SieveRepository sieveRepository; private ResourceLocator resourceLocator; private MailAddress mailAddress; @@ -52,7 +54,7 @@ public class ResourceLocatorTest { @Test(expected = ScriptNotFoundException.class) public void resourceLocatorImplShouldPropagateScriptNotFound() throws Exception { - when(sieveRepository.getActive(RECEIVER_LOCALHOST)).thenThrow(new ScriptNotFoundException()); + when(sieveRepository.getActive(USER)).thenThrow(new ScriptNotFoundException()); when(usersRepository.getUser(mailAddress)).thenReturn(RECEIVER_LOCALHOST); resourceLocator.get(mailAddress); @@ -61,7 +63,7 @@ public class ResourceLocatorTest { @Test public void resourceLocatorImplShouldWork() throws Exception { InputStream inputStream = new ByteArrayInputStream(new byte[0]); - when(sieveRepository.getActive(RECEIVER_LOCALHOST)).thenReturn(inputStream); + when(sieveRepository.getActive(USER)).thenReturn(inputStream); when(usersRepository.getUser(mailAddress)).thenReturn(RECEIVER_LOCALHOST); assertThat(resourceLocator.get(mailAddress).getScriptContent()).isEqualTo(inputStream); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
