use AbstractPlatformException as superclass for various exceptions

related to FINERACT-942 and as per code review discussion in PR #1079.
This commit is contained in:
Michael Vorburger
2020-06-30 21:28:20 +02:00
committed by Michael Vorburger ⛑️
parent 7a88f14eec
commit 56cad56848
10 changed files with 78 additions and 153 deletions
@@ -19,30 +19,12 @@
package org.apache.fineract.infrastructure.core.exception; package org.apache.fineract.infrastructure.core.exception;
/** /**
* A {@link RuntimeException} thrown when valid api request end up violating some domain rule. * A {@link RuntimeException} thrown when a valid API request ends up violating some domain rule.
*/ */
public abstract class AbstractPlatformDomainRuleException extends RuntimeException { public abstract class AbstractPlatformDomainRuleException extends AbstractPlatformException {
private final String globalisationMessageCode; protected AbstractPlatformDomainRuleException(String globalisationMessageCode, String defaultUserMessage,
private final String defaultUserMessage; Object... defaultUserMessageArgs) {
private final Object[] defaultUserMessageArgs; super(globalisationMessageCode, defaultUserMessage, defaultUserMessageArgs);
protected AbstractPlatformDomainRuleException(final String globalisationMessageCode, final String defaultUserMessage,
final Object... defaultUserMessageArgs) {
this.globalisationMessageCode = globalisationMessageCode;
this.defaultUserMessage = defaultUserMessage;
this.defaultUserMessageArgs = defaultUserMessageArgs;
}
public String getGlobalisationMessageCode() {
return this.globalisationMessageCode;
}
public String getDefaultUserMessage() {
return this.defaultUserMessage;
}
public Object[] getDefaultUserMessageArgs() {
return this.defaultUserMessageArgs;
} }
} }
@@ -21,9 +21,38 @@ package org.apache.fineract.infrastructure.core.exception;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public abstract class AbstractPlatformException { /**
* Exception with internationalization support (it's message can be translated).
*/
public abstract class AbstractPlatformException extends RuntimeException {
protected static Throwable findThrowableCause(Object[] defaultUserMessageArgs) { private static final Object[] NO_ARGS = new Object[0];
private final String globalisationMessageCode;
private final String defaultUserMessage;
private final Object[] defaultUserMessageArgs;
protected AbstractPlatformException(String globalisationMessageCode, String defaultUserMessage, Object[] defaultUserMessageArgs) {
super(findThrowableCause(defaultUserMessageArgs));
this.globalisationMessageCode = globalisationMessageCode;
this.defaultUserMessage = defaultUserMessage;
this.defaultUserMessageArgs = AbstractPlatformException.filterThrowableCause(defaultUserMessageArgs);
}
protected AbstractPlatformException(String globalisationMessageCode, String defaultUserMessage) {
this.globalisationMessageCode = globalisationMessageCode;
this.defaultUserMessage = defaultUserMessage;
this.defaultUserMessageArgs = NO_ARGS;
}
protected AbstractPlatformException(String globalisationMessageCode, String defaultUserMessage, Throwable cause) {
super(cause);
this.globalisationMessageCode = globalisationMessageCode;
this.defaultUserMessage = defaultUserMessage;
this.defaultUserMessageArgs = NO_ARGS;
}
private static Throwable findThrowableCause(Object[] defaultUserMessageArgs) {
for (Object defaultUserMessageArg : defaultUserMessageArgs) { for (Object defaultUserMessageArg : defaultUserMessageArgs) {
if (defaultUserMessageArg instanceof Throwable) { if (defaultUserMessageArg instanceof Throwable) {
return (Throwable) defaultUserMessageArg; return (Throwable) defaultUserMessageArg;
@@ -32,7 +61,7 @@ public abstract class AbstractPlatformException {
return null; return null;
} }
protected static Object[] filterThrowableCause(Object[] defaultUserMessageArgs) { private static Object[] filterThrowableCause(Object[] defaultUserMessageArgs) {
List<Object> filteredDefaultUserMessageArgs = new ArrayList<>(defaultUserMessageArgs.length); List<Object> filteredDefaultUserMessageArgs = new ArrayList<>(defaultUserMessageArgs.length);
for (Object defaultUserMessageArg : defaultUserMessageArgs) { for (Object defaultUserMessageArg : defaultUserMessageArgs) {
if (!(defaultUserMessageArg instanceof Throwable)) { if (!(defaultUserMessageArg instanceof Throwable)) {
@@ -42,4 +71,15 @@ public abstract class AbstractPlatformException {
return filteredDefaultUserMessageArgs.toArray(); return filteredDefaultUserMessageArgs.toArray();
} }
public final String getGlobalisationMessageCode() {
return this.globalisationMessageCode;
}
public final String getDefaultUserMessage() {
return this.defaultUserMessage;
}
public final Object[] getDefaultUserMessageArgs() {
return this.defaultUserMessageArgs;
}
} }
@@ -21,29 +21,10 @@ package org.apache.fineract.infrastructure.core.exception;
/** /**
* A {@link RuntimeException} thrown when resources that are queried for are not found. * A {@link RuntimeException} thrown when resources that are queried for are not found.
*/ */
public abstract class AbstractPlatformResourceNotFoundException extends RuntimeException { public abstract class AbstractPlatformResourceNotFoundException extends AbstractPlatformException {
private final String globalisationMessageCode;
private final String defaultUserMessage;
private final Object[] defaultUserMessageArgs;
protected AbstractPlatformResourceNotFoundException(final String globalisationMessageCode, final String defaultUserMessage, protected AbstractPlatformResourceNotFoundException(final String globalisationMessageCode, final String defaultUserMessage,
final Object... defaultUserMessageArgs) { final Object... defaultUserMessageArgs) {
super(AbstractPlatformException.findThrowableCause(defaultUserMessageArgs)); super(globalisationMessageCode, defaultUserMessage, defaultUserMessageArgs);
this.globalisationMessageCode = globalisationMessageCode;
this.defaultUserMessage = defaultUserMessage;
this.defaultUserMessageArgs = AbstractPlatformException.filterThrowableCause(defaultUserMessageArgs);
}
public String getGlobalisationMessageCode() {
return this.globalisationMessageCode;
}
public String getDefaultUserMessage() {
return this.defaultUserMessage;
}
public Object[] getDefaultUserMessageArgs() {
return this.defaultUserMessageArgs;
} }
} }
@@ -19,30 +19,12 @@
package org.apache.fineract.infrastructure.core.exception; package org.apache.fineract.infrastructure.core.exception;
/** /**
* A {@link RuntimeException} thrown when resources that are queried for are not found. * A {@link RuntimeException} thrown for cases such as 3rd-party external services that are not available.
*/ */
public abstract class AbstractPlatformServiceUnavailableException extends RuntimeException { public abstract class AbstractPlatformServiceUnavailableException extends AbstractPlatformException {
private final String globalisationMessageCode; protected AbstractPlatformServiceUnavailableException(String globalisationMessageCode, String defaultUserMessage,
private final String defaultUserMessage; Object... defaultUserMessageArgs) {
private final Object[] defaultUserMessageArgs; super(globalisationMessageCode, defaultUserMessage, defaultUserMessageArgs);
protected AbstractPlatformServiceUnavailableException(final String globalisationMessageCode, final String defaultUserMessage,
final Object... defaultUserMessageArgs) {
this.globalisationMessageCode = globalisationMessageCode;
this.defaultUserMessage = defaultUserMessage;
this.defaultUserMessageArgs = defaultUserMessageArgs;
}
public String getGlobalisationMessageCode() {
return this.globalisationMessageCode;
}
public String getDefaultUserMessage() {
return this.defaultUserMessage;
}
public Object[] getDefaultUserMessageArgs() {
return this.defaultUserMessageArgs;
} }
} }
@@ -23,8 +23,8 @@ package org.apache.fineract.infrastructure.core.exception;
*/ */
public final class GeneralPlatformDomainRuleException extends AbstractPlatformDomainRuleException { public final class GeneralPlatformDomainRuleException extends AbstractPlatformDomainRuleException {
public GeneralPlatformDomainRuleException(final String globalisationMessageCode, final String defaultUserMessage, public GeneralPlatformDomainRuleException(String globalisationMessageCode, String defaultUserMessage,
final Object... defaultUserMessageArgs) { Object... defaultUserMessageArgs) {
super(globalisationMessageCode, defaultUserMessage, defaultUserMessageArgs); super(globalisationMessageCode, defaultUserMessage, defaultUserMessageArgs);
} }
} }
@@ -20,8 +20,6 @@ package org.apache.fineract.infrastructure.core.exception;
/** /**
* A {@link RuntimeException} that is thrown in the case where invalid JSON is sent in the body of the request to the * A {@link RuntimeException} that is thrown in the case where invalid JSON is sent in the body of the request to the
* platform api. * platform API.
*/ */
public class InvalidJsonException extends RuntimeException { public class InvalidJsonException extends RuntimeException {}
//
}
@@ -24,46 +24,29 @@ import org.apache.fineract.infrastructure.core.data.ApiParameterError;
/** /**
* Exception thrown when problem with an API request to the platform. * Exception thrown when problem with an API request to the platform.
*/ */
public class PlatformApiDataValidationException extends RuntimeException { public class PlatformApiDataValidationException extends AbstractPlatformException {
private final String globalisationMessageCode;
private final String defaultUserMessage;
private final List<ApiParameterError> errors; private final List<ApiParameterError> errors;
public PlatformApiDataValidationException(final List<ApiParameterError> errors) { public PlatformApiDataValidationException(List<ApiParameterError> errors) {
this.globalisationMessageCode = "validation.msg.validation.errors.exist"; super("validation.msg.validation.errors.exist", "Validation errors exist.");
this.defaultUserMessage = "Validation errors exist.";
this.errors = errors;
}
public PlatformApiDataValidationException(final String globalisationMessageCode, final String defaultUserMessage,
final List<ApiParameterError> errors) {
this.globalisationMessageCode = globalisationMessageCode;
this.defaultUserMessage = defaultUserMessage;
this.errors = errors;
}
public PlatformApiDataValidationException(final String globalisationMessageCode, final String defaultUserMessage,
final List<ApiParameterError> errors, Throwable cause) {
super(cause);
this.globalisationMessageCode = globalisationMessageCode;
this.defaultUserMessage = defaultUserMessage;
this.errors = errors; this.errors = errors;
} }
public PlatformApiDataValidationException(final List<ApiParameterError> errors, Throwable cause) { public PlatformApiDataValidationException(final List<ApiParameterError> errors, Throwable cause) {
super(cause); super("validation.msg.validation.errors.exist", "Validation errors exist.", cause);
this.globalisationMessageCode = "validation.msg.validation.errors.exist";
this.defaultUserMessage = "Validation errors exist.";
this.errors = errors; this.errors = errors;
} }
public String getGlobalisationMessageCode() { public PlatformApiDataValidationException(String globalisationMessageCode, String defaultUserMessage, List<ApiParameterError> errors) {
return this.globalisationMessageCode; super(globalisationMessageCode, defaultUserMessage);
this.errors = errors;
} }
public String getDefaultUserMessage() { public PlatformApiDataValidationException(String globalisationMessageCode, String defaultUserMessage, List<ApiParameterError> errors,
return this.defaultUserMessage; Throwable cause) {
super(globalisationMessageCode, defaultUserMessage, cause);
this.errors = errors;
} }
public List<ApiParameterError> getErrors() { public List<ApiParameterError> getErrors() {
@@ -21,41 +21,20 @@ package org.apache.fineract.infrastructure.core.exception;
/** /**
* A {@link RuntimeException} thrown when data integrity problems happen due to state modifying actions. * A {@link RuntimeException} thrown when data integrity problems happen due to state modifying actions.
*/ */
public class PlatformDataIntegrityException extends RuntimeException { public class PlatformDataIntegrityException extends AbstractPlatformException {
private final String globalisationMessageCode;
private final String defaultUserMessage;
private final String parameterName; private final String parameterName;
private final Object[] defaultUserMessageArgs;
public PlatformDataIntegrityException(final String globalisationMessageCode, final String defaultUserMessage, public PlatformDataIntegrityException(final String globalisationMessageCode, final String defaultUserMessage,
final Object... defaultUserMessageArgs) { final Object... defaultUserMessageArgs) {
super(AbstractPlatformException.findThrowableCause(defaultUserMessageArgs)); super(globalisationMessageCode, defaultUserMessage, defaultUserMessageArgs);
this.globalisationMessageCode = globalisationMessageCode;
this.defaultUserMessage = defaultUserMessage;
this.parameterName = null; this.parameterName = null;
this.defaultUserMessageArgs = AbstractPlatformException.filterThrowableCause(defaultUserMessageArgs);
} }
public PlatformDataIntegrityException(final String globalisationMessageCode, final String defaultUserMessage, public PlatformDataIntegrityException(final String globalisationMessageCode, final String defaultUserMessage,
final String parameterName, final Object... defaultUserMessageArgs) { final String parameterName, final Object... defaultUserMessageArgs) {
super(AbstractPlatformException.findThrowableCause(defaultUserMessageArgs)); super(globalisationMessageCode, defaultUserMessage, defaultUserMessageArgs);
this.globalisationMessageCode = globalisationMessageCode;
this.defaultUserMessage = defaultUserMessage;
this.parameterName = parameterName; this.parameterName = parameterName;
this.defaultUserMessageArgs = AbstractPlatformException.filterThrowableCause(defaultUserMessageArgs);
}
public String getGlobalisationMessageCode() {
return this.globalisationMessageCode;
}
public String getDefaultUserMessage() {
return this.defaultUserMessage;
}
public Object[] getDefaultUserMessageArgs() {
return this.defaultUserMessageArgs;
} }
public String getParameterName() { public String getParameterName() {
@@ -21,28 +21,9 @@ package org.apache.fineract.infrastructure.core.exception;
/** /**
* A {@link RuntimeException} thrown when unexpected server side errors happen. * A {@link RuntimeException} thrown when unexpected server side errors happen.
*/ */
public class PlatformInternalServerException extends RuntimeException { public class PlatformInternalServerException extends AbstractPlatformException {
private final String globalisationMessageCode; public PlatformInternalServerException(String globalisationMessageCode, String defaultUserMessage, Object... defaultUserMessageArgs) {
private final String defaultUserMessage; super(globalisationMessageCode, defaultUserMessage, defaultUserMessageArgs);
private final Object[] defaultUserMessageArgs;
public PlatformInternalServerException(final String globalisationMessageCode, final String defaultUserMessage,
final Object... defaultUserMessageArgs) {
this.globalisationMessageCode = globalisationMessageCode;
this.defaultUserMessage = defaultUserMessage;
this.defaultUserMessageArgs = defaultUserMessageArgs;
}
public String getGlobalisationMessageCode() {
return this.globalisationMessageCode;
}
public String getDefaultUserMessage() {
return this.defaultUserMessage;
}
public Object[] getDefaultUserMessageArgs() {
return this.defaultUserMessageArgs;
} }
} }
@@ -20,9 +20,8 @@ package org.apache.fineract.infrastructure.core.exception;
public class PlatformServiceUnavailableException extends AbstractPlatformServiceUnavailableException { public class PlatformServiceUnavailableException extends AbstractPlatformServiceUnavailableException {
public PlatformServiceUnavailableException(final String globalisationMessageCode, final String defaultUserMessage, public PlatformServiceUnavailableException(String globalisationMessageCode, String defaultUserMessage,
final Object... defaultUserMessageArgs) { Object... defaultUserMessageArgs) {
super(globalisationMessageCode, defaultUserMessage, defaultUserMessageArgs); super(globalisationMessageCode, defaultUserMessage, defaultUserMessageArgs);
} }
} }