diff --git a/fineract-core/src/main/java/org/apache/fineract/accounting/closure/service/GLClosureWritePlatformServiceJpaRepositoryImpl.java b/fineract-core/src/main/java/org/apache/fineract/accounting/closure/service/GLClosureWritePlatformServiceJpaRepositoryImpl.java index 55764af8e..c60cf9ba6 100644 --- a/fineract-core/src/main/java/org/apache/fineract/accounting/closure/service/GLClosureWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-core/src/main/java/org/apache/fineract/accounting/closure/service/GLClosureWritePlatformServiceJpaRepositoryImpl.java @@ -35,7 +35,7 @@ import org.apache.fineract.accounting.closure.serialization.GLClosureCommandFrom import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.organisation.office.domain.Office; import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper; @@ -143,7 +143,7 @@ public class GLClosureWritePlatformServiceJpaRepositoryImpl implements GLClosure } log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.glClosure.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.glClosure.unknown.data.integrity.issue", "Unknown data integrity issue with resource GL Closure: " + realCause.getMessage()); } } diff --git a/fineract-core/src/main/java/org/apache/fineract/accounting/financialactivityaccount/service/FinancialActivityAccountWritePlatformServiceImpl.java b/fineract-core/src/main/java/org/apache/fineract/accounting/financialactivityaccount/service/FinancialActivityAccountWritePlatformServiceImpl.java index 84a406924..3f01e695d 100644 --- a/fineract-core/src/main/java/org/apache/fineract/accounting/financialactivityaccount/service/FinancialActivityAccountWritePlatformServiceImpl.java +++ b/fineract-core/src/main/java/org/apache/fineract/accounting/financialactivityaccount/service/FinancialActivityAccountWritePlatformServiceImpl.java @@ -36,9 +36,8 @@ import org.apache.fineract.accounting.glaccount.domain.GLAccountRepositoryWrappe import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.dao.NonTransientDataAccessException; import org.springframework.orm.jpa.JpaSystemException; import org.springframework.stereotype.Service; @@ -141,7 +140,7 @@ public class FinancialActivityAccountWritePlatformServiceImpl implements Financi } private void handleFinancialActivityAccountDataIntegrityIssues(final JsonCommand command, final Throwable realCause, - final NonTransientDataAccessException dve) { + final Exception dve) { if (realCause.getMessage().contains("financial_activity_type")) { final Integer financialActivityId = command .integerValueSansLocaleOfParameterNamed(FinancialActivityAccountsJsonInputParams.FINANCIAL_ACTIVITY_ID.getValue()); @@ -149,19 +148,7 @@ public class FinancialActivityAccountWritePlatformServiceImpl implements Financi } log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.glAccount.unknown.data.integrity.issue", - "Unknown data integrity issue with resource GL Account: " + realCause.getMessage()); - } - - private void handleFinancialActivityAccountDataIntegrityIssues(JsonCommand command, Throwable realCause, PersistenceException dve) { - if (realCause.getMessage().contains("financial_activity_type")) { - final Integer financialActivityId = command - .integerValueSansLocaleOfParameterNamed(FinancialActivityAccountsJsonInputParams.FINANCIAL_ACTIVITY_ID.getValue()); - throw new DuplicateFinancialActivityAccountFoundException(financialActivityId); - } - - log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.glAccount.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.glAccount.unknown.data.integrity.issue", "Unknown data integrity issue with resource GL Account: " + realCause.getMessage()); } diff --git a/fineract-core/src/main/java/org/apache/fineract/accounting/glaccount/service/GLAccountWritePlatformServiceJpaRepositoryImpl.java b/fineract-core/src/main/java/org/apache/fineract/accounting/glaccount/service/GLAccountWritePlatformServiceJpaRepositoryImpl.java index daa3f3798..23933693d 100644 --- a/fineract-core/src/main/java/org/apache/fineract/accounting/glaccount/service/GLAccountWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-core/src/main/java/org/apache/fineract/accounting/glaccount/service/GLAccountWritePlatformServiceJpaRepositoryImpl.java @@ -42,7 +42,7 @@ import org.apache.fineract.infrastructure.codes.domain.CodeValueRepositoryWrappe import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.dao.DataIntegrityViolationException; @@ -230,7 +230,7 @@ public class GLAccountWritePlatformServiceJpaRepositoryImpl implements GLAccount } LOG.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.glAccount.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.glAccount.unknown.data.integrity.issue", "Unknown data integrity issue with resource GL Account: " + realCause.getMessage()); } diff --git a/fineract-core/src/main/java/org/apache/fineract/batch/exception/ErrorInfo.java b/fineract-core/src/main/java/org/apache/fineract/batch/exception/ErrorInfo.java index 8512ea1cf..d4d2a3871 100644 --- a/fineract-core/src/main/java/org/apache/fineract/batch/exception/ErrorInfo.java +++ b/fineract-core/src/main/java/org/apache/fineract/batch/exception/ErrorInfo.java @@ -26,6 +26,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import org.apache.fineract.batch.domain.Header; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; /** * Provides members to hold the basic information about the exceptions raised in commandStrategy classes. diff --git a/fineract-core/src/main/java/org/apache/fineract/batch/service/BatchApiServiceImpl.java b/fineract-core/src/main/java/org/apache/fineract/batch/service/BatchApiServiceImpl.java index 834002fe0..66eb003ee 100644 --- a/fineract-core/src/main/java/org/apache/fineract/batch/service/BatchApiServiceImpl.java +++ b/fineract-core/src/main/java/org/apache/fineract/batch/service/BatchApiServiceImpl.java @@ -48,11 +48,11 @@ import org.apache.fineract.batch.domain.BatchRequest; import org.apache.fineract.batch.domain.BatchResponse; import org.apache.fineract.batch.domain.Header; import org.apache.fineract.batch.exception.BatchReferenceInvalidException; -import org.apache.fineract.batch.exception.ErrorHandler; import org.apache.fineract.batch.exception.ErrorInfo; import org.apache.fineract.batch.service.ResolutionHelper.BatchRequestNode; import org.apache.fineract.infrastructure.core.domain.BatchRequestContextHolder; import org.apache.fineract.infrastructure.core.exception.AbstractIdempotentCommandException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.filters.BatchCallHandler; import org.apache.fineract.infrastructure.core.filters.BatchFilter; import org.apache.fineract.infrastructure.core.filters.BatchRequestPreprocessor; diff --git a/fineract-core/src/main/java/org/apache/fineract/commands/service/CommandSourceService.java b/fineract-core/src/main/java/org/apache/fineract/commands/service/CommandSourceService.java index 3ac4e3382..dd4602fcd 100644 --- a/fineract-core/src/main/java/org/apache/fineract/commands/service/CommandSourceService.java +++ b/fineract-core/src/main/java/org/apache/fineract/commands/service/CommandSourceService.java @@ -21,13 +21,13 @@ package org.apache.fineract.commands.service; import static org.apache.fineract.commands.domain.CommandProcessingResultType.UNDER_PROCESSING; import lombok.RequiredArgsConstructor; -import org.apache.fineract.batch.exception.ErrorHandler; import org.apache.fineract.batch.exception.ErrorInfo; import org.apache.fineract.commands.domain.CommandSource; import org.apache.fineract.commands.domain.CommandSourceRepository; import org.apache.fineract.commands.domain.CommandWrapper; import org.apache.fineract.commands.exception.CommandNotFoundException; import org.apache.fineract.infrastructure.core.api.JsonCommand; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.useradministration.domain.AppUser; import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Component; diff --git a/fineract-core/src/main/java/org/apache/fineract/commands/service/SynchronousCommandProcessingService.java b/fineract-core/src/main/java/org/apache/fineract/commands/service/SynchronousCommandProcessingService.java index e45814a91..fa6a94f75 100644 --- a/fineract-core/src/main/java/org/apache/fineract/commands/service/SynchronousCommandProcessingService.java +++ b/fineract-core/src/main/java/org/apache/fineract/commands/service/SynchronousCommandProcessingService.java @@ -20,7 +20,6 @@ package org.apache.fineract.commands.service; import static org.apache.fineract.commands.domain.CommandProcessingResultType.ERROR; import static org.apache.fineract.commands.domain.CommandProcessingResultType.PROCESSED; -import static org.apache.fineract.commands.domain.CommandProcessingResultType.UNDER_PROCESSING; import static org.apache.http.HttpStatus.SC_OK; import com.google.gson.Gson; @@ -32,7 +31,6 @@ import java.util.HashMap; import java.util.Map; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.fineract.batch.exception.ErrorHandler; import org.apache.fineract.batch.exception.ErrorInfo; import org.apache.fineract.commands.domain.CommandProcessingResultType; import org.apache.fineract.commands.domain.CommandSource; @@ -47,6 +45,7 @@ import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.domain.BatchRequestContextHolder; import org.apache.fineract.infrastructure.core.domain.FineractRequestContextHolder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.IdempotentCommandProcessFailedException; import org.apache.fineract.infrastructure.core.exception.IdempotentCommandProcessSucceedException; import org.apache.fineract.infrastructure.core.exception.IdempotentCommandProcessUnderProcessingException; diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/AbstractPlatformException.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/AbstractPlatformException.java index 1439e5b1b..5b9a6fee5 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/AbstractPlatformException.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/AbstractPlatformException.java @@ -54,6 +54,9 @@ public abstract class AbstractPlatformException extends RuntimeException { } private static Throwable findThrowableCause(Object[] defaultUserMessageArgs) { + if (defaultUserMessageArgs == null) { + return null; + } for (Object defaultUserMessageArg : defaultUserMessageArgs) { if (defaultUserMessageArg instanceof Throwable) { return (Throwable) defaultUserMessageArg; diff --git a/fineract-core/src/main/java/org/apache/fineract/batch/exception/ErrorHandler.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/ErrorHandler.java similarity index 83% rename from fineract-core/src/main/java/org/apache/fineract/batch/exception/ErrorHandler.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/ErrorHandler.java index 0f3491120..207a5283e 100644 --- a/fineract-core/src/main/java/org/apache/fineract/batch/exception/ErrorHandler.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/ErrorHandler.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.fineract.batch.exception; +package org.apache.fineract.infrastructure.core.exception; import static org.springframework.core.ResolvableType.forClassWithGenerics; @@ -36,9 +36,8 @@ import lombok.extern.slf4j.Slf4j; import net.fortuna.ical4j.validate.ValidationException; import org.apache.commons.collections4.SetUtils; import org.apache.fineract.batch.domain.Header; +import org.apache.fineract.batch.exception.ErrorInfo; import org.apache.fineract.infrastructure.core.data.ApiParameterError; -import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.exceptionmapper.DefaultExceptionMapper; import org.apache.fineract.infrastructure.core.exceptionmapper.FineractExceptionMapper; import org.apache.fineract.infrastructure.core.serialization.GoogleGsonSerializerHelper; @@ -108,40 +107,45 @@ public final class ErrorHandler { return new ErrorInfo(response.getStatus(), errorCode, msg instanceof String ? (String) msg : JSON_HELPER.toJson(msg), batchHeaders); } - public RuntimeException getMappable(@NotNull Throwable thr) { + public static RuntimeException getMappable(@NotNull Throwable thr) { return getMappable(thr, null, null, null); } - public RuntimeException getMappable(@NotNull Throwable t, String msgCode, String defaultMsg, String param, + public static RuntimeException getMappable(@NotNull Throwable thr, String msgCode, String defaultMsg) { + return getMappable(thr, msgCode, defaultMsg, null); + } + + public static RuntimeException getMappable(@NotNull Throwable t, String msgCode, String defaultMsg, String param, final Object... defaultMsgArgs) { String msg = defaultMsg == null ? t.getMessage() : defaultMsg; - param = param == null ? "unknown" : param; + String codePfx = "error.msg" + (param == null ? "" : ("." + param)); + Object[] args = defaultMsgArgs == null ? new Object[] { t } : defaultMsgArgs; if (t instanceof NestedRuntimeException nre) { Throwable cause = nre.getMostSpecificCause(); - msg = cause.getMessage(); + msg = defaultMsg == null ? cause.getMessage() : defaultMsg; if (nre instanceof NonTransientDataAccessException) { - msgCode = msgCode == null ? "error.msg." + param + ".data.integrity.issue" : msgCode; - return new PlatformDataIntegrityException(msgCode, msg, param, defaultMsgArgs); + msgCode = msgCode == null ? codePfx + ".data.integrity.issue" : msgCode; + return new PlatformDataIntegrityException(msgCode, msg, param, args); } } if (t instanceof ValidationException) { - msgCode = msgCode == null ? "error.msg.validation." + param + ".error" : msgCode; + msgCode = msgCode == null ? codePfx + ".validation.error" : msgCode; return new PlatformApiDataValidationException(List.of(ApiParameterError.parameterError(msgCode, msg, param, defaultMsgArgs))); } if (t instanceof PersistenceException) { - msgCode = msgCode == null ? "error.msg.persistence." + param + ".error" : msgCode; - return new PlatformDataIntegrityException(msgCode, msg, param, defaultMsgArgs); + msgCode = msgCode == null ? codePfx + ".persistence.error" : msgCode; + return new PlatformDataIntegrityException(msgCode, msg, param, args); } if (t instanceof AuthenticationException) { - msgCode = msgCode == null ? "error.msg.authentication." + param + ".error" : msgCode; - return new PlatformDataIntegrityException(msgCode, msg, param, defaultMsgArgs); + msgCode = msgCode == null ? codePfx + ".authentication.error" : msgCode; + return new PlatformDataIntegrityException(msgCode, msg, param, args); } if (t instanceof RuntimeException re) { return re; } if (t instanceof ParseException) { - msgCode = msgCode == null ? "error.msg.parse." + param + ".error" : msgCode; - return new PlatformDataIntegrityException(msgCode, msg, param, defaultMsgArgs); + msgCode = msgCode == null ? codePfx + ".parse.error" : msgCode; + return new PlatformDataIntegrityException(msgCode, msg, param, args); } return new RuntimeException(msg, t); } diff --git a/fineract-core/src/test/java/org/apache/fineract/batch/exception/ErrorHandlerTest.java b/fineract-core/src/test/java/org/apache/fineract/batch/exception/ErrorHandlerTest.java index a06d42102..6bcb0675d 100644 --- a/fineract-core/src/test/java/org/apache/fineract/batch/exception/ErrorHandlerTest.java +++ b/fineract-core/src/test/java/org/apache/fineract/batch/exception/ErrorHandlerTest.java @@ -25,6 +25,7 @@ import jakarta.ws.rs.ext.ExceptionMapper; import java.util.InputMismatchException; import java.util.Map; import java.util.NoSuchElementException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exceptionmapper.DefaultExceptionMapper; import org.apache.fineract.infrastructure.core.exceptionmapper.FineractExceptionMapper; import org.junit.jupiter.api.Assertions; diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java index 93b441c1c..bfc192996 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java @@ -67,6 +67,7 @@ import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; @@ -618,7 +619,7 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa private PlatformDataIntegrityException handleJournalEntryDataIntegrityIssues(final Throwable realCause, final NonTransientDataAccessException dve) { log.error("Error occurred.", dve); - return new PlatformDataIntegrityException("error.msg.glJournalEntry.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.glJournalEntry.unknown.data.integrity.issue", "Unknown data integrity issue with resource Journal Entry: " + realCause.getMessage()); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/rule/service/AccountingRuleWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/rule/service/AccountingRuleWritePlatformServiceJpaRepositoryImpl.java index f466f804a..dd0c92313 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/rule/service/AccountingRuleWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/rule/service/AccountingRuleWritePlatformServiceJpaRepositoryImpl.java @@ -46,7 +46,7 @@ import org.apache.fineract.infrastructure.codes.exception.CodeValueNotFoundExcep import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.organisation.office.domain.Office; import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper; import org.springframework.dao.DataIntegrityViolationException; @@ -78,7 +78,7 @@ public class AccountingRuleWritePlatformServiceJpaRepositoryImpl implements Acco } log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.accounting.rule.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.accounting.rule.unknown.data.integrity.issue", "Unknown data integrity issue with resource Accounting Rule: " + realCause.getMessage()); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocWritePlatformServiceJpaRepositoryImpl.java index c436a20bb..8f2c34193 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocWritePlatformServiceJpaRepositoryImpl.java @@ -27,6 +27,7 @@ import org.apache.fineract.adhocquery.exception.AdHocNotFoundException; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.springframework.dao.DataIntegrityViolationException; @@ -67,16 +68,13 @@ public class AdHocWritePlatformServiceJpaRepositoryImpl implements AdHocWritePla */ private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final NonTransientDataAccessException dve) { - if (realCause.getMessage().contains("unq_name")) { - final String name = command.stringValueOfParameterNamed("name"); throw new PlatformDataIntegrityException("error.msg.adhocquery.duplicate.name", "AdHocQuery with name `" + name + "` already exists", "name", name); } - log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.adhocquery.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.adhocquery.unknown.data.integrity.issue", "Unknown data integrity issue with resource."); } @@ -119,8 +117,8 @@ public class AdHocWritePlatformServiceJpaRepositoryImpl implements AdHocWritePla this.adHocRepository.delete(adHoc); return new CommandProcessingResultBuilder().withEntityId(adHocId).build(); } catch (final JpaSystemException | DataIntegrityViolationException e) { - throw new PlatformDataIntegrityException("error.msg.unknown.data.integrity.issue", - "Unknown data integrity issue with resource: " + e.getMostSpecificCause(), e); + throw ErrorHandler.getMappable(e, "error.msg.unknown.data.integrity.issue", + "Unknown data integrity issue with resource: " + e.getMostSpecificCause()); } } @@ -140,8 +138,8 @@ public class AdHocWritePlatformServiceJpaRepositoryImpl implements AdHocWritePla return new CommandProcessingResultBuilder().withEntityId(adHocId).build(); } catch (final JpaSystemException | DataIntegrityViolationException e) { - throw new PlatformDataIntegrityException("error.msg.unknown.data.integrity.issue", - "Unknown data integrity issue with resource: " + e.getMostSpecificCause(), e); + throw ErrorHandler.getMappable(e, "error.msg.unknown.data.integrity.issue", + "Unknown data integrity issue with resource: " + e.getMostSpecificCause()); } } @@ -161,8 +159,8 @@ public class AdHocWritePlatformServiceJpaRepositoryImpl implements AdHocWritePla return new CommandProcessingResultBuilder().withEntityId(adHocId).build(); } catch (final JpaSystemException | DataIntegrityViolationException e) { - throw new PlatformDataIntegrityException("error.msg.unknown.data.integrity.issue", - "Unknown data integrity issue with resource: " + e.getMostSpecificCause(), e); + throw ErrorHandler.getMappable(e, "error.msg.unknown.data.integrity.issue", + "Unknown data integrity issue with resource: " + e.getMostSpecificCause()); } } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/DataIntegrityErrorHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/DataIntegrityErrorHandler.java index 4201812d8..4eb353698 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/DataIntegrityErrorHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/DataIntegrityErrorHandler.java @@ -20,6 +20,7 @@ package org.apache.fineract.infrastructure; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.api.JsonCommand; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.springframework.stereotype.Component; @@ -29,20 +30,13 @@ public class DataIntegrityErrorHandler { public void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve, final String msgType, final String msgDescription) { - if (realCause.getMessage().contains("external_id")) { - final String externalId = command.stringValueOfParameterNamed("externalId"); throw new PlatformDataIntegrityException("error.msg." + msgType + ".duplicate.externalId", msgDescription + ": externalId `" + externalId + "` already exists", "externalId", externalId); } - - logAsErrorUnexpectedDataIntegrityException(dve); - throw new PlatformDataIntegrityException("error.msg." + msgType + ".unknown.data.integrity.issue", + log.error("Error occured.", dve); + throw ErrorHandler.getMappable(dve, "error.msg." + msgType + ".unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + msgDescription); } - - private void logAsErrorUnexpectedDataIntegrityException(final Exception dve) { - log.error("Error occured.", dve); - } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/service/AccountNumberFormatWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/service/AccountNumberFormatWritePlatformServiceJpaRepositoryImpl.java index a4756e14f..a8fc22c88 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/service/AccountNumberFormatWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/service/AccountNumberFormatWritePlatformServiceJpaRepositoryImpl.java @@ -30,6 +30,7 @@ import org.apache.fineract.infrastructure.accountnumberformat.domain.EntityAccou import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -150,7 +151,6 @@ public class AccountNumberFormatWritePlatformServiceJpaRepositoryImpl implements */ private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { if (realCause.getMessage().contains(AccountNumberFormatConstants.ACCOUNT_TYPE_UNIQUE_CONSTRAINT_NAME)) { - final Integer accountTypeId = command.integerValueSansLocaleOfParameterNamed(AccountNumberFormatConstants.accountTypeParamName); final EntityAccountType entityAccountType = EntityAccountType.fromInt(accountTypeId); throw new PlatformDataIntegrityException(AccountNumberFormatConstants.EXCEPTION_DUPLICATE_ACCOUNT_TYPE, @@ -158,7 +158,7 @@ public class AccountNumberFormatWritePlatformServiceJpaRepositoryImpl implements entityAccountType.getValue(), entityAccountType.getCode()); } LOG.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.account.number.format.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.account.number.format.unknown.data.integrity.issue", "Unknown data integrity issue with resource."); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignWritePlatformCommandHandlerImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignWritePlatformCommandHandlerImpl.java index 5759c335a..3b206bc75 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignWritePlatformCommandHandlerImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignWritePlatformCommandHandlerImpl.java @@ -55,7 +55,7 @@ import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.api.JsonQuery; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.dataqueries.data.GenericResultsetData; @@ -453,8 +453,7 @@ public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampai private void handleDataIntegrityIssues(@SuppressWarnings("unused") final JsonCommand command, final Throwable realCause, final NonTransientDataAccessException dve) { - - throw new PlatformDataIntegrityException("error.msg.email.campaign.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.email.campaign.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailWritePlatformServiceJpaRepositoryImpl.java index 181f36a30..a4edc9e8c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailWritePlatformServiceJpaRepositoryImpl.java @@ -27,6 +27,7 @@ import org.apache.fineract.infrastructure.campaigns.email.domain.EmailMessageRep import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -119,14 +120,13 @@ public class EmailWritePlatformServiceJpaRepositoryImpl implements EmailWritePla */ private void handleDataIntegrityIssues(@SuppressWarnings("unused") final JsonCommand command, final Throwable realCause, final NonTransientDataAccessException dve) { - if (realCause.getMessage().contains("email_address")) { throw new PlatformDataIntegrityException("error.msg.email.no.email.address.exists", "The group, client or staff provided has no email address.", "id"); } LOG.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.email.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.email.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignWritePlatformServiceJpaImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignWritePlatformServiceJpaImpl.java index 64e8aeec3..baa07bbb2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignWritePlatformServiceJpaImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignWritePlatformServiceJpaImpl.java @@ -53,8 +53,8 @@ import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.api.JsonQuery; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.dataqueries.data.GenericResultsetData; @@ -544,7 +544,7 @@ public class SmsCampaignWritePlatformServiceJpaImpl implements SmsCampaignWriteP } private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause) { - throw new PlatformDataIntegrityException("error.msg.sms.campaign.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(realCause, "error.msg.sms.campaign.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/service/CodeValueWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/service/CodeValueWritePlatformServiceJpaRepositoryImpl.java index bbd83ba54..093e2ea6c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/service/CodeValueWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/service/CodeValueWritePlatformServiceJpaRepositoryImpl.java @@ -29,6 +29,7 @@ import org.apache.fineract.infrastructure.codes.serialization.CodeValueCommandFr import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.slf4j.Logger; @@ -104,7 +105,7 @@ public class CodeValueWritePlatformServiceJpaRepositoryImpl implements CodeValue } LOG.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.code.value.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.code.value.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } @@ -167,8 +168,8 @@ public class CodeValueWritePlatformServiceJpaRepositoryImpl implements CodeValue if (realCause.getMessage().contains("code_value")) { throw new PlatformDataIntegrityException("error.msg.codeValue.in.use", "This code value is in use", codeValueId, dve); } - throw new PlatformDataIntegrityException("error.msg.code.value.unknown.data.integrity.issue", - "Unknown data integrity issue with resource: " + dve.getMostSpecificCause().getMessage(), dve); + throw ErrorHandler.getMappable(dve, "error.msg.code.value.unknown.data.integrity.issue", + "Unknown data integrity issue with resource: " + realCause.getMessage()); } } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/service/CodeWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/service/CodeWritePlatformServiceJpaRepositoryImpl.java index 383ec6c8b..c83c17816 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/service/CodeWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/service/CodeWritePlatformServiceJpaRepositoryImpl.java @@ -29,6 +29,7 @@ import org.apache.fineract.infrastructure.codes.serialization.CodeCommandFromApi import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.slf4j.Logger; @@ -129,8 +130,8 @@ public class CodeWritePlatformServiceJpaRepositoryImpl implements CodeWritePlatf this.codeRepository.delete(code); this.codeRepository.flush(); } catch (final JpaSystemException | DataIntegrityViolationException dve) { - throw new PlatformDataIntegrityException("error.msg.cund.unknown.data.integrity.issue", - "Unknown data integrity issue with resource: " + dve.getMostSpecificCause(), dve); + throw ErrorHandler.getMappable(dve, "error.msg.cund.unknown.data.integrity.issue", + "Unknown data integrity issue with resource: " + dve.getMostSpecificCause().getMessage()); } return new CommandProcessingResultBuilder().withEntityId(codeId).build(); } @@ -150,7 +151,7 @@ public class CodeWritePlatformServiceJpaRepositoryImpl implements CodeWritePlatf } LOG.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.cund.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.cund.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/service/GlobalConfigurationWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/service/GlobalConfigurationWritePlatformServiceJpaRepositoryImpl.java index fafd51a6e..4beaba349 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/service/GlobalConfigurationWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/service/GlobalConfigurationWritePlatformServiceJpaRepositoryImpl.java @@ -27,7 +27,7 @@ import org.apache.fineract.infrastructure.configuration.domain.GlobalConfigurati import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -90,9 +90,8 @@ public class GlobalConfigurationWritePlatformServiceJpaRepositoryImpl implements * Guaranteed to throw an exception no matter what the data integrity issue is. */ private void handleDataIntegrityIssues(final Throwable realCause, final NonTransientDataAccessException dve) { - LOG.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.globalConfiguration.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.globalConfiguration.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/service/CreditBureauConfigurationWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/service/CreditBureauConfigurationWritePlatformServiceImpl.java index ac8ac7fe3..aae67dbc3 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/service/CreditBureauConfigurationWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/service/CreditBureauConfigurationWritePlatformServiceImpl.java @@ -22,7 +22,7 @@ import java.util.Map; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.creditbureau.domain.CreditBureauConfiguration; import org.apache.fineract.infrastructure.creditbureau.domain.CreditBureauConfigurationRepository; import org.apache.fineract.infrastructure.creditbureau.domain.OrganisationCreditBureau; @@ -97,8 +97,8 @@ public class CreditBureauConfigurationWritePlatformServiceImpl implements Credit .build(); } catch (final JpaSystemException | DataIntegrityViolationException dve) { - throw new PlatformDataIntegrityException("error.msg.cund.unknown.data.integrity.issue", - "Unknown data integrity issue with resource: " + dve.getMostSpecificCause(), dve); + throw ErrorHandler.getMappable(dve, "error.msg.cund.unknown.data.integrity.issue", + "Unknown data integrity issue with resource: " + dve.getMostSpecificCause().getMessage()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/service/CreditReportWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/service/CreditReportWritePlatformServiceImpl.java index eced684d6..0c7aebbe8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/service/CreditReportWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/service/CreditReportWritePlatformServiceImpl.java @@ -32,8 +32,8 @@ import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.creditbureau.data.CreditBureauConfigurations; import org.apache.fineract.infrastructure.creditbureau.data.CreditBureauReportData; import org.apache.fineract.infrastructure.creditbureau.domain.CreditBureau; @@ -202,18 +202,15 @@ public class CreditReportWritePlatformServiceImpl implements CreditReportWritePl try { this.creditReportRepository.delete(creditReport); } catch (final JpaSystemException | DataIntegrityViolationException dve) { - throw new PlatformDataIntegrityException("error.msg.cund.unknown.data.integrity.issue", - "Unknown data integrity issue with resource: " + dve.getMostSpecificCause(), dve); + throw ErrorHandler.getMappable(dve, "error.msg.cund.unknown.data.integrity.issue", + "Unknown data integrity issue with resource: " + dve.getMostSpecificCause().getMessage()); } } return new CommandProcessingResultBuilder().withEntityId(creditReport.getId()).build(); } private void handleTokenDataIntegrityIssues(final Throwable realCause) { - - throw new PlatformDataIntegrityException("error.msg.cund.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(realCause, "error.msg.cund.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); - } - } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/EntityDatatableChecksWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/EntityDatatableChecksWritePlatformServiceImpl.java index e943d0677..cce138b0e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/EntityDatatableChecksWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/EntityDatatableChecksWritePlatformServiceImpl.java @@ -32,8 +32,8 @@ import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; import org.apache.fineract.infrastructure.dataqueries.data.DatatableData; import org.apache.fineract.infrastructure.dataqueries.data.EntityTables; @@ -133,8 +133,7 @@ public class EntityDatatableChecksWritePlatformServiceImpl implements EntityData handleReportDataIntegrityIssues(command, e.getMostSpecificCause(), e); return CommandProcessingResult.empty(); } catch (final PersistenceException dve) { - Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()); - handleReportDataIntegrityIssues(command, throwable, dve); + handleReportDataIntegrityIssues(command, ExceptionUtils.getRootCause(dve.getCause()), dve); return CommandProcessingResult.empty(); } } @@ -253,23 +252,28 @@ public class EntityDatatableChecksWritePlatformServiceImpl implements EntityData * Guaranteed to throw an exception no matter what the data integrity issue is. */ private void handleReportDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dae) { - - if (realCause.getMessage().contains("FOREIGN KEY (x_registered_table_name)")) { + String msgCode = "error.msg.entityDatatableCheck"; + Throwable checkEx = realCause == null ? dae : realCause; + String msg = "Unknown data integrity issue with resource: " + checkEx.getMessage(); + String param = null; + Object[] msgArgs; + if (checkEx.getMessage().contains("FOREIGN KEY (x_registered_table_name)")) { final String datatableName = command.stringValueOfParameterNamed("datatableName"); - throw new PlatformDataIntegrityException("error.msg.entityDatatableCheck.foreign.key.constraint", - "datatable with name '" + datatableName + "' do not exist", "datatableName", datatableName); - } - - if (realCause.getMessage().contains("unique_entity_check")) { + msgCode += ".foreign.key.constraint"; + msg = "Datatable with name '" + datatableName + "' does not exist"; + param = "datatableName"; + msgArgs = new Object[] { datatableName, dae }; + } else if (checkEx.getMessage().contains("unique_entity_check")) { final String datatableName = command.stringValueOfParameterNamed("datatableName"); final long status = command.longValueOfParameterNamed("status"); final String entity = command.stringValueOfParameterNamed("entity"); final long productId = command.longValueOfParameterNamed("productId"); throw new EntityDatatableCheckAlreadyExistsException(entity, status, datatableName, productId); + } else { + msgCode += ".unknown.data.integrity.issue"; + msgArgs = new Object[] { dae }; } - log.error("Error occured.", dae); - throw new PlatformDataIntegrityException("error.msg.report.unknown.data.integrity.issue", - "Unknown data integrity issue with resource: " + realCause.getMessage()); + throw ErrorHandler.getMappable(dae, msgCode, msg, param, msgArgs); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/GenericDataServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/GenericDataServiceImpl.java index 9e58f044f..18ab98188 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/GenericDataServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/GenericDataServiceImpl.java @@ -36,7 +36,7 @@ import java.util.ArrayList; import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.service.database.DatabaseIndependentQueryService; import org.apache.fineract.infrastructure.core.service.database.DatabaseType; import org.apache.fineract.infrastructure.core.service.database.DatabaseTypeResolver; @@ -88,7 +88,7 @@ public class GenericDataServiceImpl implements GenericDataService { return new GenericResultsetData(columnHeaders, resultsetDataRows); } catch (DataAccessException e) { log.error("Reporting error: {}", e.getMessage()); - throw new PlatformDataIntegrityException("error.msg.report.unknown.data.integrity.issue", e.getClass().getName(), e); + throw ErrorHandler.getMappable(e, "error.msg.report.unknown.data.integrity.issue", e.getClass().getName(), null, e); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java index 16fa4b5f0..d116e1a15 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java @@ -45,7 +45,7 @@ import org.apache.commons.csv.CSVPrinter; import org.apache.commons.lang3.StringUtils; import org.apache.fineract.infrastructure.core.config.FineractProperties; import org.apache.fineract.infrastructure.core.domain.JdbcSupport; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.service.database.DatabaseSpecificSQLGenerator; import org.apache.fineract.infrastructure.core.service.database.JdbcJavaType; import org.apache.fineract.infrastructure.dataqueries.data.GenericResultsetData; @@ -86,7 +86,7 @@ public class ReadReportingServiceImpl implements ReadReportingService { final GenericResultsetData result = retrieveGenericResultset(name, type, queryParams, isSelfServiceUserReport); generateCsvFileBuffer(result, out); } catch (final Exception e) { - throw new PlatformDataIntegrityException("error.msg.exception.error", e.getMessage(), e); + throw ErrorHandler.getMappable(e); } }; } @@ -255,7 +255,7 @@ public class ReadReportingServiceImpl implements ReadReportingService { return genaratePdf; } catch (final Exception e) { log.error("error.msg.reporting.error:", e); - throw new PlatformDataIntegrityException("error.msg.exception.error", e.getMessage(), e); + throw ErrorHandler.getMappable(e); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java index 205fdfef7..022ad5ee6 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java @@ -79,6 +79,7 @@ import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.exception.PlatformServiceUnavailableException; @@ -394,28 +395,10 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ } } catch (final JpaSystemException | DataIntegrityViolationException dve) { - final Throwable cause = dve.getCause(); - final Throwable realCause = dve.getMostSpecificCause(); - // even if duplicate is only due to permission duplicate, okay to - // show duplicate datatable error msg - if (realCause.getMessage().contains("Duplicate entry") || cause.getMessage().contains("Duplicate entry")) { - throw new PlatformDataIntegrityException("error.msg.datatable.registered", - "Datatable `" + dataTableName + "` is already registered against an application table.", API_PARAM_DATATABLE_NAME, - dataTableName, dve); - } - logAsErrorUnexpectedDataIntegrityException(dve); - throw new PlatformDataIntegrityException("error.msg.unknown.data.integrity.issue", - "Unknown data integrity issue with resource.", dve); + handleDataIntegrityIssues(dataTableName, null, dve.getMostSpecificCause(), dve); } catch (final PersistenceException dve) { - final Throwable cause = dve.getCause(); - if (cause.getMessage().contains("Duplicate entry")) { - throw new PlatformDataIntegrityException("error.msg.datatable.registered", - "Datatable `" + dataTableName + "` is already registered against an application table.", API_PARAM_DATATABLE_NAME, - dataTableName, dve); - } - logAsErrorUnexpectedDataIntegrityException(dve); - throw new PlatformDataIntegrityException("error.msg.unknown.data.integrity.issue", - "Unknown data integrity issue with resource.", dve); + handleDataIntegrityIssues(dataTableName, null, ExceptionUtils.getRootCause(dve.getCause()), dve); + } } @@ -1353,41 +1336,11 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ } return CommandProcessingResult.fromCommandProcessingResult(commandProcessingResult, resourceId); } catch (final DataAccessException dve) { - final Throwable cause = dve.getCause(); - final Throwable realCause = dve.getMostSpecificCause(); - if (realCause.getMessage().contains("Duplicate entry") || cause.getMessage().contains("Duplicate entry")) { - throw new PlatformDataIntegrityException( - "error.msg.datatable.entry.duplicate", "An entry already exists for datatable `" + dataTableName - + "` and application table with identifier `" + appTableId + "`.", - API_PARAM_DATATABLE_NAME, dataTableName, appTableId, dve); - } else if (realCause.getMessage().contains("doesn't have a default value") - || cause.getMessage().contains("doesn't have a default value")) { - throw new PlatformDataIntegrityException( - "error.msg.datatable.no.value.provided.for.required.fields", "No values provided for the datatable `" - + dataTableName + "` and application table with identifier `" + appTableId + "`.", - API_PARAM_DATATABLE_NAME, dataTableName, appTableId, dve); - } - - logAsErrorUnexpectedDataIntegrityException(dve); - throw new PlatformDataIntegrityException("error.msg.unknown.data.integrity.issue", - "Unknown data integrity issue with resource.", dve); + handleDataIntegrityIssues(dataTableName, appTableId, dve.getMostSpecificCause(), dve); + return CommandProcessingResult.empty(); } catch (final PersistenceException e) { - final Throwable cause = e.getCause(); - if (cause.getMessage().contains("Duplicate entry")) { - throw new PlatformDataIntegrityException( - "error.msg.datatable.entry.duplicate", "An entry already exists for datatable `" + dataTableName - + "` and application table with identifier `" + appTableId + "`.", - API_PARAM_DATATABLE_NAME, dataTableName, appTableId, e); - } else if (cause.getMessage().contains("doesn't have a default value")) { - throw new PlatformDataIntegrityException( - "error.msg.datatable.no.value.provided.for.required.fields", "No values provided for the datatable `" - + dataTableName + "` and application table with identifier `" + appTableId + "`.", - API_PARAM_DATATABLE_NAME, dataTableName, appTableId, e); - } - - logAsErrorUnexpectedDataIntegrityException(e); - throw new PlatformDataIntegrityException("error.msg.unknown.data.integrity.issue", - "Unknown data integrity issue with resource.", e); + handleDataIntegrityIssues(dataTableName, appTableId, ExceptionUtils.getRootCause(e.getCause()), e); + return CommandProcessingResult.empty(); } } @@ -1785,7 +1738,36 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ return code + "_cd_" + columnName; } - private void logAsErrorUnexpectedDataIntegrityException(final Exception dve) { - log.error("Error occurred.", dve); + private void handleDataIntegrityIssues(String dataTableName, Long appTableId, final Throwable realCause, final Exception e) { + String msgCode = "error.msg.datatable"; + String msg = "Unknown data integrity issue with datatable `" + dataTableName + "`"; + String param = null; + Object[] msgArgs; + final Throwable cause = e.getCause(); + if ((realCause != null && realCause.getMessage().contains("Duplicate entry")) + || (cause != null && cause.getMessage().contains("Duplicate entry"))) { + msgCode += ".entry.duplicate"; + param = API_PARAM_DATATABLE_NAME; + if (appTableId == null) { + msg = "Datatable `" + dataTableName + "` is already registered against an application table."; + msgArgs = new Object[] { dataTableName, e }; + } else { + msg = "An entry already exists for datatable `" + dataTableName + "` and application table with identifier `" + appTableId + + "`."; + msgArgs = new Object[] { dataTableName, appTableId, e }; + } + } else if ((realCause != null && realCause.getMessage().contains("doesn't have a default value")) + || (cause != null && cause.getMessage().contains("doesn't have a default value"))) { + msgCode += ".no.value.provided.for.required.fields"; + msg = "No values provided for the datatable `" + dataTableName + "` and application table with identifier `" + appTableId + + "`."; + param = API_PARAM_DATATABLE_NAME; + msgArgs = new Object[] { dataTableName, appTableId, e }; + } else { + msgCode += ".unknown.data.integrity.issue"; + msgArgs = new Object[] { dataTableName, e }; + } + log.error("Error occured.", e); + throw ErrorHandler.getMappable(e, msgCode, msg, param, msgArgs); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReportWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReportWritePlatformServiceImpl.java index 6e25111b6..6e42ffb48 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReportWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReportWritePlatformServiceImpl.java @@ -29,6 +29,7 @@ import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.dataqueries.domain.Report; import org.apache.fineract.infrastructure.dataqueries.domain.ReportParameter; @@ -179,7 +180,6 @@ public class ReportWritePlatformServiceImpl implements ReportWritePlatformServic * Guaranteed to throw an exception no matter what the data integrity issue is. */ private void handleReportDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { - if (realCause.getMessage().contains("unq_report_name") || realCause.getMessage().contains("report_name_UNIQUE")) { final String name = command.stringValueOfParameterNamed("reportName"); throw new PlatformDataIntegrityException("error.msg.report.duplicate.name", "A report with name '" + name + "' already exists", @@ -187,7 +187,7 @@ public class ReportWritePlatformServiceImpl implements ReportWritePlatformServic } LOG.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.report.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.report.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformServiceJpaRepositoryImpl.java index 2ceb1df73..14501bb30 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformServiceJpaRepositoryImpl.java @@ -20,7 +20,7 @@ package org.apache.fineract.infrastructure.documentmanagement.service; import java.io.InputStream; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.documentmanagement.command.DocumentCommand; import org.apache.fineract.infrastructure.documentmanagement.command.DocumentCommandValidator; import org.apache.fineract.infrastructure.documentmanagement.contentrepository.ContentRepository; @@ -82,8 +82,8 @@ public class DocumentWritePlatformServiceJpaRepositoryImpl implements DocumentWr return document.getId(); } catch (final JpaSystemException | DataIntegrityViolationException dve) { LOG.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.document.unknown.data.integrity.issue", - "Unknown data integrity issue with resource.", dve); + throw ErrorHandler.getMappable(dve, "error.msg.document.unknown.data.integrity.issue", + "Unknown data integrity issue with resource."); } } @@ -136,8 +136,8 @@ public class DocumentWritePlatformServiceJpaRepositoryImpl implements DocumentWr return CommandProcessingResult.resourceResult(documentForUpdate.getId()); } catch (final JpaSystemException | DataIntegrityViolationException dve) { LOG.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.document.unknown.data.integrity.issue", - "Unknown data integrity issue with resource.", dve); + throw ErrorHandler.getMappable(dve, "error.msg.document.unknown.data.integrity.issue", + "Unknown data integrity issue with resource."); } catch (final ContentManagementException cme) { LOG.error("Error occured.", cme); throw new ContentManagementException(documentCommand.getName(), cme.getMessage(), cme); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/entityaccess/service/FineractEntityAccessWriteServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/entityaccess/service/FineractEntityAccessWriteServiceImpl.java index f83009e38..a0b1ce676 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/entityaccess/service/FineractEntityAccessWriteServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/entityaccess/service/FineractEntityAccessWriteServiceImpl.java @@ -26,6 +26,7 @@ import org.apache.fineract.infrastructure.codes.domain.CodeValue; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.entityaccess.api.FineractEntityApiResourceConstants; @@ -171,12 +172,8 @@ public class FineractEntityAccessWriteServiceImpl implements FineractEntityAcces "EntityMapping from " + fromId + " to " + toId + " already exist"); } - logAsErrorUnexpectedDataIntegrityException(dve); - throw new PlatformDataIntegrityException("error.msg.entity.mapping", "Unknown data integrity issue with resource."); - } - - private void logAsErrorUnexpectedDataIntegrityException(final Exception dve) { LOG.error("Error occured.", dve); + throw ErrorHandler.getMappable(dve, "error.msg.entity.mapping", "Unknown data integrity issue with resource."); } /* @@ -186,5 +183,4 @@ public class FineractEntityAccessWriteServiceImpl implements FineractEntityAcces * @Override public CommandProcessingResult removeEntityAccess(String entityType, Long entityId, Long accessType, * String secondEntityType, Long secondEntityId) { // TODO Auto-generated method stub return null; } */ - } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/gcm/service/DeviceRegistrationWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/gcm/service/DeviceRegistrationWritePlatformServiceImpl.java index 231cd9cdc..09d54481e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/gcm/service/DeviceRegistrationWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/gcm/service/DeviceRegistrationWritePlatformServiceImpl.java @@ -21,6 +21,7 @@ package org.apache.fineract.infrastructure.gcm.service; import jakarta.persistence.EntityExistsException; import jakarta.persistence.PersistenceException; import org.apache.commons.lang3.exception.ExceptionUtils; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.gcm.domain.DeviceRegistration; @@ -77,13 +78,11 @@ public class DeviceRegistrationWritePlatformServiceImpl implements DeviceRegistr } private void handleDataIntegrityIssues(final String registrationId, final Throwable realCause) { - if (realCause.getMessage().contains("registration_key")) { throw new PlatformDataIntegrityException("error.msg.duplicate.device.registration.id", "Registration id : " + registrationId + " already exist.", "name", registrationId); } - - throw new PlatformDataIntegrityException("error.msg.charge.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(realCause, "error.msg.charge.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/service/HookWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/service/HookWritePlatformServiceJpaRepositoryImpl.java index fbf988506..418beb2a4 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/service/HookWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/service/HookWritePlatformServiceJpaRepositoryImpl.java @@ -44,6 +44,7 @@ import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; @@ -309,8 +310,7 @@ public class HookWritePlatformServiceJpaRepositoryImpl implements HookWritePlatf throw new PlatformDataIntegrityException("error.msg.hook.duplicate.name", "A hook with name '" + name + "' already exists", "name", name); } - - throw new PlatformDataIntegrityException("error.msg.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/service/ReportMailingJobWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/service/ReportMailingJobWritePlatformServiceImpl.java index 57abc71f3..0b261b101 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/service/ReportMailingJobWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/service/ReportMailingJobWritePlatformServiceImpl.java @@ -25,6 +25,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.dataqueries.domain.Report; @@ -236,7 +237,6 @@ public class ReportMailingJobWritePlatformServiceImpl implements ReportMailingJo **/ private void handleDataIntegrityIssues(final JsonCommand jsonCommand, final Throwable realCause, final NonTransientDataAccessException dve) { - if (realCause.getMessage().contains(ReportMailingJobConstants.NAME_PARAM_NAME)) { final String name = jsonCommand.stringValueOfParameterNamed(ReportMailingJobConstants.NAME_PARAM_NAME); throw new PlatformDataIntegrityException("error.msg.report.mailing.job.duplicate.name", @@ -244,8 +244,7 @@ public class ReportMailingJobWritePlatformServiceImpl implements ReportMailingJo } LOG.error("Error occured.", dve); - - throw new PlatformDataIntegrityException("error.msg.charge.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.charge.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/service/SmsWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/service/SmsWritePlatformServiceJpaRepositoryImpl.java index c2458c44b..8bf83d0a9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/service/SmsWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/service/SmsWritePlatformServiceJpaRepositoryImpl.java @@ -22,6 +22,7 @@ import java.util.Map; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.sms.data.SmsDataValidator; import org.apache.fineract.infrastructure.sms.domain.SmsMessage; @@ -126,14 +127,13 @@ public class SmsWritePlatformServiceJpaRepositoryImpl implements SmsWritePlatfor */ private void handleDataIntegrityIssues(@SuppressWarnings("unused") final JsonCommand command, final Throwable realCause, final NonTransientDataAccessException dve) { - if (realCause.getMessage().contains("mobile_no")) { throw new PlatformDataIntegrityException("error.msg.sms.no.mobile.no.exists", "The group, client or staff provided has no mobile no.", "id"); } LOG.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.sms.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.sms.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/survey/service/WriteLikelihoodServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/survey/service/WriteLikelihoodServiceImpl.java index f385497ab..915c37152 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/survey/service/WriteLikelihoodServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/survey/service/WriteLikelihoodServiceImpl.java @@ -22,7 +22,7 @@ import java.util.List; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.infrastructure.survey.data.LikelihoodDataValidator; import org.apache.fineract.infrastructure.survey.data.LikelihoodStatus; @@ -96,9 +96,8 @@ public class WriteLikelihoodServiceImpl implements WriteLikelihoodService { * Guaranteed to throw an exception no matter what the data integrity issue is. */ private void handleDataIntegrityIssues(final Throwable realCause, final NonTransientDataAccessException dve) { - LOG.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.likelihood.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.likelihood.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropServiceImpl.java index 7b884d4fd..2cae4bb34 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropServiceImpl.java @@ -47,6 +47,7 @@ import org.apache.fineract.commands.service.CommandWrapperBuilder; import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer; import org.apache.fineract.infrastructure.core.service.DateUtils; @@ -624,7 +625,6 @@ public class InteropServiceImpl implements InteropService { */ private void handleInteropDataIntegrityIssues(InteropIdentifierType idType, String accountId, final Throwable realCause, final Exception dve) { - if (realCause.getMessage().contains("uk_interop_identifier_account")) { throw new PlatformDataIntegrityException("error.msg.interop.duplicate.account.identifier", "Account identifier of type `" + idType.name() + "' already exists for account with externalId `" + accountId + "`", @@ -632,8 +632,8 @@ public class InteropServiceImpl implements InteropService { } log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.interop.unknown.data.integrity.issue", - "Unknown data integrity issue with resource."); + throw ErrorHandler.getMappable(dve, "error.msg.interop.unknown.data.integrity.issue", + "Unknown data integrity issue with resource: " + realCause.getMessage()); } @NotNull diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/service/HolidayWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/service/HolidayWritePlatformServiceJpaRepositoryImpl.java index 22d0acc02..f29c61fb4 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/service/HolidayWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/service/HolidayWritePlatformServiceJpaRepositoryImpl.java @@ -33,6 +33,7 @@ import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; import org.apache.fineract.infrastructure.core.service.DateUtils; @@ -170,8 +171,8 @@ public class HolidayWritePlatformServiceJpaRepositoryImpl implements HolidayWrit } log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.office.unknown.data.integrity.issue", - "Unknown data integrity issue with resource."); + throw ErrorHandler.getMappable(dve, "error.msg.office.unknown.data.integrity.issue", + "Unknown data integrity issue with resource: " + realCause.getMessage()); } private void validateInputDates(final JsonCommand command) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java index 4373e657f..edc4180c1 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/service/OfficeWritePlatformServiceJpaRepositoryImpl.java @@ -26,6 +26,7 @@ import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.security.exception.NoAuthorizationException; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; @@ -204,7 +205,6 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl implements OfficeWriteP * Guaranteed to throw an exception no matter what the data integrity issue is. */ private void handleOfficeDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { - if (realCause.getMessage().contains("externalid_org")) { final String externalId = command.stringValueOfParameterNamed("externalId"); throw new PlatformDataIntegrityException("error.msg.office.duplicate.externalId", @@ -216,8 +216,7 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl implements OfficeWriteP } log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.office.unknown.data.integrity.issue", - "Unknown data integrity issue with resource."); + throw ErrorHandler.getMappable(dve, "error.msg.office.unknown.data.integrity.issue", "Unknown data integrity issue with resource."); } /* diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/service/ProvisioningCategoryWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/service/ProvisioningCategoryWritePlatformServiceJpaRepositoryImpl.java index 6d089d297..c1f7b676b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/service/ProvisioningCategoryWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/service/ProvisioningCategoryWritePlatformServiceJpaRepositoryImpl.java @@ -26,6 +26,7 @@ import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.organisation.provisioning.domain.ProvisioningCategory; import org.apache.fineract.organisation.provisioning.domain.ProvisioningCategoryRepository; @@ -33,7 +34,6 @@ import org.apache.fineract.organisation.provisioning.exception.ProvisioningCateg import org.apache.fineract.organisation.provisioning.exception.ProvisioningCategoryNotFoundException; import org.apache.fineract.organisation.provisioning.serialization.ProvisioningCategoryDefinitionJsonDeserializer; import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.dao.NonTransientDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.orm.jpa.JpaSystemException; @@ -108,29 +108,14 @@ public class ProvisioningCategoryWritePlatformServiceJpaRepositoryImpl implement /* * Guaranteed to throw an exception no matter what the data integrity issue is. */ - private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, - final NonTransientDataAccessException dve) { - + private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { if (realCause.getMessage().contains("category_name")) { final String name = command.stringValueOfParameterNamed("category_name"); throw new PlatformDataIntegrityException("error.msg.provisioning.duplicate.categoryname", "Provisioning Cateory with name `" + name + "` already exists", "category name", name); } log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.charge.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.charge.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } - - private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final PersistenceException dve) { - - if (realCause.getMessage().contains("category_name")) { - final String name = command.stringValueOfParameterNamed("category_name"); - throw new PlatformDataIntegrityException("error.msg.provisioning.duplicate.categoryname", - "Provisioning Cateory with name `" + name + "` already exists", "category name", name); - } - log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.charge.unknown.data.integrity.issue", - "Unknown data integrity issue with resource: " + realCause.getMessage()); - } - } diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/service/ProvisioningCriteriaWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/service/ProvisioningCriteriaWritePlatformServiceJpaRepositoryImpl.java index 4a0c60bab..333aa0756 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/service/ProvisioningCriteriaWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/service/ProvisioningCriteriaWritePlatformServiceJpaRepositoryImpl.java @@ -35,6 +35,7 @@ import org.apache.fineract.accounting.provisioning.service.ProvisioningEntriesRe import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; import org.apache.fineract.organisation.provisioning.constants.ProvisioningCriteriaConstants; @@ -158,7 +159,7 @@ public class ProvisioningCriteriaWritePlatformServiceJpaRepositoryImpl implement "The selected products already associated with another Provisioning Criteria"); } log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.provisioning.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.provisioning.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java index 3985e9f8b..1a8da0a12 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffWritePlatformServiceJpaRepositoryImpl.java @@ -27,6 +27,7 @@ import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.organisation.office.domain.Office; import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper; @@ -110,9 +111,7 @@ public class StaffWritePlatformServiceJpaRepositoryImpl implements StaffWritePla * Guaranteed to throw an exception no matter what the data integrity issue is. */ private void handleStaffDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { - if (realCause.getMessage().contains("external_id")) { - final String externalId = command.stringValueOfParameterNamed("externalId"); throw new PlatformDataIntegrityException("error.msg.staff.duplicate.externalId", "Staff with externalId `" + externalId + "` already exists", "externalId", externalId); @@ -128,7 +127,7 @@ public class StaffWritePlatformServiceJpaRepositoryImpl implements StaffWritePla } log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.staff.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.staff.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java index 0150cfae7..3f649405e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java @@ -34,6 +34,7 @@ import org.apache.fineract.accounting.journalentry.domain.JournalEntryType; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.security.exception.NoAuthorizationException; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; @@ -182,7 +183,6 @@ public class TellerWritePlatformServiceJpaImpl implements TellerWritePlatformSer * Guaranteed to throw an exception no matter what the data integrity issue is. */ private void handleTellerDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { - if (realCause.getMessage().contains("m_tellers_name_unq")) { final String name = command.stringValueOfParameterNamed("name"); throw new PlatformDataIntegrityException("error.msg.teller.duplicate.name", "Teller with name `" + name + "` already exists", @@ -190,8 +190,8 @@ public class TellerWritePlatformServiceJpaImpl implements TellerWritePlatformSer } log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.teller.unknown.data.integrity.issue", - "Unknown data integrity issue with resource."); + throw ErrorHandler.getMappable(dve, "error.msg.teller.unknown.data.integrity.issue", + "Unknown data integrity issue with resource: " + realCause.getMessage()); } @Override diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/StandingInstructionWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/StandingInstructionWritePlatformServiceImpl.java index e832fd574..5e364315e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/StandingInstructionWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/StandingInstructionWritePlatformServiceImpl.java @@ -30,6 +30,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.portfolio.account.PortfolioAccountType; import org.apache.fineract.portfolio.account.api.StandingInstructionApiConstants; @@ -98,15 +99,14 @@ public class StandingInstructionWritePlatformServiceImpl implements StandingInst } private void handleDataIntegrityIssues(final JsonCommand command, Throwable realCause, final NonTransientDataAccessException dve) { - if (realCause.getMessage().contains("name")) { final String name = command.stringValueOfParameterNamed(StandingInstructionApiConstants.nameParamName); throw new PlatformDataIntegrityException("error.msg.standinginstruction.duplicate.name", "Standinginstruction with name `" + name + "` already exists", "name", name); } log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.client.unknown.data.integrity.issue", - "Unknown data integrity issue with resource."); + throw ErrorHandler.getMappable(dve, "error.msg.client.unknown.data.integrity.issue", + "Unknown data integrity issue with resource: " + realCause.getMessage()); } private boolean isLoanToSavingsAccountTransfer(final PortfolioAccountType fromAccountType, final PortfolioAccountType toAccountType) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeWritePlatformServiceJpaRepositoryImpl.java index 19170d6d8..03a9342dc 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeWritePlatformServiceJpaRepositoryImpl.java @@ -29,6 +29,7 @@ import org.apache.fineract.accounting.glaccount.domain.GLAccountRepositoryWrappe import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityAccessType; import org.apache.fineract.infrastructure.entityaccess.service.FineractEntityAccessUtil; @@ -237,7 +238,6 @@ public class ChargeWritePlatformServiceJpaRepositoryImpl implements ChargeWriteP * Guaranteed to throw an exception no matter what the data integrity issue is. */ private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { - if (realCause.getMessage().contains("name")) { final String name = command.stringValueOfParameterNamed("name"); throw new PlatformDataIntegrityException("error.msg.charge.duplicate.name", "Charge with name `" + name + "` already exists", @@ -245,7 +245,7 @@ public class ChargeWritePlatformServiceJpaRepositoryImpl implements ChargeWriteP } log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.charge.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.charge.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientChargeWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientChargeWritePlatformServiceImpl.java index 38684f1da..fe388beb5 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientChargeWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientChargeWritePlatformServiceImpl.java @@ -36,6 +36,7 @@ import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; import org.apache.fineract.infrastructure.core.domain.ExternalId; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.service.DateUtils; @@ -420,17 +421,15 @@ public class ClientChargeWritePlatformServiceImpl implements ClientChargeWritePl private void handleDataIntegrityIssues(@SuppressWarnings("unused") final Long clientId, final Long clientChargeId, final Throwable realCause, final NonTransientDataAccessException dve) { - if (realCause.getMessage().contains("FK_m_client_charge_paid_by_m_client_charge")) { - throw new PlatformDataIntegrityException("error.msg.client.charge.cannot.be.deleted", "Client charge with id `" + clientChargeId + "` cannot be deleted as transactions have been made on the same", "clientChargeId", clientChargeId); } log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.client.charges.unknown.data.integrity.issue", - "Unknown data integrity issue with resource."); + throw ErrorHandler.getMappable(dve, "error.msg.client.charges.unknown.data.integrity.issue", + "Unknown data integrity issue with resource: " + realCause.getMessage()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientIdentifierWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientIdentifierWritePlatformServiceJpaRepositoryImpl.java index 96d60f444..11d82bcf3 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientIdentifierWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientIdentifierWritePlatformServiceJpaRepositoryImpl.java @@ -27,7 +27,7 @@ import org.apache.fineract.infrastructure.codes.exception.CodeValueNotFoundExcep import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.client.command.ClientIdentifierCommand; import org.apache.fineract.portfolio.client.domain.Client; @@ -199,7 +199,7 @@ public class ClientIdentifierWritePlatformServiceJpaRepositoryImpl implements Cl } logAsErrorUnexpectedDataIntegrityException(dve); - throw new PlatformDataIntegrityException("error.msg.clientIdentifier.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.clientIdentifier.unknown.data.integrity.issue", "Unknown data integrity issue with resource."); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java index 3a1013a55..6bfdf3079 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java @@ -43,6 +43,7 @@ import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.domain.ExternalId; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; import org.apache.fineract.infrastructure.core.service.DateUtils; @@ -152,8 +153,8 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP } catch (final JpaSystemException | DataIntegrityViolationException dve) { Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()); log.error("Error occured.", throwable); - throw new PlatformDataIntegrityException("error.msg.client.unknown.data.integrity.issue", - "Unknown data integrity issue with resource.", dve); + throw ErrorHandler.getMappable(dve, "error.msg.client.unknown.data.integrity.issue", + "Unknown data integrity issue with resource."); } } @@ -161,9 +162,7 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP * Guaranteed to throw an exception no matter what the data integrity issue is. */ private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { - if (realCause.getMessage().contains("external_id")) { - final String externalId = command.stringValueOfParameterNamed("externalId"); throw new PlatformDataIntegrityException("error.msg.client.duplicate.externalId", "Client with externalId `" + externalId + "` already exists", "externalId", externalId); @@ -178,8 +177,8 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP } logAsErrorUnexpectedDataIntegrityException(dve); - throw new PlatformDataIntegrityException("error.msg.client.unknown.data.integrity.issue", - "Unknown data integrity issue with resource."); + throw ErrorHandler.getMappable(dve, "error.msg.client.unknown.data.integrity.issue", + "Unknown data integrity issue with resource: " + realCause.getMessage()); } @Transactional diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/service/CollateralWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/service/CollateralWritePlatformServiceJpaRepositoryImpl.java index ea718011c..b8fe4e763 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/service/CollateralWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/service/CollateralWritePlatformServiceJpaRepositoryImpl.java @@ -26,7 +26,7 @@ import org.apache.fineract.infrastructure.codes.domain.CodeValueRepositoryWrappe import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.collateral.api.CollateralApiConstants; import org.apache.fineract.portfolio.collateral.api.CollateralApiConstants.CollateralJSONinputParams; @@ -165,7 +165,7 @@ public class CollateralWritePlatformServiceJpaRepositoryImpl implements Collater private void handleCollateralDataIntegrityViolation(final NonTransientDataAccessException dve) { log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.collateral.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.collateral.unknown.data.integrity.issue", "Unknown data integrity issue with resource."); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/service/FloatingRateWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/service/FloatingRateWritePlatformServiceImpl.java index 0dcb7dca7..889d43f00 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/service/FloatingRateWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/service/FloatingRateWritePlatformServiceImpl.java @@ -26,6 +26,7 @@ import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.portfolio.floatingrates.domain.FloatingRate; import org.apache.fineract.portfolio.floatingrates.domain.FloatingRateRepositoryWrapper; @@ -90,27 +91,17 @@ public class FloatingRateWritePlatformServiceImpl implements FloatingRateWritePl } private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { - if (realCause.getMessage().contains("unq_name")) { - final String name = command.stringValueOfParameterNamed("name"); throw new PlatformDataIntegrityException("error.msg.floatingrates.duplicate.name", "Floating Rate with name `" + name + "` already exists", "name", name); } - if (realCause.getMessage().contains("unq_rate_period")) { throw new PlatformDataIntegrityException("error.msg.floatingrates.duplicate.active.fromdate", "Attempt to add multiple floating rate periods with same fromdate", "fromdate", ""); } - - logAsErrorUnexpectedDataIntegrityException(dve); - throw new PlatformDataIntegrityException("error.msg.floatingrates.unknown.data.integrity.issue", - "Unknown data integrity issue with resource."); - } - - private void logAsErrorUnexpectedDataIntegrityException(Exception dve) { log.error("Error occured.", dve); - + throw ErrorHandler.getMappable(dve, "error.msg.floatingrates.unknown.data.integrity.issue", + "Unknown data integrity issue with resource: " + realCause.getMessage()); } - } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/service/FundWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/service/FundWritePlatformServiceJpaRepositoryImpl.java index 8750d70aa..550e8aaa9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/service/FundWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/service/FundWritePlatformServiceJpaRepositoryImpl.java @@ -26,6 +26,7 @@ import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.fund.domain.Fund; @@ -113,7 +114,7 @@ public class FundWritePlatformServiceJpaRepositoryImpl implements FundWritePlatf } log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.fund.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.fund.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupRolesWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupRolesWritePlatformServiceJpaRepositoryImpl.java index 014161de5..06f5aa9dd 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupRolesWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupRolesWritePlatformServiceJpaRepositoryImpl.java @@ -26,6 +26,7 @@ import org.apache.fineract.infrastructure.codes.domain.CodeValueRepositoryWrappe import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.client.domain.Client; @@ -96,8 +97,7 @@ public class GroupRolesWritePlatformServiceJpaRepositoryImpl implements GroupRol } log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.group.unknown.data.integrity.issue", - "Unknown data integrity issue with resource."); + throw ErrorHandler.getMappable(dve, "error.msg.group.unknown.data.integrity.issue", "Unknown data integrity issue with resource."); } @Override diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java index 0c327def9..22f9db63f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java @@ -42,6 +42,7 @@ import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDoma import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.service.DateUtils; @@ -567,8 +568,8 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group } catch (final JpaSystemException | DataIntegrityViolationException dve) { Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()); log.error("Error occured.", throwable); - throw new PlatformDataIntegrityException("error.msg.group.unknown.data.integrity.issue", - "Unknown data integrity issue with resource.", dve); + throw ErrorHandler.getMappable(dve, "error.msg.group.unknown.data.integrity.issue", + "Unknown data integrity issue with resource."); } } @@ -727,7 +728,6 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group */ private void handleGroupDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve, final GroupTypes groupLevel) { - String levelName = "Invalid"; switch (groupLevel) { case CENTER: @@ -742,16 +742,13 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group String errorMessageForUser = null; String errorMessageForMachine = null; - if (realCause.getMessage().contains("'external_id'")) { - final String externalId = command.stringValueOfParameterNamed(GroupingTypesApiConstants.externalIdParamName); errorMessageForUser = levelName + " with externalId `" + externalId + "` already exists."; errorMessageForMachine = "error.msg." + levelName.toLowerCase() + ".duplicate.externalId"; throw new PlatformDataIntegrityException(errorMessageForMachine, errorMessageForUser, GroupingTypesApiConstants.externalIdParamName, externalId); } else if (realCause.getMessage().contains("'name'")) { - final String name = command.stringValueOfParameterNamed(GroupingTypesApiConstants.nameParamName); errorMessageForUser = levelName + " with name `" + name + "` already exists."; errorMessageForMachine = "error.msg." + levelName.toLowerCase() + ".duplicate.name"; @@ -760,8 +757,7 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group } log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.group.unknown.data.integrity.issue", - "Unknown data integrity issue with resource."); + throw ErrorHandler.getMappable(dve, "error.msg.group.unknown.data.integrity.issue", "Unknown data integrity issue with resource."); } @Override diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorWritePlatformServiceJpaRepositoryIImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorWritePlatformServiceJpaRepositoryIImpl.java index a62bc2406..375e83d15 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorWritePlatformServiceJpaRepositoryIImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorWritePlatformServiceJpaRepositoryIImpl.java @@ -29,9 +29,9 @@ import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.organisation.staff.domain.StaffRepositoryWrapper; import org.apache.fineract.portfolio.account.domain.AccountAssociationType; @@ -351,7 +351,7 @@ public class GuarantorWritePlatformServiceJpaRepositoryIImpl implements Guaranto private void handleGuarantorDataIntegrityIssues(final Throwable realCause, final NonTransientDataAccessException dve) { LOG.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.guarantor.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.guarantor.unknown.data.integrity.issue", "Unknown data integrity issue with resource Guarantor: " + realCause.getMessage()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java index 7a35d2210..dba4557f6 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java @@ -39,9 +39,9 @@ import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.event.business.domain.loan.LoanRescheduledDueAdjustScheduleBusinessEvent; import org.apache.fineract.infrastructure.event.business.service.BusinessEventNotifierService; @@ -580,11 +580,8 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche * **/ private void handleDataIntegrityViolation(final NonTransientDataAccessException dve) { - LOG.error("Error occured.", dve); - - throw new PlatformDataIntegrityException("error.msg.loan.reschedule.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.loan.reschedule.unknown.data.integrity.issue", "Unknown data integrity issue with resource."); } - } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java index 925031c7a..f15cb39bd 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java @@ -49,6 +49,7 @@ import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; import org.apache.fineract.infrastructure.core.domain.ExternalId; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; @@ -1188,7 +1189,6 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa * Guaranteed to throw an exception no matter what the data integrity issue is. */ private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { - if (realCause.getMessage().contains("loan_account_no_UNIQUE") || (realCause.getCause() != null && realCause.getCause().getMessage().contains("loan_account_no_UNIQUE"))) { @@ -1202,12 +1202,8 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa "Loan with externalId `" + externalId + "` already exists", "externalId", externalId); } - logAsErrorUnexpectedDataIntegrityException(dve); - throw new PlatformDataIntegrityException("error.msg.unknown.data.integrity.issue", "Unknown data integrity issue with resource."); - } - - private void logAsErrorUnexpectedDataIntegrityException(final Exception dve) { log.error("Error occured.", dve); + throw ErrorHandler.getMappable(dve, "error.msg.unknown.data.integrity.issue", "Unknown data integrity issue with resource."); } @Transactional diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java index 9e72ff81b..01c2d225c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java @@ -40,7 +40,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.fineract.accounting.journalentry.service.JournalEntryWritePlatformService; -import org.apache.fineract.batch.exception.ErrorHandler; import org.apache.fineract.cob.exceptions.LoanAccountLockCannotBeOverruledException; import org.apache.fineract.cob.service.LoanAccountLockService; import org.apache.fineract.infrastructure.codes.domain.CodeValue; @@ -52,6 +51,7 @@ import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; import org.apache.fineract.infrastructure.core.domain.ExternalId; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.apache.fineract.infrastructure.core.exception.PlatformServiceUnavailableException; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/LoanAccountConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/LoanAccountConfiguration.java index 9b2037a47..5b10d3d51 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/LoanAccountConfiguration.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/LoanAccountConfiguration.java @@ -19,13 +19,13 @@ package org.apache.fineract.portfolio.loanaccount.starter; import org.apache.fineract.accounting.journalentry.service.JournalEntryWritePlatformService; -import org.apache.fineract.batch.exception.ErrorHandler; import org.apache.fineract.cob.service.LoanAccountLockService; import org.apache.fineract.infrastructure.accountnumberformat.domain.AccountNumberFormatRepositoryWrapper; import org.apache.fineract.infrastructure.codes.domain.CodeValueRepositoryWrapper; import org.apache.fineract.infrastructure.codes.service.CodeValueReadPlatformService; import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; import org.apache.fineract.infrastructure.configuration.domain.GlobalConfigurationRepositoryWrapper; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; import org.apache.fineract.infrastructure.core.service.ExternalIdFactory; import org.apache.fineract.infrastructure.core.service.PaginationHelper; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/service/ProductMixWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/service/ProductMixWritePlatformServiceJpaRepositoryImpl.java index 1220ed600..b61538e74 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/service/ProductMixWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/service/ProductMixWritePlatformServiceJpaRepositoryImpl.java @@ -29,7 +29,7 @@ import java.util.Set; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.loanproduct.domain.LoanProduct; import org.apache.fineract.portfolio.loanproduct.domain.LoanProductRepository; @@ -192,7 +192,7 @@ public class ProductMixWritePlatformServiceJpaRepositoryImpl implements ProductM private void handleDataIntegrityIssues(final NonTransientDataAccessException dve) { LOG.error("Error occurred.", dve); - throw new PlatformDataIntegrityException("error.msg.product.loan.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.product.loan.unknown.data.integrity.issue", "Unknown data integrity issue with resource."); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java index a01510344..3630cca23 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java @@ -32,6 +32,7 @@ import org.apache.fineract.accounting.producttoaccountmapping.service.ProductToG import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityAccessType; @@ -331,7 +332,6 @@ public class LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanPro * Guaranteed to throw an exception no matter what the data integrity issue is. */ private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { - if (realCause.getMessage().contains("'external_id'")) { final String externalId = command.stringValueOfParameterNamed("externalId"); @@ -354,8 +354,8 @@ public class LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanPro } logAsErrorUnexpectedDataIntegrityException(dve); - throw new PlatformDataIntegrityException("error.msg.product.loan.unknown.data.integrity.issue", - "Unknown data integrity issue with resource.", realCause); + throw ErrorHandler.getMappable(dve, "error.msg.product.loan.unknown.data.integrity.issue", + "Unknown data integrity issue with resource.", null, realCause); } private static boolean containsDuplicateShortnameErrorForPostgreSQL(Throwable realCause) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/service/MeetingWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/service/MeetingWritePlatformServiceJpaRepositoryImpl.java index c4bf38cb3..bd6cf4396 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/service/MeetingWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/service/MeetingWritePlatformServiceJpaRepositoryImpl.java @@ -38,6 +38,7 @@ import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDoma import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; import org.apache.fineract.portfolio.calendar.domain.Calendar; @@ -284,7 +285,7 @@ public class MeetingWritePlatformServiceJpaRepositoryImpl implements MeetingWrit "A meeting with date '" + meetingDate + "' already exists", meetingDateParamName, meetingDate); } - throw new PlatformDataIntegrityException("error.msg.meeting.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.meeting.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/service/PaymentTypeWriteServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/service/PaymentTypeWriteServiceImpl.java index 019b09cf5..946adbbb1 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/service/PaymentTypeWriteServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/service/PaymentTypeWriteServiceImpl.java @@ -23,6 +23,7 @@ import lombok.RequiredArgsConstructor; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.portfolio.paymenttype.api.PaymentTypeApiResourceConstants; import org.apache.fineract.portfolio.paymenttype.data.PaymentTypeDataValidator; @@ -89,7 +90,6 @@ public class PaymentTypeWriteServiceImpl implements PaymentTypeWriteService { } private void handleDataIntegrityIssues(final Throwable realCause, final Exception dve) { - if (realCause.getMessage().contains("acc_product_mapping")) { throw new PlatformDataIntegrityException("error.msg.payment.type.association.exist", "cannot.delete.payment.type.with.association"); @@ -97,8 +97,7 @@ public class PaymentTypeWriteServiceImpl implements PaymentTypeWriteService { throw new PlatformDataIntegrityException("error.msg.payment.type.association.exist", "cannot.delete.payment.type.with.association"); } - - throw new PlatformDataIntegrityException("error.msg.paymenttypes.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.paymenttypes.unknown.data.integrity.issue", "Unknown data integrity issue with resource."); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/rate/service/RateWriteServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/rate/service/RateWriteServiceImpl.java index 74429555b..1de59e913 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/rate/service/RateWriteServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/rate/service/RateWriteServiceImpl.java @@ -28,6 +28,7 @@ import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.rate.domain.Rate; @@ -132,7 +133,7 @@ public class RateWriteServiceImpl implements RateWriteService { } log.error("Error due to Exception", dve); - throw new PlatformDataIntegrityException("error.msg.fund.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.fund.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl.java index fd7dc9faf..a46c35b97 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl.java @@ -45,9 +45,9 @@ import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; import org.apache.fineract.infrastructure.event.business.domain.deposit.FixedDepositAccountCreateBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.deposit.RecurringDepositAccountCreateBusinessEvent; @@ -126,26 +126,29 @@ public class DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl impl * Guaranteed to throw an exception no matter what the data integrity issue is. */ private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { - - final StringBuilder errorCodeBuilder = new StringBuilder("error.msg.").append(SavingsApiConstants.SAVINGS_ACCOUNT_RESOURCE_NAME); - - if (realCause.getMessage().contains("'sa_account_no_UNIQUE'")) { + String msgCode = "error.msg." + SavingsApiConstants.SAVINGS_ACCOUNT_RESOURCE_NAME; + String msg = "Unknown data integrity issue with savings account."; + String param = null; + Object[] msgArgs; + Throwable checkEx = realCause == null ? dve : realCause; + if (checkEx.getMessage().contains("sa_account_no_UNIQUE")) { final String accountNo = command.stringValueOfParameterNamed("accountNo"); - errorCodeBuilder.append(".duplicate.accountNo"); - throw new PlatformDataIntegrityException(errorCodeBuilder.toString(), - "Savings account with accountNo " + accountNo + " already exists", "accountNo", accountNo); - - } else if (realCause.getMessage().contains("sa_external_id_UNIQUE")) { - + msgCode += ".duplicate.accountNo"; + msg = "Savings account with accountNo " + accountNo + " already exists"; + param = "accountNo"; + msgArgs = new Object[] { accountNo, dve }; + } else if (checkEx.getMessage().contains("sa_external_id_UNIQUE")) { final String externalId = command.stringValueOfParameterNamed("externalId"); - errorCodeBuilder.append(".duplicate.externalId"); - throw new PlatformDataIntegrityException(errorCodeBuilder.toString(), - "Savings account with externalId " + externalId + " already exists", "externalId", externalId); + msgCode += ".duplicate.externalId"; + msg = "Savings account with externalId " + externalId + " already exists"; + param = "externalId"; + msgArgs = new Object[] { externalId, dve }; + } else { + msgCode += ".unknown.data.integrity.issue"; + msgArgs = new Object[] { dve }; } - - errorCodeBuilder.append(".unknown.data.integrity.issue"); log.error("Error occured.", dve); - throw new PlatformDataIntegrityException(errorCodeBuilder.toString(), "Unknown data integrity issue with savings account."); + throw ErrorHandler.getMappable(dve, msgCode, msg, param, msgArgs); } @Transactional diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/FixedDepositProductWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/FixedDepositProductWritePlatformServiceJpaRepositoryImpl.java index c7bbd1307..a05c538ab 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/FixedDepositProductWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/FixedDepositProductWritePlatformServiceJpaRepositoryImpl.java @@ -37,12 +37,13 @@ import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.charge.domain.Charge; import org.apache.fineract.portfolio.interestratechart.service.InterestRateChartAssembler; import org.apache.fineract.portfolio.savings.DepositAccountType; +import org.apache.fineract.portfolio.savings.SavingsApiConstants; import org.apache.fineract.portfolio.savings.data.DepositProductDataValidator; import org.apache.fineract.portfolio.savings.domain.DepositProductAssembler; import org.apache.fineract.portfolio.savings.domain.FixedDepositProduct; @@ -85,8 +86,7 @@ public class FixedDepositProductWritePlatformServiceJpaRepositoryImpl implements handleDataIntegrityIssues(command, e.getMostSpecificCause(), e); return CommandProcessingResult.empty(); } catch (final PersistenceException dve) { - Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()); - handleDataIntegrityIssues(command, throwable, dve); + handleDataIntegrityIssues(command, ExceptionUtils.getRootCause(dve.getCause()), dve); return CommandProcessingResult.empty(); } } @@ -145,8 +145,7 @@ public class FixedDepositProductWritePlatformServiceJpaRepositoryImpl implements handleDataIntegrityIssues(command, e.getMostSpecificCause(), e); return CommandProcessingResult.empty(); } catch (final PersistenceException dve) { - Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()); - handleDataIntegrityIssues(command, throwable, dve); + handleDataIntegrityIssues(command, ExceptionUtils.getRootCause(dve.getCause()), dve); return CommandProcessingResult.empty(); } } @@ -170,25 +169,28 @@ public class FixedDepositProductWritePlatformServiceJpaRepositoryImpl implements * Guaranteed to throw an exception no matter what the data integrity issue is. */ private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dae) { - - if (realCause.getMessage().contains("sp_unq_name")) { - + String msgCode = "error.msg." + SavingsApiConstants.SAVINGS_PRODUCT_RESOURCE_NAME; + String msg = "Unknown data integrity issue with savings product."; + String param = null; + Object[] msgArgs; + Throwable checkEx = realCause == null ? dae : realCause; + if (checkEx.getMessage().contains("sp_unq_name")) { final String name = command.stringValueOfParameterNamed("name"); - throw new PlatformDataIntegrityException("error.msg.product.savings.duplicate.name", - "Savings product with name `" + name + "` already exists", "name", name); - } else if (realCause.getMessage().contains("sp_unq_short_name")) { - + msgCode += ".duplicate.name"; + msg = "Savings product with name `" + name + "` already exists"; + param = "name"; + msgArgs = new Object[] { name, dae }; + } else if (checkEx.getMessage().contains("sp_unq_short_name")) { final String shortName = command.stringValueOfParameterNamed("shortName"); - throw new PlatformDataIntegrityException("error.msg.product.savings.duplicate.short.name", - "Savings product with short name `" + shortName + "` already exists", "shortName", shortName); + msgCode += ".duplicate.short.name"; + msg = "Savings product with short name `" + shortName + "` already exists"; + param = "shortName"; + msgArgs = new Object[] { shortName, dae }; + } else { + msgCode += ".unknown.data.integrity.issue"; + msgArgs = new Object[] { dae }; } - - logAsErrorUnexpectedDataIntegrityException(dae); - throw new PlatformDataIntegrityException("error.msg.savingsproduct.unknown.data.integrity.issue", - "Unknown data integrity issue with resource."); - } - - private void logAsErrorUnexpectedDataIntegrityException(final Exception dae) { log.error("Error occured.", dae); + throw ErrorHandler.getMappable(dae, msgCode, msg, param, msgArgs); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/RecurringDepositProductWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/RecurringDepositProductWritePlatformServiceJpaRepositoryImpl.java index 17474c0cf..354c92cdf 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/RecurringDepositProductWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/RecurringDepositProductWritePlatformServiceJpaRepositoryImpl.java @@ -37,12 +37,13 @@ import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.charge.domain.Charge; import org.apache.fineract.portfolio.interestratechart.service.InterestRateChartAssembler; import org.apache.fineract.portfolio.savings.DepositAccountType; +import org.apache.fineract.portfolio.savings.SavingsApiConstants; import org.apache.fineract.portfolio.savings.data.DepositProductDataValidator; import org.apache.fineract.portfolio.savings.domain.DepositProductAssembler; import org.apache.fineract.portfolio.savings.domain.RecurringDepositProduct; @@ -85,8 +86,7 @@ public class RecurringDepositProductWritePlatformServiceJpaRepositoryImpl implem handleDataIntegrityIssues(command, e.getMostSpecificCause(), e); return CommandProcessingResult.empty(); } catch (final PersistenceException dve) { - Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()); - handleDataIntegrityIssues(command, throwable, dve); + handleDataIntegrityIssues(command, ExceptionUtils.getRootCause(dve.getCause()), dve); return CommandProcessingResult.empty(); } } @@ -145,8 +145,7 @@ public class RecurringDepositProductWritePlatformServiceJpaRepositoryImpl implem handleDataIntegrityIssues(command, e.getMostSpecificCause(), e); return CommandProcessingResult.empty(); } catch (final PersistenceException dve) { - Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()); - handleDataIntegrityIssues(command, throwable, dve); + handleDataIntegrityIssues(command, ExceptionUtils.getRootCause(dve.getCause()), dve); return CommandProcessingResult.empty(); } } @@ -170,25 +169,28 @@ public class RecurringDepositProductWritePlatformServiceJpaRepositoryImpl implem * Guaranteed to throw an exception no matter what the data integrity issue is. */ private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dae) { - - if (realCause.getMessage().contains("sp_unq_name")) { - + String msgCode = "error.msg." + SavingsApiConstants.SAVINGS_PRODUCT_RESOURCE_NAME; + String msg = "Unknown data integrity issue with recurring deposit product."; + String param = null; + Object[] msgArgs; + Throwable checkEx = realCause == null ? dae : realCause; + if (checkEx.getMessage().contains("sp_unq_name")) { final String name = command.stringValueOfParameterNamed("name"); - throw new PlatformDataIntegrityException("error.msg.product.savings.duplicate.name", - "Recurring Deposit product with name `" + name + "` already exists", "name", name); - } else if (realCause.getMessage().contains("sp_unq_short_name")) { - + msgCode += ".duplicate.name"; + msg = "Recurring Deposit product with name `" + name + "` already exists"; + param = "name"; + msgArgs = new Object[] { name, dae }; + } else if (checkEx.getMessage().contains("sp_unq_short_name")) { final String shortName = command.stringValueOfParameterNamed("shortName"); - throw new PlatformDataIntegrityException("error.msg.product.savings.duplicate.short.name", - "Recurring Deposit product with short name `" + shortName + "` already exists", "shortName", shortName); + msgCode += ".duplicate.short.name"; + msg = "Recurring Deposit product with short name `" + shortName + "` already exists"; + param = "shortName"; + msgArgs = new Object[] { shortName, dae }; + } else { + msgCode += ".unknown.data.integrity.issue"; + msgArgs = new Object[] { dae }; } - - logAsErrorUnexpectedDataIntegrityException(dae); - throw new PlatformDataIntegrityException("error.msg.savingsproduct.unknown.data.integrity.issue", - "Unknown data integrity issue with resource."); - } - - private void logAsErrorUnexpectedDataIntegrityException(final Exception dae) { log.error("Error occured.", dae); + throw ErrorHandler.getMappable(dae, msgCode, msg, param, msgArgs); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java index 2563c7547..7f126fe38 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java @@ -51,13 +51,13 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.fineract.accounting.journalentry.service.JournalEntryWritePlatformService; -import org.apache.fineract.batch.exception.ErrorHandler; import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl.java index 7e215f0f9..57464a894 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl.java @@ -45,8 +45,8 @@ import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.dataqueries.data.EntityTables; import org.apache.fineract.infrastructure.dataqueries.data.StatusEnum; import org.apache.fineract.infrastructure.dataqueries.service.EntityDatatableChecksWritePlatformService; @@ -115,32 +115,6 @@ public class SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl impl private final GroupRepositoryWrapper groupRepositoryWrapper; private final GroupSavingsIndividualMonitoringWritePlatformService gsimWritePlatformService; - /* - * Guaranteed to throw an exception no matter what the data integrity issue is. - */ - private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { - - final StringBuilder errorCodeBuilder = new StringBuilder("error.msg.").append(SavingsApiConstants.SAVINGS_ACCOUNT_RESOURCE_NAME); - - if (realCause.getMessage().contains("sa_account_no_UNIQUE")) { - final String accountNo = command.stringValueOfParameterNamed("accountNo"); - errorCodeBuilder.append(".duplicate.accountNo"); - throw new PlatformDataIntegrityException(errorCodeBuilder.toString(), - "Savings account with accountNo " + accountNo + " already exists", "accountNo", accountNo); - - } else if (realCause.getMessage().contains("sa_externalid_UNIQUE")) { - - final String externalId = command.stringValueOfParameterNamed("externalId"); - errorCodeBuilder.append(".duplicate.externalId"); - throw new PlatformDataIntegrityException(errorCodeBuilder.toString(), - "Savings account with externalId " + externalId + " already exists", "externalId", externalId); - } - - errorCodeBuilder.append(".unknown.data.integrity.issue"); - log.error("Error occured.", dve); - throw new PlatformDataIntegrityException(errorCodeBuilder.toString(), "Unknown data integrity issue with savings account."); - } - @Transactional @Override public CommandProcessingResult submitGSIMApplication(final JsonCommand command) { @@ -709,4 +683,33 @@ public class SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl impl .setRollbackTransaction(rollbackTransaction)// .build(); } + + /* + * Guaranteed to throw an exception no matter what the data integrity issue is. + */ + private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { + String msgCode = "error.msg." + SavingsApiConstants.SAVINGS_ACCOUNT_RESOURCE_NAME; + String msg = "Unknown data integrity issue with savings account."; + String param = null; + Object[] msgArgs; + Throwable checkEx = realCause == null ? dve : realCause; + if (checkEx.getMessage().contains("sa_account_no_UNIQUE")) { + final String accountNo = command.stringValueOfParameterNamed("accountNo"); + msgCode += ".duplicate.accountNo"; + msg = "Savings account with accountNo " + accountNo + " already exists"; + param = "accountNo"; + msgArgs = new Object[] { accountNo, dve }; + } else if (checkEx.getMessage().contains("sa_externalid_UNIQUE")) { + final String externalId = command.stringValueOfParameterNamed("externalId"); + msgCode += ".duplicate.externalId"; + msg = "Savings account with externalId " + externalId + " already exists"; + param = "externalId"; + msgArgs = new Object[] { externalId, dve }; + } else { + msgCode += ".unknown.data.integrity.issue"; + msgArgs = new Object[] { dve }; + } + log.error("Error occured.", dve); + throw ErrorHandler.getMappable(dve, msgCode, msg, param, msgArgs); + } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsProductWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsProductWritePlatformServiceJpaRepositoryImpl.java index ad4e27156..07ab31de7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsProductWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsProductWritePlatformServiceJpaRepositoryImpl.java @@ -37,13 +37,14 @@ import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityAccessType; import org.apache.fineract.infrastructure.entityaccess.service.FineractEntityAccessUtil; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.charge.domain.Charge; import org.apache.fineract.portfolio.savings.DepositAccountType; +import org.apache.fineract.portfolio.savings.SavingsApiConstants; import org.apache.fineract.portfolio.savings.data.SavingsProductDataValidator; import org.apache.fineract.portfolio.savings.domain.SavingsProduct; import org.apache.fineract.portfolio.savings.domain.SavingsProductAssembler; @@ -68,26 +69,29 @@ public class SavingsProductWritePlatformServiceJpaRepositoryImpl implements Savi * Guaranteed to throw an exception no matter what the data integrity issue is. */ private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dae) { - - if (realCause.getMessage().contains("sp_unq_name")) { - + String msgCode = "error.msg." + SavingsApiConstants.SAVINGS_PRODUCT_RESOURCE_NAME; + String msg = "Unknown data integrity issue with savings product."; + String param = null; + Object[] msgArgs; + Throwable checkEx = realCause == null ? dae : realCause; + if (checkEx.getMessage().contains("sp_unq_name")) { final String name = command.stringValueOfParameterNamed("name"); - throw new PlatformDataIntegrityException("error.msg.product.savings.duplicate.name", - "Savings product with name `" + name + "` already exists", "name", name); - } else if (realCause.getMessage().contains("sp_unq_short_name")) { - + msgCode += ".duplicate.name"; + msg = "Savings product with name `" + name + "` already exists"; + param = "name"; + msgArgs = new Object[] { name, dae }; + } else if (checkEx.getMessage().contains("sp_unq_short_name")) { final String shortName = command.stringValueOfParameterNamed("shortName"); - throw new PlatformDataIntegrityException("error.msg.product.savings.duplicate.short.name", - "Savings product with short name `" + shortName + "` already exists", "shortName", shortName); + msgCode += ".duplicate.short.name"; + msg = "Savings product with short name `" + shortName + "` already exists"; + param = "shortName"; + msgArgs = new Object[] { shortName, dae }; + } else { + msgCode += ".unknown.data.integrity.issue"; + msgArgs = new Object[] { dae }; } - - logAsErrorUnexpectedDataIntegrityException(dae); - throw new PlatformDataIntegrityException("error.msg.savingsproduct.unknown.data.integrity.issue", - "Unknown data integrity issue with resource."); - } - - private void logAsErrorUnexpectedDataIntegrityException(final Exception dae) { log.error("Error occured.", dae); + throw ErrorHandler.getMappable(dae, msgCode, msg, param, msgArgs); } @Transactional @@ -118,8 +122,7 @@ public class SavingsProductWritePlatformServiceJpaRepositoryImpl implements Savi handleDataIntegrityIssues(command, e.getMostSpecificCause(), e); return CommandProcessingResult.empty(); } catch (final PersistenceException dve) { - Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()); - handleDataIntegrityIssues(command, throwable, dve); + handleDataIntegrityIssues(command, ExceptionUtils.getRootCause(dve.getCause()), dve); return CommandProcessingResult.empty(); } } @@ -177,8 +180,7 @@ public class SavingsProductWritePlatformServiceJpaRepositoryImpl implements Savi handleDataIntegrityIssues(command, e.getMostSpecificCause(), e); return CommandProcessingResult.empty(); } catch (final PersistenceException dve) { - Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()); - handleDataIntegrityIssues(command, throwable, dve); + handleDataIntegrityIssues(command, ExceptionUtils.getRootCause(dve.getCause()), dve); return CommandProcessingResult.empty(); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/starter/SavingsConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/starter/SavingsConfiguration.java index 9e7b57570..26b84a708 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/starter/SavingsConfiguration.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/starter/SavingsConfiguration.java @@ -20,12 +20,12 @@ package org.apache.fineract.portfolio.savings.starter; import org.apache.fineract.accounting.journalentry.service.JournalEntryWritePlatformService; import org.apache.fineract.accounting.producttoaccountmapping.service.ProductToGLAccountMappingWritePlatformService; -import org.apache.fineract.batch.exception.ErrorHandler; import org.apache.fineract.commands.service.CommandProcessingService; import org.apache.fineract.infrastructure.accountnumberformat.domain.AccountNumberFormatRepositoryWrapper; import org.apache.fineract.infrastructure.codes.service.CodeValueReadPlatformService; import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; import org.apache.fineract.infrastructure.core.data.PaginationParametersDataValidator; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; import org.apache.fineract.infrastructure.core.service.PaginationHelper; import org.apache.fineract.infrastructure.core.service.database.DatabaseSpecificSQLGenerator; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/service/SelfBeneficiariesTPTWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/service/SelfBeneficiariesTPTWritePlatformServiceImpl.java index 6ec8c37ce..cd293a28a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/service/SelfBeneficiariesTPTWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/service/SelfBeneficiariesTPTWritePlatformServiceImpl.java @@ -31,6 +31,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.account.PortfolioAccountType; @@ -155,7 +156,6 @@ public class SelfBeneficiariesTPTWritePlatformServiceImpl implements SelfBenefic } private void handleDataIntegrityIssues(final JsonCommand command, final DataAccessException dae) { - final Throwable realCause = dae.getMostSpecificCause(); if (realCause.getMessage().contains("name")) { @@ -165,7 +165,7 @@ public class SelfBeneficiariesTPTWritePlatformServiceImpl implements SelfBenefic } log.error("Error occured.", dae); - throw new PlatformDataIntegrityException("error.msg.beneficiary.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dae, "error.msg.beneficiary.unknown.data.integrity.issue", "Unknown data integrity issue with resource."); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/registration/service/SelfServiceRegistrationWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/registration/service/SelfServiceRegistrationWritePlatformServiceImpl.java index 3f76b1936..73dc3390f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/registration/service/SelfServiceRegistrationWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/registration/service/SelfServiceRegistrationWritePlatformServiceImpl.java @@ -40,6 +40,7 @@ import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; import org.apache.fineract.infrastructure.core.domain.EmailDetail; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; @@ -284,7 +285,7 @@ public class SelfServiceRegistrationWritePlatformServiceImpl implements SelfServ throw new PlatformDataIntegrityException("error.msg.user.duplicate.username", defaultMessageBuilder.toString(), "username", username); } - throw new PlatformDataIntegrityException("error.msg.unknown.data.integrity.issue", "Unknown data integrity issue with resource."); + throw ErrorHandler.getMappable(dve, "error.msg.unknown.data.integrity.issue", "Unknown data integrity issue with resource."); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountWritePlatformServiceJpaRepositoryImpl.java index a3aee3881..34f8f713b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountWritePlatformServiceJpaRepositoryImpl.java @@ -37,7 +37,7 @@ import org.apache.fineract.infrastructure.accountnumberformat.domain.EntityAccou import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.event.business.domain.share.ShareAccountApproveBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.share.ShareAccountCreateBusinessEvent; @@ -500,7 +500,7 @@ public class ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA } private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { - throw new PlatformDataIntegrityException("error.msg.shareaccount.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.shareaccount.unknown.data.integrity.issue", "Unknown data integrity issue with resource."); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/service/ShareProductWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/service/ShareProductWritePlatformServiceJpaRepositoryImpl.java index fa7e3ba5d..229106864 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/service/ShareProductWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/service/ShareProductWritePlatformServiceJpaRepositoryImpl.java @@ -30,6 +30,7 @@ import org.apache.fineract.accounting.producttoaccountmapping.service.ProductToG import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; import org.apache.fineract.infrastructure.event.business.domain.share.ShareProductDividentsCreateBusinessEvent; @@ -181,20 +182,16 @@ public class ShareProductWritePlatformServiceJpaRepositoryImpl implements ShareP private void handleDataIntegrityIssues(final Exception e) { log.error("Unknown data integrity issue with resource", e); - throw new PlatformDataIntegrityException("error.msg.shareproduct.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(e, "error.msg.shareproduct.unknown.data.integrity.issue", "Unknown data integrity issue with resource."); } private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { - if (realCause.getMessage().contains("'name'")) { final String name = command.stringValueOfParameterNamed(ShareProductApiConstants.name_paramname); throw new PlatformDataIntegrityException("error.msg.shareproduct.duplicate.name", "Share Product with name `" + name + "` already exists", "name", name); } - - log.error("Unknown data integrity issue with resource", dve); - throw new PlatformDataIntegrityException("error.msg.shareproduct.unknown.data.integrity.issue", - "Unknown data integrity issue with resource."); + handleDataIntegrityIssues(dve); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/spm/service/SpmService.java b/fineract-provider/src/main/java/org/apache/fineract/spm/service/SpmService.java index a65f21418..817a00238 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/spm/service/SpmService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/spm/service/SpmService.java @@ -23,6 +23,7 @@ import jakarta.persistence.PersistenceException; import java.time.LocalDate; import java.util.List; import lombok.RequiredArgsConstructor; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; @@ -125,17 +126,14 @@ public class SpmService { } private void handleDataIntegrityIssues(final Throwable realCause, final Exception dve, String key) { - if (realCause.getMessage().contains("m_survey_scorecards")) { throw new PlatformDataIntegrityException("error.msg.survey.cannot.be.modified.as.used.in.client.survey", "Survey can not be edited as it is already used in client survey", "name", key); } - if (realCause.getMessage().contains("key")) { throw new PlatformDataIntegrityException("error.msg.survey.duplicate.key", "Survey with key already exists", "name", key); } - - throw new PlatformDataIntegrityException("error.msg.survey.unknown.data.integrity.issue", + throw ErrorHandler.getMappable(dve, "error.msg.survey.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/AppUserWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/AppUserWritePlatformServiceJpaRepositoryImpl.java index 11d18eef9..10f09fafd 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/AppUserWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/AppUserWritePlatformServiceJpaRepositoryImpl.java @@ -34,6 +34,7 @@ import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.service.PlatformEmailSendException; @@ -283,28 +284,22 @@ public class AppUserWritePlatformServiceJpaRepositoryImpl implements AppUserWrit /* * Return an exception to throw, no matter what the data integrity issue is. */ - private PlatformDataIntegrityException handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, - final Exception dve) { + private RuntimeException handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { // TODO: this needs to be fixed. The error condition should be independent from the underlying message and - // naming - // of the constraint + // naming of the constraint if (realCause.getMessage().contains("username_org")) { final String username = command.stringValueOfParameterNamed("username"); - final StringBuilder defaultMessageBuilder = new StringBuilder("User with username ").append(username) - .append(" already exists."); - return new PlatformDataIntegrityException("error.msg.user.duplicate.username", defaultMessageBuilder.toString(), "username", - username); + final String defaultMessage = "User with username " + username + " already exists."; + return new PlatformDataIntegrityException("error.msg.user.duplicate.username", defaultMessage, "username", username); } - // TODO: this needs to be fixed. The error condition should be independent from the underlying message and - // naming - // of the constraint + // naming of the constraint if (realCause.getMessage().contains("unique_self_client")) { return new PlatformDataIntegrityException("error.msg.user.self.service.user.already.exist", "Self Service User Id is already created. Go to Admin->Users to edit or delete the self-service user."); } log.error("handleDataIntegrityIssues: Neither duplicate username nor existing user; unknown error occured", dve); - return new PlatformDataIntegrityException("error.msg.unknown.data.integrity.issue", "Unknown data integrity issue with resource."); + return ErrorHandler.getMappable(dve, "error.msg.unknown.data.integrity.issue", "Unknown data integrity issue with resource."); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/PasswordPreferencesWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/PasswordPreferencesWritePlatformServiceJpaRepositoryImpl.java index 3efebab5b..c8a022238 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/PasswordPreferencesWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/PasswordPreferencesWritePlatformServiceJpaRepositoryImpl.java @@ -26,7 +26,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; -import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.useradministration.api.PasswordPreferencesApiConstants; import org.apache.fineract.useradministration.data.PasswordPreferencesDataValidator; import org.apache.fineract.useradministration.domain.PasswordValidationPolicy; @@ -82,8 +82,8 @@ public class PasswordPreferencesWritePlatformServiceJpaRepositoryImpl implements .build(); } catch (final JpaSystemException | DataIntegrityViolationException dve) { log.error("Error occured.", dve); - throw new PlatformDataIntegrityException("error.msg.password.validation.policy.unknown.data.integrity.issue", - "Unknown data integrity issue with resource.", dve); + throw ErrorHandler.getMappable(dve, "error.msg.password.validation.policy.unknown.data.integrity.issue", + "Unknown data integrity issue with resource."); } } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/RoleWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/RoleWritePlatformServiceJpaRepositoryImpl.java index 2d505aa1f..c06ac8829 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/RoleWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/RoleWritePlatformServiceJpaRepositoryImpl.java @@ -28,6 +28,7 @@ import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.useradministration.command.PermissionsCommand; @@ -86,21 +87,14 @@ public class RoleWritePlatformServiceJpaRepositoryImpl implements RoleWritePlatf * Guaranteed to throw an exception no matter what the data integrity issue is. */ private void handleDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { - if (realCause.getMessage().contains("unq_name")) { - final String name = command.stringValueOfParameterNamed("name"); throw new PlatformDataIntegrityException("error.msg.role.duplicate.name", "Role with name `" + name + "` already exists", "name", name); } - logAsErrorUnexpectedDataIntegrityException(dve); - throw new PlatformDataIntegrityException("error.msg.role.unknown.data.integrity.issue", - "Unknown data integrity issue with resource."); - } - - private void logAsErrorUnexpectedDataIntegrityException(final Exception dve) { log.error("Error occured.", dve); + throw ErrorHandler.getMappable(dve, "error.msg.role.unknown.data.integrity.issue", "Unknown data integrity issue with resource."); } @Caching(evict = { @CacheEvict(value = "users", allEntries = true), @CacheEvict(value = "usersByUsername", allEntries = true) }) @@ -212,8 +206,8 @@ public class RoleWritePlatformServiceJpaRepositoryImpl implements RoleWritePlatf this.roleRepository.delete(role); return new CommandProcessingResultBuilder().withEntityId(roleId).build(); } catch (final JpaSystemException | DataIntegrityViolationException e) { - throw new PlatformDataIntegrityException("error.msg.unknown.data.integrity.issue", - "Unknown data integrity issue with resource: " + e.getMostSpecificCause(), e); + throw ErrorHandler.getMappable(e, "error.msg.unknown.data.integrity.issue", + "Unknown data integrity issue with resource: " + e.getMostSpecificCause()); } } @@ -246,8 +240,8 @@ public class RoleWritePlatformServiceJpaRepositoryImpl implements RoleWritePlatf return new CommandProcessingResultBuilder().withEntityId(roleId).build(); } catch (final JpaSystemException | DataIntegrityViolationException e) { - throw new PlatformDataIntegrityException("error.msg.unknown.data.integrity.issue", - "Unknown data integrity issue with resource: " + e.getMostSpecificCause(), e); + throw ErrorHandler.getMappable(e, "error.msg.unknown.data.integrity.issue", + "Unknown data integrity issue with resource: " + e.getMostSpecificCause()); } } @@ -269,8 +263,8 @@ public class RoleWritePlatformServiceJpaRepositoryImpl implements RoleWritePlatf return new CommandProcessingResultBuilder().withEntityId(roleId).build(); } catch (final JpaSystemException | DataIntegrityViolationException e) { - throw new PlatformDataIntegrityException("error.msg.unknown.data.integrity.issue", - "Unknown data integrity issue with resource: " + e.getMostSpecificCause(), e); + throw ErrorHandler.getMappable(e, "error.msg.unknown.data.integrity.issue", + "Unknown data integrity issue with resource: " + e.getMostSpecificCause()); } } } diff --git a/fineract-provider/src/test/java/org/apache/fineract/commands/service/CommandSourceServiceTest.java b/fineract-provider/src/test/java/org/apache/fineract/commands/service/CommandSourceServiceTest.java index 954d0bd50..6cf486bde 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/commands/service/CommandSourceServiceTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/commands/service/CommandSourceServiceTest.java @@ -23,7 +23,6 @@ import static org.mockito.ArgumentMatchers.any; import java.time.ZoneId; import java.util.Optional; -import org.apache.fineract.batch.exception.ErrorHandler; import org.apache.fineract.batch.exception.ErrorInfo; import org.apache.fineract.commands.domain.CommandSource; import org.apache.fineract.commands.domain.CommandSourceRepository; @@ -31,6 +30,7 @@ import org.apache.fineract.commands.domain.CommandWrapper; import org.apache.fineract.infrastructure.codes.exception.CodeNotFoundException; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant; +import org.apache.fineract.infrastructure.core.exception.ErrorHandler; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.useradministration.domain.AppUser; import org.junit.jupiter.api.AfterEach; @@ -40,6 +40,7 @@ import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.MockedStatic; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; @@ -108,7 +109,9 @@ public class CommandSourceServiceTest { @Test public void testGenerateErrorException() { - Mockito.when(errorHandler.getMappable(any())).thenAnswer(i -> i.getArguments()[0]); + try (MockedStatic mockedStatic = Mockito.mockStatic(ErrorHandler.class)) { + mockedStatic.when(() -> ErrorHandler.getMappable(any(CodeNotFoundException.class))).thenAnswer(i -> i.getArguments()[0]); + } Mockito.when(errorHandler.handle(any(CodeNotFoundException.class))) .thenReturn(new ErrorInfo(404, 1001, "Code with name `foo` does not exist", null)); ErrorInfo result = underTest.generateErrorInfo(new CodeNotFoundException("foo"));