diff options
author | Stefan Niedermann <info@niedermann.it> | 2022-01-17 14:31:59 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2022-01-17 14:31:59 +0300 |
commit | 1efc1886f74f223e80f7fa5ec0007fd643bff262 (patch) | |
tree | 52286750a1142a267b931b80d6210c03632946ce /app/src/main/java | |
parent | 83e5789646de7717f2f3128b73574c9c4bd3bbc0 (diff) |
Make ServerCommunicationErrorHandler more generic
Signed-off-by: Stefan Niedermann <info@niedermann.it>
Diffstat (limited to 'app/src/main/java')
-rw-r--r-- | app/src/main/java/it/niedermann/nextcloud/deck/api/ServerCommunicationErrorHandler.java | 47 |
1 files changed, 30 insertions, 17 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/api/ServerCommunicationErrorHandler.java b/app/src/main/java/it/niedermann/nextcloud/deck/api/ServerCommunicationErrorHandler.java index 1dfa0e706..7da0cf6c7 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/api/ServerCommunicationErrorHandler.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/api/ServerCommunicationErrorHandler.java @@ -4,38 +4,51 @@ import androidx.annotation.NonNull; import com.nextcloud.android.sso.exceptions.UnknownErrorException; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; import java.util.Objects; import it.niedermann.nextcloud.deck.exceptions.OfflineException; public class ServerCommunicationErrorHandler { + + private static final Handler[] handlers = new Handler[]{ + new Handler(UnknownErrorException.class, Arrays.asList("econnrefused", "connection refused"), OfflineException.Reason.CONNECTION_REFUSED), + new Handler(ClassNotFoundException.class, Collections.singletonList("connecttimeoutexception"), OfflineException.Reason.CONNECTION_TIMEOUT) + }; + public static Throwable translateError(Throwable error) { try { - if (error.getClass() == UnknownErrorException.class) { - return handleSsoExceptions((UnknownErrorException) error); - } else if (error.getClass() == ClassNotFoundException.class) { - return handleClassNotFoundError((ClassNotFoundException) error); - } else { - return error; + for (final var handler : handlers) { + if (error.getClass() == handler.originalExceptionType) { + return handler.handle(error); + } } + return error; } catch (NullPointerException e) { return error; } } - private static Throwable handleSsoExceptions(@NonNull UnknownErrorException error) { - final String message = Objects.requireNonNull(error.getMessage(), "SSO handler got no ExceptionMessage").toLowerCase(); - if (message.contains("econnrefused") || message.contains("connection refused")) { - return new OfflineException(OfflineException.Reason.CONNECTION_REFUSED); + private static class Handler { + private final Class<?> originalExceptionType; + private final Collection<String> indicators; + private final OfflineException.Reason reason; + + Handler(@NonNull Class<?> originalExceptionType, @NonNull Collection<String> indicators, @NonNull OfflineException.Reason reason) { + this.originalExceptionType = originalExceptionType; + this.indicators = indicators; + this.reason = reason; } - return error; - } - private static Throwable handleClassNotFoundError(@NonNull ClassNotFoundException error) { - final String message = Objects.requireNonNull(error.getMessage(), "ClassNotFound handler got no ExceptionMessage").toLowerCase(); - if (message.contains("connecttimeoutexception")) { - return new OfflineException(OfflineException.Reason.CONNECTION_TIMEOUT); + @NonNull + Throwable handle(@NonNull Throwable error) throws NullPointerException { + final String message = Objects.requireNonNull(error.getMessage(), "ExceptionMessage is null").toLowerCase(); + if (indicators.stream().anyMatch(message::contains)) { + return new OfflineException(reason); + } + return error; } - return error; } } |