Author: btellier
Date: Thu Dec 17 15:10:18 2015
New Revision: 1720595
URL: http://svn.apache.org/viewvc?rev=1720595&view=rev
Log:
JAMES-1618 centralize error handling to remove code duplication
Modified:
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
Modified:
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java?rev=1720595&r1=1720594&r2=1720595&view=diff
==============================================================================
---
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
(original)
+++
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
Thu Dec 17 15:10:18 2015
@@ -24,7 +24,6 @@ import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.base.Strings;
-import com.google.common.base.Throwables;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@@ -32,22 +31,24 @@ import org.apache.commons.io.IOUtils;
import org.apache.james.managesieve.api.AuthenticationException;
import org.apache.james.managesieve.api.AuthenticationProcessor;
import org.apache.james.managesieve.api.AuthenticationRequiredException;
+import org.apache.james.managesieve.api.ManageSieveException;
import org.apache.james.managesieve.api.Session;
import org.apache.james.managesieve.api.SessionTerminatedException;
import org.apache.james.managesieve.api.SieveParser;
import org.apache.james.managesieve.api.SyntaxException;
import org.apache.james.managesieve.api.UnknownSaslMechanism;
import org.apache.james.managesieve.api.commands.CoreCommands;
+import org.apache.james.managesieve.util.ParserUtils;
import org.apache.james.sieverepository.api.ScriptSummary;
import org.apache.james.sieverepository.api.SieveRepository;
import org.apache.james.sieverepository.api.exception.DuplicateException;
import org.apache.james.sieverepository.api.exception.IsActiveException;
import org.apache.james.sieverepository.api.exception.QuotaExceededException;
import org.apache.james.sieverepository.api.exception.ScriptNotFoundException;
+import org.apache.james.sieverepository.api.exception.SieveRepositoryException;
import org.apache.james.sieverepository.api.exception.StorageException;
import org.apache.james.sieverepository.api.exception.UserNotFoundException;
import org.apache.james.user.api.UsersRepository;
-import org.apache.james.user.api.UsersRepositoryException;
import java.io.IOException;
import java.util.Arrays;
@@ -56,19 +57,21 @@ import java.util.List;
import java.util.Map;
public class CoreProcessor implements CoreCommands {
-
+
+ interface CommandWrapper {
+ String execute() throws ManageSieveException,
SieveRepositoryException, IOException;
+ }
+
public static final String IMPLEMENTATION_DESCRIPTION = "Apache
ManageSieve v1.0";
public static final String MANAGE_SIEVE_VERSION = "1.0";
private final SieveRepository sieveRepository;
- private final UsersRepository usersRepository;
private final SieveParser parser;
private final Map<Capabilities, String> capabilitiesBase;
private final Map<SupportedMechanism, AuthenticationProcessor>
authenticationProcessorMap;
public CoreProcessor(SieveRepository repository, UsersRepository
usersRepository, SieveParser parser) {
this.sieveRepository = repository;
- this.usersRepository = usersRepository;
this.parser = parser;
this.capabilitiesBase = precomputedCapabilitiesBase(parser);
this.authenticationProcessorMap = new HashMap<SupportedMechanism,
AuthenticationProcessor>();
@@ -108,15 +111,13 @@ public class CoreProcessor implements Co
}
@Override
- public String checkScript(Session session, String content) {
- try {
- authenticationCheck(session);
- return manageWarnings(parser.parse(content));
- } catch (AuthenticationRequiredException ex) {
- return "NO";
- } catch (SyntaxException ex) {
- return sanitizeString("NO \"Syntax Error: " + ex.getMessage() +
"\"");
- }
+ public String checkScript(final Session session, final String content) {
+ return handleCommandExecution(new CommandWrapper() {
+ public String execute() throws ManageSieveException,
SieveRepositoryException {
+ authenticationCheck(session);
+ return manageWarnings(parser.parse(content));
+ }
+ }, session);
}
private String manageWarnings(List<String> warnings) {
@@ -131,142 +132,95 @@ public class CoreProcessor implements Co
}
}
- private String sanitizeString(String message) {
- return Joiner.on("\r\n").join(Splitter.on('\n').split(message));
- }
-
@Override
- public String deleteScript(Session session, String name) {
- try {
- authenticationCheck(session);
- sieveRepository.deleteScript(session.getUser(), name);
- } catch (AuthenticationRequiredException ex) {
- return "NO";
- } catch (ScriptNotFoundException ex) {
- return "NO (NONEXISTENT) \"There is no script by that name\"";
- } catch (IsActiveException ex) {
- return "NO (ACTIVE) \"You may not delete an active script\"";
- } catch (UserNotFoundException e) {
- return "NO : Invalid user " + session.getUser();
- } catch (StorageException e) {
- return "NO : Storage Exception : " + e.getMessage();
- }
- return "OK";
+ public String deleteScript(final Session session, final String name) {
+ return handleCommandExecution(new CommandWrapper() {
+ public String execute() throws ManageSieveException,
SieveRepositoryException {
+ authenticationCheck(session);
+ sieveRepository.deleteScript(session.getUser(), name);
+ return "OK";
+ }
+ }, session);
}
@Override
- public String getScript(Session session, String name) {
- try {
- authenticationCheck(session);
- String scriptContent =
IOUtils.toString(sieveRepository.getScript(session.getUser(), name));
- return "{" + scriptContent.length() + "}" + "\r\n" + scriptContent
+ "\r\nOK";
- } catch (AuthenticationRequiredException ex) {
- return "NO";
- } catch (ScriptNotFoundException ex) {
- return "NO (NONEXISTENT) \"There is no script by that name\"";
- } catch (StorageException ex) {
- return "NO \"" + ex.getMessage() + "\"";
- } catch (UserNotFoundException e) {
- return "NO : Invalid user " + session.getUser();
- } catch (IOException e) {
- return "NO \"" + e.getMessage() + "\"";
- }
+
+ public String getScript(final Session session, final String name) {
+ return handleCommandExecution(new CommandWrapper() {
+ public String execute() throws ManageSieveException,
SieveRepositoryException, IOException {
+ authenticationCheck(session);
+ String scriptContent =
IOUtils.toString(sieveRepository.getScript(session.getUser(), name));
+ return "{" + scriptContent.length() + "}" + "\r\n" +
scriptContent + "\r\nOK";
+ }
+ }, session);
}
@Override
- public String haveSpace(Session session, String name, long size) {
- try {
- authenticationCheck(session);
- sieveRepository.haveSpace(session.getUser(), name, size);
- } catch (AuthenticationRequiredException ex) {
- return "NO";
- } catch (QuotaExceededException ex) {
- return "NO (QUOTA/MAXSIZE) \"Quota exceeded\"";
- } catch (UserNotFoundException e) {
- return "NO user not found : " + session.getUser();
- } catch (StorageException e) {
- return "NO storage exception : " + e.getMessage();
- }
- return "OK";
+ public String haveSpace(final Session session, final String name, final
long size) {
+ return handleCommandExecution(new CommandWrapper() {
+ public String execute() throws ManageSieveException,
SieveRepositoryException {
+ authenticationCheck(session);
+ sieveRepository.haveSpace(session.getUser(), name, size);
+ return "OK";
+ }
+ }, session);
}
@Override
- public String listScripts(Session session) {
- try {
- authenticationCheck(session);
- String list = Joiner.on("\r\n").join(
-
Iterables.transform(sieveRepository.listScripts(session.getUser()), new
Function<ScriptSummary, String>() {
- public String apply(ScriptSummary scriptSummary) {
- return '"' + scriptSummary.getName() + '"' +
(scriptSummary.isActive() ? " ACTIVE" : "");
- }
- }));
- if (Strings.isNullOrEmpty(list)) {
- return "OK";
- } else {
- return list + "\r\nOK";
+ public String listScripts(final Session session) {
+ return handleCommandExecution(new CommandWrapper() {
+ public String execute() throws ManageSieveException,
SieveRepositoryException {
+ return listScriptsInternals(session);
}
- } catch (AuthenticationRequiredException ex) {
- return "NO";
- } catch (UserNotFoundException e) {
- return "NO user not found : " + session.getUser();
- } catch (StorageException e) {
- return "NO storage exception : " + e.getMessage();
+ }, session);
+ }
+
+ private String listScriptsInternals(Session session) throws
AuthenticationRequiredException, UserNotFoundException, StorageException {
+ authenticationCheck(session);
+ String list = Joiner.on("\r\n").join(
+
Iterables.transform(sieveRepository.listScripts(session.getUser()), new
Function<ScriptSummary, String>() {
+ public String apply(ScriptSummary scriptSummary) {
+ return '"' + scriptSummary.getName() + '"' +
(scriptSummary.isActive() ? " ACTIVE" : "");
+ }
+ }));
+ if (Strings.isNullOrEmpty(list)) {
+ return "OK";
+ } else {
+ return list + "\r\nOK";
}
}
@Override
- public String putScript(Session session, String name, String content) {
- try {
- authenticationCheck(session);
- sieveRepository.putScript(session.getUser(), name, content);
- return manageWarnings(parser.parse(content));
- } catch (AuthenticationRequiredException ex) {
- return "NO";
- } catch (SyntaxException ex) {
- return Joiner.on("\r\n").join(Splitter.on('\n').split("NO \"Syntax
Error: " + ex.getMessage() + "\""));
- } catch (QuotaExceededException ex) {
- return "NO (QUOTA/MAXSIZE) \"Quota exceeded\"";
- } catch (UserNotFoundException e) {
- return "NO user not found : " + session.getUser();
- } catch (StorageException e) {
- return "NO storage exception : " + e.getMessage();
- }
+ public String putScript(final Session session, final String name, final
String content) {
+ return handleCommandExecution(new CommandWrapper() {
+ public String execute() throws ManageSieveException,
SieveRepositoryException {
+ authenticationCheck(session);
+ sieveRepository.putScript(session.getUser(), name, content);
+ return manageWarnings(parser.parse(content));
+ }
+ }, session);
}
@Override
- public String renameScript(Session session, String oldName, String
newName) {
- try {
- authenticationCheck(session);
- sieveRepository.renameScript(session.getUser(), oldName, newName);
- } catch (AuthenticationRequiredException ex) {
- return "NO";
- } catch (ScriptNotFoundException ex) {
- return "NO (NONEXISTENT) \"There is no script by that name\"";
- } catch (DuplicateException ex) {
- return "NO (ALREADYEXISTS) \"A script with that name already
exists\"";
- } catch (UserNotFoundException e) {
- return "NO user not found : " + session.getUser();
- } catch (StorageException e) {
- return "NO storage exception : " + e.getMessage();
- }
- return "OK";
+ public String renameScript(final Session session, final String oldName,
final String newName) {
+ return handleCommandExecution(new CommandWrapper() {
+ public String execute() throws ManageSieveException,
SieveRepositoryException {
+ authenticationCheck(session);
+ sieveRepository.renameScript(session.getUser(), oldName,
newName);
+ return "OK";
+ }
+ }, session);
}
@Override
- public String setActive(Session session, String name) {
- try {
- authenticationCheck(session);
- sieveRepository.setActive(session.getUser(), name);
- } catch (AuthenticationRequiredException ex) {
- return "NO";
- } catch (ScriptNotFoundException ex) {
- return "NO (NONEXISTENT) \"There is no script by that name\"";
- } catch (UserNotFoundException e) {
- return "NO : User not found";
- } catch (StorageException e) {
- return "NO : Storage exception : " + e.getMessage();
- }
- return "OK";
+ public String setActive(final Session session, final String name) {
+ return handleCommandExecution(new CommandWrapper() {
+ public String execute() throws ManageSieveException,
SieveRepositoryException {
+ authenticationCheck(session);
+ sieveRepository.setActive(session.getUser(), name);
+ return "OK";
+ }
+ }, session);
}
@Override
@@ -283,7 +237,7 @@ public class CoreProcessor implements Co
if (Strings.isNullOrEmpty(mechanism)) {
return "NO ManageSieve syntax is incorrect : You must specify
a SASL mechanism as an argument of AUTHENTICATE command";
}
- String unquotedMechanism = unquotaIfNeeded(mechanism);
+ String unquotedMechanism = ParserUtils.unquote(mechanism);
SupportedMechanism supportedMechanism =
SupportedMechanism.retrieveMechanism(unquotedMechanism);
session.setChoosedAuthenticationMechanism(supportedMechanism);
@@ -346,20 +300,39 @@ public class CoreProcessor implements Co
}
}
- protected void authenticationCheck(Session session) throws
AuthenticationRequiredException {
- if (!session.isAuthenticated()) {
- throw new AuthenticationRequiredException();
+ private String handleCommandExecution(CommandWrapper commandWrapper,
Session session) {
+ try {
+ return commandWrapper.execute();
+ } catch (AuthenticationException e) {
+ return "NO Authentication failed with " + e.getCause().getClass()
+ " : " + e.getMessage();
+ } catch (QuotaExceededException ex) {
+ return "NO (QUOTA/MAXSIZE) \"Quota exceeded\"";
+ } catch (AuthenticationRequiredException ex) {
+ return "NO";
+ } catch (DuplicateException ex) {
+ return "NO (ALREADYEXISTS) \"A script with that name already
exists\"";
+ } catch (ScriptNotFoundException ex) {
+ return "NO (NONEXISTENT) \"There is no script by that name\"";
+ } catch (IsActiveException ex) {
+ return "NO (ACTIVE) \"You may not delete an active script\"";
+ } catch (UserNotFoundException e) {
+ return "NO : Invalid user " + session.getUser();
+ } catch (StorageException e) {
+ return "NO : Storage Exception : " + e.getMessage();
+ } catch (SyntaxException e) {
+ return sanitizeString("NO \"Syntax Error: " + e.getMessage() +
"\"");
+ } catch (ManageSieveException e) {
+ return sanitizeString("NO \"ManageSieveException: " +
e.getMessage() + "\"");
+ } catch (SieveRepositoryException e) {
+ return sanitizeString("NO \"SieveRepositoryException: " +
e.getMessage() + "\"");
+ } catch (IOException e) {
+ return "NO \"" + e.getMessage() + "\"";
}
- ensureUser(session);
}
- private void ensureUser(Session session) {
- try {
- if (session.getUser() == null ||
!usersRepository.contains(session.getUser())) {
- throw new RuntimeException("User " + session.getUser() + " not
found");
- }
- } catch (UsersRepositoryException e) {
- Throwables.propagate(e);
+ protected void authenticationCheck(Session session) throws
AuthenticationRequiredException {
+ if (!session.isAuthenticated()) {
+ throw new AuthenticationRequiredException();
}
}
@@ -369,28 +342,10 @@ public class CoreProcessor implements Co
}
private String taggify(String tag) {
- String sanitizedTag = unquotaIfNeeded(tag.trim());
+ String sanitizedTag = ParserUtils.unquote(tag.trim());
return "(TAG {" + sanitizedTag.length() + "}\r\n" + sanitizedTag + ")";
}
- private String unquotaIfNeeded(String tag) {
- if (Strings.isNullOrEmpty(tag)) {
- return "";
- }
- int startIndex = 0;
- int stopIndex = tag.length();
- if (tag.endsWith("\r\n")) {
- stopIndex -= 2;
- }
- if (tag.charAt(0) == '\"') {
- startIndex = 1;
- }
- if (tag.charAt(tag.length() - 1) == '\"') {
- stopIndex--;
- }
- return tag.substring(startIndex, stopIndex);
- }
-
private Map<Capabilities, String> precomputedCapabilitiesBase(SieveParser
parser) {
String extensions = buildExtensions(parser);
Map<Capabilities, String> capabilitiesBase = new HashMap<Capabilities,
String>();
@@ -414,4 +369,8 @@ public class CoreProcessor implements Co
}
}));
}
+
+ private String sanitizeString(String message) {
+ return Joiner.on("\r\n").join(Splitter.on('\n').split(message));
+ }
}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]