diff options
Diffstat (limited to 'ms/error-catalog')
21 files changed, 1342 insertions, 0 deletions
diff --git a/ms/error-catalog/README.md b/ms/error-catalog/README.md new file mode 100755 index 000000000..1df859574 --- /dev/null +++ b/ms/error-catalog/README.md @@ -0,0 +1,40 @@ +## How to use library + +##### 1. Set Error Catalog service type (Database or properties file service) in application.properties file + +``` +##### Error Managements ##### +## For database service type ## +# error.catalog.type=DB +## For database service type ## +# error.catalog.type=properties +error.catalog.applicationId=cds +error.catalog.type=properties +error.catalog.errorDefinitionDir=/opt/app/onap/config +``` + +##### 2. Generate exception + +- HTTP Error Exception +``` +errorCatalogException: ErrorCatalogException = httpProcessorException(ErrorCatalogCodes.ERROR_TYPE, +"Error message here...") +``` + +- GRPC Error Exception +``` +errorCatalogException: ErrorCatalogException = grpcProcessorException(ErrorCatalogCodes.ERROR_TYPE, +"Error message here...") +``` + +##### 3. Update an existing exception +``` +e = errorCatalogException.code(500) +e = errorCatalogException.action("message") +... +``` + +##### 4. Add a HTTP REST Exception handler +@RestControllerAdvice("domain.here") +open class ExceptionHandler(private val errorCatalogService: ErrorCatalogService) : + ErrorCatalogExceptionHandler(errorCatalogService)
\ No newline at end of file diff --git a/ms/error-catalog/application/pom.xml b/ms/error-catalog/application/pom.xml new file mode 100644 index 000000000..4e1a6f3f1 --- /dev/null +++ b/ms/error-catalog/application/pom.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Copyright © 2018-2019 AT&T Intellectual Property. + ~ + ~ 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. + --> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.onap.ccsdk.cds.error.catalog</groupId> + <artifactId>error-catalog</artifactId> + <version>0.7.0-SNAPSHOT</version> + </parent> + + <artifactId>error-catalog-application</artifactId> + + <name>Error Catalog Application</name> + <description>Error Catalog Application</description> +</project> diff --git a/ms/error-catalog/core/pom.xml b/ms/error-catalog/core/pom.xml new file mode 100644 index 000000000..f117aa83f --- /dev/null +++ b/ms/error-catalog/core/pom.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Copyright © 2018-2019 AT&T Intellectual Property. + ~ + ~ 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. + --> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.onap.ccsdk.cds.error.catalog</groupId> + <artifactId>error-catalog</artifactId> + <version>0.7.0-SNAPSHOT</version> + </parent> + + <artifactId>error-catalog-core</artifactId> + + <name>Error Catalog Core</name> + <description>Error Catalog Core</description> +</project> 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 new file mode 100644 index 000000000..032feb62c --- /dev/null +++ b/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorCatalogException.kt @@ -0,0 +1,112 @@ +/* + * Copyright © 2020 IBM, Bell Canada. + * Modifications Copyright © 2019-2020 AT&T Intellectual Property. + * + * 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 + +interface ErrorCatalogExceptionFluent<T> { + fun code(code: Int): T + fun domain(domain: String): T + fun action(action: String): T + fun http(type: String): T + fun grpc(type: String): T + fun payloadMessage(message: String): T + fun addErrorPayloadMessage(message: String): T + fun addSubError(errorMessage: ErrorMessage): T +} + +open class ErrorCatalogException : RuntimeException { + var code: Int = -1 + var domain: String = "" + var name: String = ErrorCatalogCodes.GENERIC_FAILURE + var action: String = "" + var errorPayload: ErrorPayload? = null + var protocol: String = "" + var errorPayloadMessages: MutableList<String>? = null + + val messageSeparator = "${System.lineSeparator()} -> " + + constructor(message: String, cause: Throwable) : super(message, cause) + constructor(message: String) : super(message) + constructor(cause: Throwable) : super(cause) + constructor(cause: Throwable, message: String, vararg args: Any?) : super(format(message, *args), cause) + + constructor(code: Int, cause: Throwable) : super(cause) { + this.code = code + } + + constructor(code: Int, message: String) : super(message) { + this.code = code + } + + constructor(code: Int, message: String, cause: Throwable) : super(message, cause) { + this.code = code + } + + constructor(code: Int, cause: Throwable, message: String, vararg args: Any?) : + super(String.format(message, *args), cause) { + this.code = code + } + + open fun <T : ErrorCatalogException> updateCode(code: Int): T { + this.code = code + return this as T + } + + open fun <T : ErrorCatalogException> updateDomain(domain: String): T { + this.domain = domain + return this as T + } + + open fun <T : ErrorCatalogException> updateAction(action: String): T { + this.action = action + return this as T + } + + fun <T : ErrorCatalogException> updateHttp(type: String): T { + this.protocol = ErrorMessageLibConstants.ERROR_CATALOG_PROTOCOL_HTTP + this.code = HttpErrorCodes.code(type) + return this as T + } + + fun <T : ErrorCatalogException> updateGrpc(type: String): T { + this.protocol = ErrorMessageLibConstants.ERROR_CATALOG_PROTOCOL_GRPC + this.code = GrpcErrorCodes.code(type) + return this as T + } + + fun <T : ErrorCatalogException> updatePayloadMessage(message: String): T { + if (this.errorPayloadMessages == null) this.errorPayloadMessages = arrayListOf() + this.errorPayloadMessages!!.add(message) + return this as T + } + + fun <T : ErrorCatalogException> updateErrorPayloadMessage(message: String): T { + if (errorPayload == null) { + errorPayload = ErrorPayload() + } + errorPayload!!.message = "${errorPayload!!.message} $messageSeparator $message" + return this as T + } + + fun <T : ErrorCatalogException> updateSubError(errorMessage: ErrorMessage): T { + if (errorPayload == null) { + errorPayload = ErrorPayload() + } + errorPayload!!.subErrors.add(errorMessage) + return this as T + } +} diff --git a/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorCatalogExtensions.kt b/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorCatalogExtensions.kt new file mode 100644 index 000000000..65c547245 --- /dev/null +++ b/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorCatalogExtensions.kt @@ -0,0 +1,32 @@ +/* + * Copyright © 2018-2019 AT&T Intellectual Property. + * + * 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 + +import org.slf4j.LoggerFactory +import org.slf4j.helpers.MessageFormatter +import kotlin.reflect.KClass + +fun <T : Any> logger(clazz: T) = LoggerFactory.getLogger(clazz.javaClass)!! + +fun <T : KClass<*>> logger(clazz: T) = LoggerFactory.getLogger(clazz.java)!! + +fun format(message: String, vararg args: Any?): String { + if (args != null && args.isNotEmpty()) { + return MessageFormatter.arrayFormat(message, args).message + } + return message +} 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 new file mode 100644 index 000000000..86483e3e9 --- /dev/null +++ b/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorCodes.kt @@ -0,0 +1,88 @@ +/* + * Copyright © 2018-2019 AT&T Intellectual Property. + * + * 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 + +object ErrorCatalogCodes { + const val GENERIC_FAILURE = "GENERIC_FAILURE" + const val GENERIC_PROCESS_FAILURE = "GENERIC_PROCESS_FAILURE" + const val INVALID_FILE_EXTENSION = "INVALID_FILE_EXTENSION" + const val RESOURCE_NOT_FOUND = "RESOURCE_NOT_FOUND" + const val RESOURCE_PATH_MISSING = "RESOURCE_PATH_MISSING" + const val RESOURCE_WRITING_FAIL = "RESOURCE_WRITING_FAIL" + const val IO_FILE_INTERRUPT = "IO_FILE_INTERRUPT" + const val INVALID_REQUEST_FORMAT = "INVALID_REQUEST_FORMAT" + const val UNAUTHORIZED_REQUEST = "UNAUTHORIZED_REQUEST" + const val REQUEST_NOT_FOUND = "REQUEST_NOT_FOUND" + const val CONFLICT_ADDING_RESOURCE = "CONFLICT_ADDING_RESOURCE" + const val DUPLICATE_DATA = "DUPLICATE_DATA" +} + +object HttpErrorCodes { + private val store: MutableMap<String, Int> = mutableMapOf() + + init { + store[ErrorCatalogCodes.GENERIC_FAILURE] = 500 + store[ErrorCatalogCodes.GENERIC_PROCESS_FAILURE] = 500 + store[ErrorCatalogCodes.INVALID_FILE_EXTENSION] = 415 + store[ErrorCatalogCodes.RESOURCE_NOT_FOUND] = 404 + store[ErrorCatalogCodes.RESOURCE_PATH_MISSING] = 503 + store[ErrorCatalogCodes.RESOURCE_WRITING_FAIL] = 503 + store[ErrorCatalogCodes.IO_FILE_INTERRUPT] = 503 + store[ErrorCatalogCodes.INVALID_REQUEST_FORMAT] = 400 + store[ErrorCatalogCodes.UNAUTHORIZED_REQUEST] = 401 + store[ErrorCatalogCodes.REQUEST_NOT_FOUND] = 404 + store[ErrorCatalogCodes.CONFLICT_ADDING_RESOURCE] = 409 + store[ErrorCatalogCodes.DUPLICATE_DATA] = 409 + } + + fun register(type: String, code: Int) { + store[type] = code + } + + fun code(type: String): Int { + // FIXME("Return Default Error Code , If missing") + return store[type]!! + } +} + +object GrpcErrorCodes { + private val store: MutableMap<String, Int> = mutableMapOf() + + init { + store[ErrorCatalogCodes.GENERIC_FAILURE] = 2 + store[ErrorCatalogCodes.GENERIC_PROCESS_FAILURE] = 2 + store[ErrorCatalogCodes.INVALID_FILE_EXTENSION] = 3 + store[ErrorCatalogCodes.RESOURCE_NOT_FOUND] = 5 + store[ErrorCatalogCodes.RESOURCE_PATH_MISSING] = 3 + store[ErrorCatalogCodes.RESOURCE_WRITING_FAIL] = 9 + store[ErrorCatalogCodes.IO_FILE_INTERRUPT] = 3 + store[ErrorCatalogCodes.INVALID_REQUEST_FORMAT] = 3 + store[ErrorCatalogCodes.UNAUTHORIZED_REQUEST] = 16 + store[ErrorCatalogCodes.REQUEST_NOT_FOUND] = 8 + store[ErrorCatalogCodes.CONFLICT_ADDING_RESOURCE] = 10 + store[ErrorCatalogCodes.DUPLICATE_DATA] = 11 + } + + fun register(type: String, code: Int) { + store[type] = code + } + + fun code(type: String): Int { + // FIXME("Return Default Error Code , If missing") + return store[type]!! + } +} 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 new file mode 100644 index 000000000..2c0772e31 --- /dev/null +++ b/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorLibData.kt @@ -0,0 +1,94 @@ +/* + * 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 + +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 + +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 message: String = "" + var debugMessage: String = "" + var logLevel: String = Level.ERROR.name + val subErrors: ArrayList<ErrorMessage> = ArrayList() + + constructor() + + constructor( + code: Int = ERROR_CATALOG_DEFAULT_ERROR_CODE, + status: String, + message: String, + logLevel: String = Level.ERROR.name, + debugMessage: String = "" + ) { + this.code = code + this.status = status + this.message = message + this.logLevel = logLevel + this.debugMessage = debugMessage + } + + constructor( + code: Int = ERROR_CATALOG_DEFAULT_ERROR_CODE, + status: String, + message: String, + logLevel: String = Level.ERROR.name, + debugMessage: String = "", + errorMessage: ErrorMessage + ) { + this.code = code + this.status = status + this.message = message + this.logLevel = logLevel + this.debugMessage = debugMessage + this.subErrors.add(errorMessage) + } + + fun isEqualTo(errorPayload: ErrorPayload): Boolean { + return (this.code == errorPayload.code && this.status == errorPayload.status && this.message == errorPayload.message && + this.logLevel == errorPayload.logLevel && this.debugMessage == errorPayload.debugMessage && + this.subErrors == errorPayload.subErrors) + } +} + +/** + * + * + * @author Steve Siani + */ +data class ErrorMessage( + val domainId: String, + val message: String, + val cause: String +) + +data class ErrorCatalog( + val errorId: String, + val domainId: String, + val code: Int, + val action: String, + val cause: String +) { + fun getMessage(): String { + return "Cause: $cause ${System.lineSeparator()} Action : $action" + } +} diff --git a/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorMessageLibConstants.kt b/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorMessageLibConstants.kt new file mode 100644 index 000000000..6570e3e66 --- /dev/null +++ b/ms/error-catalog/core/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/core/ErrorMessageLibConstants.kt @@ -0,0 +1,31 @@ +/* + * 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 + +object ErrorMessageLibConstants { + const val ERROR_CATALOG_DOMAIN = "org.onap.ccsdk.cds.error.catalog" + const val ERROR_CATALOG_TYPE = "error.catalog.type" + const val ERROR_CATALOG_TYPE_PROPERTIES = "properties" + const val ERROR_CATALOG_TYPE_DB = "DB" + const val ERROR_CATALOG_PROPERTIES_FILENAME = "error-messages_en.properties" + const val ERROR_CATALOG_PROPERTIES_DIRECTORY = "/opt/app/onap/config/" + const val ERROR_CATALOG_MODELS = "org.onap.ccsdk.cds.error.catalog.domain" + const val ERROR_CATALOG_REPOSITORY = "org.onap.ccsdk.cds.error.catalog.repository" + const val ERROR_CATALOG_DEFAULT_ERROR_CODE = 500 + const val ERROR_CATALOG_PROTOCOL_HTTP = "http" + const val ERROR_CATALOG_PROTOCOL_GRPC = "grpc" +} diff --git a/ms/error-catalog/pom.xml b/ms/error-catalog/pom.xml new file mode 100644 index 000000000..1e6707a75 --- /dev/null +++ b/ms/error-catalog/pom.xml @@ -0,0 +1,157 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Copyright © 2018-2019 AT&T Intellectual Property. + ~ + ~ 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. + --> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.onap.ccsdk.cds</groupId> + <artifactId>ms</artifactId> + <version>0.7.0-SNAPSHOT</version> + <relativePath>..</relativePath> + </parent> + + <groupId>org.onap.ccsdk.cds.error.catalog</groupId> + <artifactId>error-catalog</artifactId> + <packaging>pom</packaging> + + <name>Error Catalog Lib</name> + <description>Error Catalog Lib for ONAP Components</description> + + <modules> + <module>application</module> + <module>core</module> + <module>services</module> + </modules> + + <dependencyManagement> + <dependencies> + <dependency> + <groupId>org.onap.ccsdk.cds.error.catalog</groupId> + <artifactId>error-catalog-core</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.onap.ccsdk.cds.error.catalog</groupId> + <artifactId>error-catalog-services</artifactId> + <version>${project.version}</version> + </dependency> + </dependencies> + </dependencyManagement> + <dependencies> + <!-- Kotlin Dependencies --> + <dependency> + <groupId>org.jetbrains.kotlin</groupId> + <artifactId>kotlin-stdlib</artifactId> + </dependency> + <dependency> + <groupId>org.jetbrains.kotlin</groupId> + <artifactId>kotlin-stdlib-common</artifactId> + </dependency> + <dependency> + <groupId>org.jetbrains.kotlin</groupId> + <artifactId>kotlin-script-util</artifactId> + </dependency> + <dependency> + <groupId>org.jetbrains.kotlin</groupId> + <artifactId>kotlin-stdlib-jdk8</artifactId> + </dependency> + <dependency> + <groupId>org.jetbrains.kotlinx</groupId> + <artifactId>kotlinx-coroutines-core</artifactId> + </dependency> + <dependency> + <groupId>org.jetbrains.kotlinx</groupId> + <artifactId>kotlinx-coroutines-reactor</artifactId> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.module</groupId> + <artifactId>jackson-module-kotlin</artifactId> + </dependency> + <dependency> + <groupId>org.jetbrains.kotlin</groupId> + <artifactId>kotlin-compiler-embeddable</artifactId> + </dependency> + <dependency> + <groupId>org.jetbrains.kotlin</groupId> + <artifactId>kotlin-scripting-jvm-host</artifactId> + <!--Use kotlin-compiler-embeddable as koltin-compiler wrap--> + <!--guava dependency creating classpath issues at runtime--> + <exclusions> + <exclusion> + <groupId>org.jetbrains.kotlin</groupId> + <artifactId>kotlin-compiler</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-webflux</artifactId> + </dependency> + <dependency> + <groupId>javax.persistence</groupId> + <artifactId>javax.persistence-api</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-jpa</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>io.projectreactor</groupId> + <artifactId>reactor-test</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.jetbrains.kotlin</groupId> + <artifactId>kotlin-maven-plugin</artifactId> + <version>${kotlin.maven.version}</version> + <executions> + <execution> + <id>compile</id> + <goals> + <goal>compile</goal> + </goals> + <configuration> + <sourceDirs> + <sourceDir>src/main/kotlin</sourceDir> + </sourceDirs> + </configuration> + </execution> + <execution> + <id>test-compile</id> + <goals> + <goal>test-compile</goal> + </goals> + <configuration> + <sourceDirs> + <sourceDir>${project.basedir}/src/test/kotlin</sourceDir> + </sourceDirs> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> +</project> diff --git a/ms/error-catalog/services/pom.xml b/ms/error-catalog/services/pom.xml new file mode 100644 index 000000000..6fcf158f5 --- /dev/null +++ b/ms/error-catalog/services/pom.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Copyright © 2018-2019 AT&T Intellectual Property. + ~ + ~ 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. + --> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.onap.ccsdk.cds.error.catalog</groupId> + <artifactId>error-catalog</artifactId> + <version>0.7.0-SNAPSHOT</version> + </parent> + + <artifactId>error-catalog-services</artifactId> + + <name>Error Catalog Service</name> + <description>Error Catalog Service</description> + + <dependencies> + <dependency> + <groupId>org.onap.ccsdk.cds.error.catalog</groupId> + <artifactId>error-catalog-core</artifactId> + </dependency> + </dependencies> +</project> diff --git a/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogConfiguration.kt b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogConfiguration.kt new file mode 100644 index 000000000..f0a75e087 --- /dev/null +++ b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogConfiguration.kt @@ -0,0 +1,34 @@ +/* + * Copyright © 2020 IBM, Bell Canada. + * Modifications Copyright © 2019-2020 AT&T Intellectual Property. + * + * 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 + +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.boot.context.properties.EnableConfigurationProperties +import org.springframework.context.annotation.Configuration +import org.springframework.stereotype.Component + +@Configuration +@EnableConfigurationProperties(ErrorCatalogProperties::class) +open class ErrorCatalogConfiguration + +@Component +@ConfigurationProperties(prefix = "error.catalog") +open class ErrorCatalogProperties { + lateinit var type: String + lateinit var applicationId: String + var errorDefinitionDir: String? = null +} diff --git a/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogDBService.kt b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogDBService.kt new file mode 100644 index 000000000..95b44e683 --- /dev/null +++ b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogDBService.kt @@ -0,0 +1,98 @@ +/* + * Copyright © 2020 IBM, Bell Canada. + * Modifications Copyright © 2019-2020 AT&T Intellectual Property. + * + * 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 + +import org.onap.ccsdk.cds.error.catalog.core.ErrorMessageLibConstants +import org.onap.ccsdk.cds.error.catalog.services.domain.Domain +import org.onap.ccsdk.cds.error.catalog.services.domain.ErrorMessageModel +import org.onap.ccsdk.cds.error.catalog.services.repository.DomainRepository +import org.onap.ccsdk.cds.error.catalog.services.repository.ErrorMessageModelRepository +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty +import org.springframework.data.domain.Page +import org.springframework.data.domain.Pageable +import org.springframework.stereotype.Service + +@Service +@ConditionalOnProperty( + name = [ErrorMessageLibConstants.ERROR_CATALOG_TYPE], + havingValue = ErrorMessageLibConstants.ERROR_CATALOG_TYPE_DB +) +open class ErrorCatalogDBService( + private val domainRepository: DomainRepository, + private val errorMessageModelRepository: ErrorMessageModelRepository +) { + + /** + * This is a getAllDomains method to retrieve all the Domain in Error Catalog Database by pages + * + * @return Page<Domain> list of the domains by page + </Domain> */ + open fun getAllDomains(pageRequest: Pageable): Page<Domain> { + return domainRepository.findAll(pageRequest) + } + + /** + * This is a getAllDomains method to retrieve all the Domain in Error Catalog Database + * + * @return List<Domain> list of the domains + </Domain> */ + open fun getAllDomains(): List<Domain> { + return domainRepository.findAll() + } + + /** + * This is a getAllDomainsByApplication method to retrieve all the Domain that belong to an application in Error Catalog Database + * + * @return List<Domain> list of the domains + </Domain> */ + open fun getAllDomainsByApplication(applicationId: String): List<Domain> { + return domainRepository.findAllByApplicationId(applicationId) + } + + /** + * This is a getAllErrorMessagesByApplication method to retrieve all the Messages that belong to an application in Error Catalog Database + * + * @return MutableMap<String, ErrorCode> list of the abstractErrorModel + </Domain> */ + open fun getAllErrorMessagesByApplication(applicationId: String): MutableMap<String, ErrorMessageModel> { + val domains = domainRepository.findAllByApplicationId(applicationId) + val errorMessages = mutableMapOf<String, ErrorMessageModel>() + for (domain in domains) { + val errorMessagesFound = errorMessageModelRepository.findByDomainsId(domain.id) + for (errorMessageFound in errorMessagesFound) { + errorMessages["${domain.name}$MESSAGE_KEY_SEPARATOR${errorMessageFound.messageID}"] = errorMessageFound + } + } + return errorMessages + } + + open fun saveDomain( + domain: String, + applicationId: String, + description: String = "", + errorMessageList: List<ErrorMessageModel> + ) { + val domainModel = Domain(domain, applicationId, description) + domainModel.errorMessages.addAll(errorMessageList) + domainRepository.saveAndFlush(domainModel) + } + + companion object { + private const val MESSAGE_KEY_SEPARATOR = "." + } +} 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 new file mode 100644 index 000000000..88e2f4522 --- /dev/null +++ b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogExceptionHandler.kt @@ -0,0 +1,31 @@ +/* + * 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 + +import org.onap.ccsdk.cds.error.catalog.core.ErrorCatalogException +import org.onap.ccsdk.cds.error.catalog.core.ErrorPayload +import org.springframework.http.ResponseEntity +import org.springframework.web.bind.annotation.ExceptionHandler + +abstract class ErrorCatalogExceptionHandler(private val errorCatalogService: ErrorCatalogService) { + + @ExceptionHandler(ErrorCatalogException::class) + fun errorCatalogException(e: ErrorCatalogException): ResponseEntity<ErrorPayload> { + val errorPayload = errorCatalogService.errorPayload(e) + return errorPayload.toResponseEntity() + } +} diff --git a/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogLoadService.kt b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogLoadService.kt new file mode 100644 index 000000000..ca7d72b50 --- /dev/null +++ b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogLoadService.kt @@ -0,0 +1,147 @@ +/* + * Copyright © 2020 IBM, Bell Canada. + * Modifications Copyright © 2019-2020 AT&T Intellectual Property. + * + * 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 + +import org.onap.ccsdk.cds.error.catalog.core.ErrorMessageLibConstants +import org.onap.ccsdk.cds.error.catalog.core.logger +import org.onap.ccsdk.cds.error.catalog.services.domain.ErrorMessageModel +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty +import org.springframework.stereotype.Service +import java.io.File +import java.io.FileNotFoundException +import java.io.IOException +import java.io.InputStream +import java.nio.file.Paths +import java.util.Properties + +interface ErrorCatalogLoadService { + + suspend fun loadErrorCatalog() + + fun getErrorMessage(domain: String, key: String): String? + + fun getErrorMessage(attribute: String): String? +} + +/** + * Representation of Blueprint Error Message lib from database service to load the properties + */ +@Service +@ConditionalOnBean(ErrorCatalogDBService::class) +open class ErrorCatalogLoadDBService( + private var errorCatalogProperties: ErrorCatalogProperties, + private var errorCatalogDBService: ErrorCatalogDBService +) : ErrorCatalogLoadService { + + private var log = logger(ErrorCatalogLoadDBService::class) + + lateinit var errorMessageInDB: Map<String, ErrorMessageModel> + + override suspend fun loadErrorCatalog() { + log.info("Application ID: ${errorCatalogProperties.applicationId} > Initializing error catalog message from database...") + errorMessageInDB = getErrorMessagesFromDB() + } + + override fun getErrorMessage(domain: String, key: String): String? { + return getErrorMessage("$domain.${key.toLowerCase()}") + } + + override fun getErrorMessage(attribute: String): String? { + val errorMessage = findErrorMessage(attribute) + return prepareErrorMessage(errorMessage) + } + + /** + * Parses the error-messages.properties file which contains error messages + */ + private suspend fun getErrorMessagesFromDB(): Map<String, ErrorMessageModel> { + return errorCatalogDBService.getAllErrorMessagesByApplication(errorCatalogProperties.applicationId) + } + + private fun findErrorMessage(attribute: String): ErrorMessageModel? { + return if (errorMessageInDB.containsKey(attribute)) { + errorMessageInDB[attribute] + } else { + null + } + } + + private fun prepareErrorMessage(errorMessage: ErrorMessageModel?): String? { + return if (errorMessage != null) { + "cause=${errorMessage.cause}, action=${errorMessage.action}" + } else { + null + } + } +} + +/** + * Representation of Blueprint Error Message lib property service to load the properties + */ +@Service +@ConditionalOnProperty( + name = [ErrorMessageLibConstants.ERROR_CATALOG_TYPE], + havingValue = ErrorMessageLibConstants.ERROR_CATALOG_TYPE_PROPERTIES +) +open class ErrorCatalogLoadPropertyService(private var errorCatalogProperties: ErrorCatalogProperties) : + ErrorCatalogLoadService { + + private val propertyFileName = ErrorMessageLibConstants.ERROR_CATALOG_PROPERTIES_FILENAME + private lateinit var propertyFile: File + + private var log = logger(ErrorCatalogLoadPropertyService::class) + + lateinit var properties: Properties + + override suspend fun loadErrorCatalog() { + log.info("Application ID: ${errorCatalogProperties.applicationId} > Initializing error catalog message from properties...") + val propertyDir = errorCatalogProperties.errorDefinitionDir ?: ErrorMessageLibConstants.ERROR_CATALOG_PROPERTIES_DIRECTORY + propertyFile = Paths.get(propertyDir, propertyFileName).toFile().normalize() + properties = parseErrorMessagesProps() + } + + override fun getErrorMessage(domain: String, key: String): String? { + return getErrorMessage("$domain.${key.toLowerCase()}") + } + + override fun getErrorMessage(attribute: String): String? { + return properties.getProperty(attribute) + } + + /** + * Parses the error-messages.properties file which contains error messages + */ + private fun parseErrorMessagesProps(): Properties { + var inputStream: InputStream? = null + val props = Properties() + try { + inputStream = propertyFile.inputStream() + props.load(inputStream) + } catch (e: FileNotFoundException) { + log.error("Application ID: ${errorCatalogProperties.applicationId} > Property File '$propertyFileName' " + + "not found in the application directory.") + } catch (e: IOException) { + log.error("Application ID: ${errorCatalogProperties.applicationId} > Fail to load property file " + + "'$propertyFileName' for message errors.") + } finally { + inputStream!!.close() + } + return props + } +} 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 new file mode 100644 index 000000000..91f817133 --- /dev/null +++ b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogService.kt @@ -0,0 +1,91 @@ +/* + * Copyright © 2020 IBM, Bell Canada. + * Modifications Copyright © 2019-2020 AT&T Intellectual Property. + * + * 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 + +import kotlinx.coroutines.runBlocking +import org.onap.ccsdk.cds.error.catalog.core.ErrorCatalog +import org.onap.ccsdk.cds.error.catalog.core.ErrorCatalogException +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.springframework.boot.autoconfigure.condition.ConditionalOnBean +import org.springframework.stereotype.Service +import javax.annotation.PostConstruct + +@Service +@ConditionalOnBean(ErrorCatalogLoadService::class) +open class ErrorCatalogService(private var errorCatalogLoadService: ErrorCatalogLoadService) { + + @PostConstruct + open fun init() = runBlocking { + errorCatalogLoadService.loadErrorCatalog() + } + + fun errorPayload(errorCatalogException: ErrorCatalogException): ErrorPayload { + val errorCatalog = getErrorCatalog(errorCatalogException) + val errorPayload = ErrorPayload(errorCatalog.code, errorCatalog.errorId, errorCatalog.getMessage()) + errorPayload.subErrors.addAll(errorCatalogException.errorPayload!!.subErrors) + if (errorCatalogException.cause != null) { + errorPayload.debugMessage = errorCatalogException.cause!!.printStackTrace().toString() + } + return errorPayload + } + + fun getErrorCatalog(errorCatalogException: ErrorCatalogException): ErrorCatalog { + val errorMessage = getMessage(errorCatalogException.domain, errorCatalogException.name) + val errorCode = + if (errorCatalogException.code == -1) { + getProtocolErrorCode( + errorCatalogException.protocol, + errorCatalogException.name + ) + } else { + errorCatalogException.code + } + val action: String + val errorCause: String + if (errorMessage.isNullOrEmpty()) { + action = errorCatalogException.action + errorCause = errorCatalogException.message ?: "" + } else { + action = ErrorCatalogUtils.readErrorActionFromMessage(errorMessage) + errorCause = errorCatalogException.message ?: ErrorCatalogUtils.readErrorCauseFromMessage(errorMessage) + } + + return ErrorCatalog( + errorCatalogException.name, + errorCatalogException.domain, + errorCode, + action, + errorCause + ) + } + + private fun getProtocolErrorCode(protocol: String, type: String): Int { + return when (protocol) { + ErrorMessageLibConstants.ERROR_CATALOG_PROTOCOL_GRPC -> GrpcErrorCodes.code(type) + else -> HttpErrorCodes.code(type) + } + } + + private fun getMessage(domain: String, key: String): String? { + return errorCatalogLoadService.getErrorMessage(domain, key) + } +} diff --git a/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogServiceExtensions.kt b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogServiceExtensions.kt new file mode 100644 index 000000000..bb4a8f15e --- /dev/null +++ b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/ErrorCatalogServiceExtensions.kt @@ -0,0 +1,25 @@ +/* + * Copyright © 2018-2019 AT&T Intellectual Property. + * + * 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 + +import org.onap.ccsdk.cds.error.catalog.core.ErrorPayload +import org.springframework.http.HttpStatus +import org.springframework.http.ResponseEntity + +fun ErrorPayload.toResponseEntity(): ResponseEntity<ErrorPayload> { + return ResponseEntity(this, HttpStatus.resolve(this.code)!!) +} diff --git a/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/domain/Domain.kt b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/domain/Domain.kt new file mode 100755 index 000000000..7ade1c2a2 --- /dev/null +++ b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/domain/Domain.kt @@ -0,0 +1,76 @@ +/* + * 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.domain + +import java.io.Serializable +import javax.persistence.CascadeType +import javax.persistence.Column +import javax.persistence.Entity +import javax.persistence.FetchType +import javax.persistence.Id +import javax.persistence.Lob +import javax.persistence.ManyToMany +import javax.persistence.Table +import javax.persistence.UniqueConstraint +import java.util.UUID +import javax.persistence.JoinTable +import javax.persistence.JoinColumn + +/** + * Provide ErrorCode Entity + * + * @author Steve Siani + * @version 1.0 + */ + +@Entity +@Table(name = "ERROR_DOMAINS", uniqueConstraints = [UniqueConstraint(columnNames = ["name", "application_id"])]) +class Domain : Serializable { + @Id + var id: String = UUID.randomUUID().toString() + + @Column(name = "name") + lateinit var name: String + + @Column(name = "application_id") + lateinit var applicationId: String + + @Lob + @Column(name = "description") + var description: String = "" + + @ManyToMany(fetch = FetchType.EAGER, cascade = [CascadeType.ALL]) + @JoinTable( + name = "ERROR_DOMAINS_ERROR_MESSAGES", + joinColumns = [JoinColumn(name = "domain_id", referencedColumnName = "id")], + inverseJoinColumns = [JoinColumn(name = "message_id", referencedColumnName = "id")] + ) + @Column(name = "error_msg") + val errorMessages: MutableSet<ErrorMessageModel> = mutableSetOf() + + constructor() + + constructor(name: String, applicationId: String, description: String) { + this.name = name + this.description = description + this.applicationId = applicationId + } + + companion object { + private const val serialVersionUID = 1L + } +} diff --git a/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/domain/ErrorMessageModel.kt b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/domain/ErrorMessageModel.kt new file mode 100644 index 000000000..a4e92af48 --- /dev/null +++ b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/domain/ErrorMessageModel.kt @@ -0,0 +1,69 @@ +/* + * 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.domain + +import java.io.Serializable +import java.util.UUID +import javax.persistence.CascadeType +import javax.persistence.Column +import javax.persistence.Entity +import javax.persistence.FetchType +import javax.persistence.Id +import javax.persistence.Lob +import javax.persistence.ManyToMany +import javax.persistence.Table +import javax.persistence.UniqueConstraint + +/** + * Provide Error Message Model Entity + * + * @author Steve Siani + * @version 1.0 + */ +@Entity +@Table(name = "ERROR_MESSAGES", uniqueConstraints = [UniqueConstraint(columnNames = ["message_id"])]) +class ErrorMessageModel : Serializable { + + @Id + var id: String = UUID.randomUUID().toString() + + @Column(name = "message_id", nullable = false) + lateinit var messageID: String + + @Lob + @Column(name = "cause") + var cause: String = "" + + @Lob + @Column(name = "action") + lateinit var action: String + + @ManyToMany(mappedBy = "errorMessages", fetch = FetchType.EAGER, cascade = [CascadeType.PERSIST]) + val domains: MutableSet<Domain> = mutableSetOf() + + companion object { + private const val serialVersionUID = 1L + } + + constructor() + + constructor(messageId: String, cause: String, action: String) { + this.messageID = messageId + this.cause = cause + this.action = action + } +} diff --git a/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/repository/DomainRepository.kt b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/repository/DomainRepository.kt new file mode 100644 index 000000000..197e385e0 --- /dev/null +++ b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/repository/DomainRepository.kt @@ -0,0 +1,45 @@ +/* + * 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.repository + +import org.onap.ccsdk.cds.error.catalog.services.domain.Domain +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.stereotype.Repository + +/** + * @param <T> Model + */ +@Repository +interface DomainRepository : JpaRepository<Domain, String> { + + /** + * This is a findByNameAndApplicationId method + * + * @param name name + * @param applicationId applicationId + * @return Optional<T> + */ + fun findByNameAndApplicationId(name: String, applicationId: String): Domain? + + /** + * This is a findAllByApplicationId method + * + * @param applicationId applicationId + * @return List<T> + */ + fun findAllByApplicationId(applicationId: String): List<Domain> +} diff --git a/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/repository/ErrorMessageModelRepository.kt b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/repository/ErrorMessageModelRepository.kt new file mode 100644 index 000000000..4a0f78672 --- /dev/null +++ b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/repository/ErrorMessageModelRepository.kt @@ -0,0 +1,36 @@ +/* + * 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.repository + +import org.onap.ccsdk.cds.error.catalog.services.domain.ErrorMessageModel +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.stereotype.Repository + +/** + * @param <T> Model + */ +@Repository +interface ErrorMessageModelRepository : JpaRepository<ErrorMessageModel, String> { + + /** + * This is a findByDomains method + * + * @param domainId domainId + * @return List<T> + */ + fun findByDomainsId(domainId: String): List<ErrorMessageModel> +} 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 new file mode 100644 index 000000000..967d3560c --- /dev/null +++ b/ms/error-catalog/services/src/main/kotlin/org/onap/ccsdk/cds/error/catalog/services/utils/ErrorCatalogUtils.kt @@ -0,0 +1,39 @@ +/* + * 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 ?: "" +} |