From 20dcdbc1384a1173d7e63dd666d530908c845a1e Mon Sep 17 00:00:00 2001 From: Brinda Santh Date: Fri, 6 Mar 2020 13:04:37 -0500 Subject: Refactoring BP Code with ErrorCatalog Issue-ID: CCSDK-2124 Signed-off-by: Steve Siani Change-Id: Ief468a56f9e7b3ef86c357965aa7b15f0a4cfa22 --- ms/error-catalog/application/pom.xml | 7 +++ ms/error-catalog/core/pom.xml | 19 ++++++++ .../error/catalog/core/ErrorCatalogException.kt | 20 ++++++++ .../ccsdk/cds/error/catalog/core/ErrorCodes.kt | 6 +-- .../ccsdk/cds/error/catalog/core/ErrorLibData.kt | 10 +++- .../error/catalog/core/utils/ErrorCatalogUtils.kt | 41 ++++++++++++++++ ms/error-catalog/pom.xml | 57 ++++------------------ ms/error-catalog/services/pom.xml | 34 +++++++++++++ .../services/ErrorCatalogExceptionHandler.kt | 48 ++++++++++++++++++ .../error/catalog/services/ErrorCatalogService.kt | 16 ++++-- .../catalog/services/utils/ErrorCatalogUtils.kt | 39 --------------- 11 files changed, 202 insertions(+), 95 deletions(-) create mode 100644 ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/utils/ErrorCatalogUtils.kt delete mode 100644 ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/utils/ErrorCatalogUtils.kt (limited to 'ms/error-catalog') diff --git a/ms/error-catalog/application/pom.xml b/ms/error-catalog/application/pom.xml index c2a09dbdb..51d50b461 100644 --- a/ms/error-catalog/application/pom.xml +++ b/ms/error-catalog/application/pom.xml @@ -31,4 +31,11 @@ true + + + + org.onap.ccsdk.cds.error.catalog + error-catalog-services + + diff --git a/ms/error-catalog/core/pom.xml b/ms/error-catalog/core/pom.xml index 0592112cf..beebd5d1f 100644 --- a/ms/error-catalog/core/pom.xml +++ b/ms/error-catalog/core/pom.xml @@ -31,4 +31,23 @@ true + + + + org.springframework.boot + spring-boot-starter-webflux + + + com.fasterxml.jackson.module + jackson-module-kotlin + + + org.apache.commons + commons-lang3 + + + javax.persistence + javax.persistence-api + + diff --git a/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorCatalogException.kt b/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorCatalogException.kt index 032feb62c..348b60ceb 100644 --- a/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorCatalogException.kt +++ b/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorCatalogException.kt @@ -23,6 +23,8 @@ interface ErrorCatalogExceptionFluent { fun action(action: String): T fun http(type: String): T fun grpc(type: String): T + fun convertToHttp(): T + fun convertToGrpc(): T fun payloadMessage(message: String): T fun addErrorPayloadMessage(message: String): T fun addSubError(errorMessage: ErrorMessage): T @@ -78,12 +80,30 @@ open class ErrorCatalogException : RuntimeException { fun updateHttp(type: String): T { this.protocol = ErrorMessageLibConstants.ERROR_CATALOG_PROTOCOL_HTTP + this.name = type this.code = HttpErrorCodes.code(type) return this as T } + fun inverseToHttp(): T { + if (this.protocol != "" && this.protocol == ErrorMessageLibConstants.ERROR_CATALOG_PROTOCOL_GRPC) { + this.protocol = ErrorMessageLibConstants.ERROR_CATALOG_PROTOCOL_HTTP + this.code = HttpErrorCodes.code(this.name) + } + return this as T + } + + fun inverseToGrpc(): T { + if (this.protocol != "" && this.protocol == ErrorMessageLibConstants.ERROR_CATALOG_PROTOCOL_HTTP) { + this.protocol = ErrorMessageLibConstants.ERROR_CATALOG_PROTOCOL_GRPC + this.code = GrpcErrorCodes.code(this.name) + } + return this as T + } + fun updateGrpc(type: String): T { this.protocol = ErrorMessageLibConstants.ERROR_CATALOG_PROTOCOL_GRPC + this.name = type this.code = GrpcErrorCodes.code(type) return this as T } diff --git a/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorCodes.kt b/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorCodes.kt index 86483e3e9..8023d97c8 100644 --- a/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorCodes.kt +++ b/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorCodes.kt @@ -54,8 +54,7 @@ object HttpErrorCodes { } fun code(type: String): Int { - // FIXME("Return Default Error Code , If missing") - return store[type]!! + return store[type] ?: store[ErrorCatalogCodes.GENERIC_FAILURE]!! } } @@ -82,7 +81,6 @@ object GrpcErrorCodes { } fun code(type: String): Int { - // FIXME("Return Default Error Code , If missing") - return store[type]!! + return store[type] ?: store[ErrorCatalogCodes.GENERIC_FAILURE]!! } } diff --git a/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorLibData.kt b/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorLibData.kt index 2c0772e31..4158cfaf8 100644 --- a/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorLibData.kt +++ b/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorLibData.kt @@ -20,12 +20,15 @@ import com.fasterxml.jackson.annotation.JsonFormat import org.slf4j.event.Level import org.onap.ccsdk.cds.error.catalog.core.ErrorMessageLibConstants.ERROR_CATALOG_DEFAULT_ERROR_CODE import java.time.LocalDateTime +import java.time.ZoneId +import java.util.Date +import kotlin.collections.ArrayList open class ErrorPayload { var code: Int = ERROR_CATALOG_DEFAULT_ERROR_CODE var status: String = "" @get:JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") - var timestamp: LocalDateTime = LocalDateTime.now() + var timestamp: Date = controllerDate() var message: String = "" var debugMessage: String = "" var logLevel: String = Level.ERROR.name @@ -68,6 +71,11 @@ open class ErrorPayload { this.logLevel == errorPayload.logLevel && this.debugMessage == errorPayload.debugMessage && this.subErrors == errorPayload.subErrors) } + + private fun controllerDate(): Date { + val localDateTime = LocalDateTime.now(ZoneId.systemDefault()) + return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()) + } } /** diff --git a/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/utils/ErrorCatalogUtils.kt b/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/utils/ErrorCatalogUtils.kt new file mode 100644 index 000000000..f13a3604f --- /dev/null +++ b/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/utils/ErrorCatalogUtils.kt @@ -0,0 +1,41 @@ +/* + * Copyright © 2020 IBM, Bell Canada. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onap.ccsdk.cds.error.catalog.core.utils + +import org.apache.commons.lang3.exception.ExceptionUtils + +object ErrorCatalogUtils { + private const val REGEX_PATTERN = "^cause=(.*),action=(.*)" + private val regex = REGEX_PATTERN.toRegex() + + fun readErrorCauseFromMessage(message: String): String { + val matchResults = regex.matchEntire(message) + return matchResults!!.groupValues[1] + } + + fun readErrorActionFromMessage(message: String): String { + val matchResults = regex.matchEntire(message) + return matchResults!!.groupValues[2] + } +} + +fun Exception.errorCauseOrDefault(): Throwable { + return ExceptionUtils.getRootCause(this) +} + +fun Exception.errorMessageOrDefault(): String { + return this.message ?: "" +} diff --git a/ms/error-catalog/pom.xml b/ms/error-catalog/pom.xml index 8b82d7d75..31e765878 100644 --- a/ms/error-catalog/pom.xml +++ b/ms/error-catalog/pom.xml @@ -37,17 +37,21 @@ services + + ${project.version} + + org.onap.ccsdk.cds.error.catalog error-catalog-core - ${project.version} + ${error-catalog.version} org.onap.ccsdk.cds.error.catalog error-catalog-services - ${project.version} + ${error-catalog.version} @@ -55,70 +59,29 @@ org.jetbrains.kotlin - kotlin-stdlib + kotlin-stdlib-jdk8 org.jetbrains.kotlin - kotlin-stdlib-common + kotlin-reflect org.jetbrains.kotlin - kotlin-script-util + kotlin-stdlib org.jetbrains.kotlin - kotlin-stdlib-jdk8 - - - org.jetbrains.kotlinx - kotlinx-coroutines-core - - - org.jetbrains.kotlinx - kotlinx-coroutines-reactor - - - com.fasterxml.jackson.module - jackson-module-kotlin + kotlin-stdlib-common org.jetbrains.kotlin kotlin-compiler-embeddable - - org.jetbrains.kotlin - kotlin-scripting-jvm-host - - - - - org.jetbrains.kotlin - kotlin-compiler - - - - - org.springframework.boot - spring-boot-starter-webflux - - - javax.persistence - javax.persistence-api - - - org.springframework.boot - spring-boot-starter-data-jpa - org.springframework.boot spring-boot-starter-test test - - io.projectreactor - reactor-test - test - diff --git a/ms/error-catalog/services/pom.xml b/ms/error-catalog/services/pom.xml index a0a1ba9b1..591b34d23 100644 --- a/ms/error-catalog/services/pom.xml +++ b/ms/error-catalog/services/pom.xml @@ -37,5 +37,39 @@ org.onap.ccsdk.cds.error.catalog error-catalog-core + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.jetbrains.kotlin + kotlin-scripting-jvm-host + + + + + org.jetbrains.kotlin + kotlin-compiler + + + + + org.jetbrains.kotlinx + kotlinx-coroutines-core + + + org.jetbrains.kotlinx + kotlinx-coroutines-reactor + + + org.jetbrains.kotlin + kotlin-script-util + + + + io.projectreactor + reactor-test + test + diff --git a/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogExceptionHandler.kt b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogExceptionHandler.kt index 88e2f4522..258209f71 100644 --- a/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogExceptionHandler.kt +++ b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogExceptionHandler.kt @@ -16,10 +16,18 @@ package org.onap.ccsdk.cds.error.catalog.services +import org.onap.ccsdk.cds.error.catalog.core.ErrorCatalogCodes import org.onap.ccsdk.cds.error.catalog.core.ErrorCatalogException import org.onap.ccsdk.cds.error.catalog.core.ErrorPayload +import org.onap.ccsdk.cds.error.catalog.core.HttpErrorCodes +import org.onap.ccsdk.cds.error.catalog.core.utils.errorCauseOrDefault +import org.onap.ccsdk.cds.error.catalog.core.utils.errorMessageOrDefault +import org.springframework.dao.EmptyResultDataAccessException +import org.springframework.dao.IncorrectResultSizeDataAccessException import org.springframework.http.ResponseEntity +import org.springframework.orm.jpa.JpaObjectRetrievalFailureException import org.springframework.web.bind.annotation.ExceptionHandler +import org.springframework.web.server.ServerWebInputException abstract class ErrorCatalogExceptionHandler(private val errorCatalogService: ErrorCatalogService) { @@ -28,4 +36,44 @@ abstract class ErrorCatalogExceptionHandler(private val errorCatalogService: Err val errorPayload = errorCatalogService.errorPayload(e) return errorPayload.toResponseEntity() } + + @ExceptionHandler + fun errorCatalogException(e: ServerWebInputException): ResponseEntity { + val error = ErrorCatalogException(HttpErrorCodes.code(ErrorCatalogCodes.REQUEST_NOT_FOUND), + e.errorMessageOrDefault(), e.errorCauseOrDefault()) + val errorPayload = ErrorPayload(error.code, error.name, error.errorMessageOrDefault()) + return errorPayload.toResponseEntity() + } + + @ExceptionHandler + fun errorCatalogException(e: IncorrectResultSizeDataAccessException): ResponseEntity { + val error = ErrorCatalogException(HttpErrorCodes.code(ErrorCatalogCodes.DUPLICATE_DATA), + e.errorMessageOrDefault(), e.errorCauseOrDefault()) + val errorPayload = ErrorPayload(error.code, error.name, error.errorMessageOrDefault()) + return errorPayload.toResponseEntity() + } + + @ExceptionHandler + fun errorCatalogException(e: EmptyResultDataAccessException): ResponseEntity { + val error = ErrorCatalogException(HttpErrorCodes.code(ErrorCatalogCodes.RESOURCE_NOT_FOUND), + e.errorMessageOrDefault(), e.errorCauseOrDefault()) + val errorPayload = ErrorPayload(error.code, error.name, error.errorMessageOrDefault()) + return errorPayload.toResponseEntity() + } + + @ExceptionHandler + fun errorCatalogException(e: JpaObjectRetrievalFailureException): ResponseEntity { + val error = ErrorCatalogException(HttpErrorCodes.code(ErrorCatalogCodes.RESOURCE_NOT_FOUND), + e.errorMessageOrDefault(), e.errorCauseOrDefault()) + val errorPayload = ErrorPayload(error.code, error.name, error.errorMessageOrDefault()) + return errorPayload.toResponseEntity() + } + + @ExceptionHandler + fun errorCatalogException(e: Exception): ResponseEntity { + val error = ErrorCatalogException(HttpErrorCodes.code(ErrorCatalogCodes.GENERIC_FAILURE), + e.errorMessageOrDefault(), e.errorCauseOrDefault()) + val errorPayload = ErrorPayload(error.code, error.name, error.errorMessageOrDefault()) + return errorPayload.toResponseEntity() + } } diff --git a/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogService.kt b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogService.kt index 91f817133..21fd51b2f 100644 --- a/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogService.kt +++ b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogService.kt @@ -24,7 +24,8 @@ import org.onap.ccsdk.cds.error.catalog.core.ErrorMessageLibConstants import org.onap.ccsdk.cds.error.catalog.core.ErrorPayload import org.onap.ccsdk.cds.error.catalog.core.GrpcErrorCodes import org.onap.ccsdk.cds.error.catalog.core.HttpErrorCodes -import org.onap.ccsdk.cds.error.catalog.services.utils.ErrorCatalogUtils +import org.onap.ccsdk.cds.error.catalog.core.utils.ErrorCatalogUtils +import org.apache.commons.lang3.exception.ExceptionUtils import org.springframework.boot.autoconfigure.condition.ConditionalOnBean import org.springframework.stereotype.Service import javax.annotation.PostConstruct @@ -40,10 +41,17 @@ open class ErrorCatalogService(private var errorCatalogLoadService: ErrorCatalog fun errorPayload(errorCatalogException: ErrorCatalogException): ErrorPayload { val errorCatalog = getErrorCatalog(errorCatalogException) - val errorPayload = ErrorPayload(errorCatalog.code, errorCatalog.errorId, errorCatalog.getMessage()) - errorPayload.subErrors.addAll(errorCatalogException.errorPayload!!.subErrors) + val errorPayload: ErrorPayload + if (errorCatalogException.errorPayload == null) { + errorPayload = ErrorPayload(errorCatalog.code, errorCatalog.errorId, errorCatalog.getMessage()) + } else { + errorPayload = errorCatalogException.errorPayload!! + errorPayload.code = errorCatalog.code + errorPayload.message = errorCatalog.getMessage() + errorPayload.status = errorCatalog.errorId + } if (errorCatalogException.cause != null) { - errorPayload.debugMessage = errorCatalogException.cause!!.printStackTrace().toString() + errorPayload.debugMessage = ExceptionUtils.getStackTrace(errorCatalogException.cause) } return errorPayload } diff --git a/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/utils/ErrorCatalogUtils.kt b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/utils/ErrorCatalogUtils.kt deleted file mode 100644 index 967d3560c..000000000 --- a/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/utils/ErrorCatalogUtils.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright © 2020 IBM, Bell Canada. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.onap.ccsdk.cds.error.catalog.services.utils - -object ErrorCatalogUtils { - private const val REGEX_PATTERN = "^cause=(.*),action=(.*)" - private val regex = REGEX_PATTERN.toRegex() - - fun readErrorCauseFromMessage(message: String): String { - val matchResults = regex.matchEntire(message) - return matchResults!!.groupValues[1] - } - - fun readErrorActionFromMessage(message: String): String { - val matchResults = regex.matchEntire(message) - return matchResults!!.groupValues[2] - } -} - -fun Exception.errorCauseOrDefault(): Throwable { - return this.cause ?: Throwable() -} - -fun Exception.errorMessageOrDefault(): String { - return this.message ?: "" -} -- cgit 1.2.3-korg