diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9c9405823..10dcb7b9a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,7 +7,6 @@ updates: - package-ecosystem: "gradle" directories: - "/" - - "/common-util" - "/liquibase-service" - "/reporting-pipeline-service" schedule: diff --git a/.github/workflows/Build-and-deploy-reporting-services.yaml b/.github/workflows/Build-and-deploy-reporting-services.yaml index 8a151df65..0ba7ccf0c 100644 --- a/.github/workflows/Build-and-deploy-reporting-services.yaml +++ b/.github/workflows/Build-and-deploy-reporting-services.yaml @@ -10,7 +10,6 @@ on: paths: - "reporting-pipeline-service/**" - "liquibase-service/**" - - "common-util/**" - "build.gradle" - "settings.gradle" - "gradle/**" diff --git a/.github/workflows/run-functional-tests.yaml b/.github/workflows/run-functional-tests.yaml index 5e5d1300d..06710a383 100644 --- a/.github/workflows/run-functional-tests.yaml +++ b/.github/workflows/run-functional-tests.yaml @@ -4,7 +4,6 @@ on: paths: - "reporting-pipeline-service/**" - "liquibase-service/**" - - "common-util/**" - "build.gradle" - "settings.gradle" - "gradle/**" diff --git a/.github/workflows/run-tests.yaml b/.github/workflows/run-tests.yaml index 7eec32f14..e387655be 100644 --- a/.github/workflows/run-tests.yaml +++ b/.github/workflows/run-tests.yaml @@ -4,7 +4,6 @@ on: paths: - "reporting-pipeline-service/**" - "liquibase-service/**" - - "common-util/**" - "build.gradle" - "settings.gradle" - "gradle/**" diff --git a/.github/workflows/run-unit-tests.yaml b/.github/workflows/run-unit-tests.yaml index 492a441c4..731fe0eb2 100644 --- a/.github/workflows/run-unit-tests.yaml +++ b/.github/workflows/run-unit-tests.yaml @@ -4,7 +4,6 @@ on: paths: - "reporting-pipeline-service/**" - "liquibase-service/**" - - "common-util/**" - "build.gradle" - "settings.gradle" - "gradle/**" diff --git a/common-util/.gitignore b/common-util/.gitignore deleted file mode 100644 index c2065bc26..000000000 --- a/common-util/.gitignore +++ /dev/null @@ -1,37 +0,0 @@ -HELP.md -.gradle -build/ -!gradle/wrapper/gradle-wrapper.jar -!**/src/main/**/build/ -!**/src/test/**/build/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache -bin/ -!**/src/main/**/bin/ -!**/src/test/**/bin/ - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr -out/ -!**/src/main/**/out/ -!**/src/test/**/out/ - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ - -### VS Code ### -.vscode/ diff --git a/common-util/build.gradle b/common-util/build.gradle deleted file mode 100644 index ea0132bd9..000000000 --- a/common-util/build.gradle +++ /dev/null @@ -1,67 +0,0 @@ -plugins { - id 'java-library' - id 'org.springframework.boot' version '3.5.6' - id 'io.spring.dependency-management' version '1.1.4' - id 'jacoco' - id 'org.sonarqube' version '4.2.1.3168' -} - -group = 'gov.cdc.etldatapipeline' -version = '0.0.1-SNAPSHOT' - -java { - sourceCompatibility = JavaVersion.VERSION_21 -} - -repositories { - mavenCentral() -} - -jacocoTestReport { - dependsOn test - reports { - xml.required = true - csv.required = false - html.outputLocation = layout.buildDirectory.dir('jacocoHtml') - } - - afterEvaluate { - classDirectories.setFrom(files(classDirectories.files.collect { - fileTree(dir: it, - exclude: ['**/metrics/*.class']) - })) - } -} - -dependencies { - compileOnly 'org.springframework.boot:spring-boot-autoconfigure' - compileOnly 'org.springframework.boot:spring-boot-actuator-autoconfigure' - api 'io.micrometer:micrometer-core' - - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' - compileOnly 'org.slf4j:slf4j-api' - - implementation 'commons-io:commons-io:2.21.0' - implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.17.0' - implementation 'com.google.guava:guava:33.5.0-jre' - - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.springframework.boot:spring-boot-starter-actuator' -} - -dependencyManagement { - dependencies { - dependency 'com.fasterxml.jackson.core:jackson-core:2.21.1' - } -} - -tasks.named('test') { - useJUnitPlatform() -} - -sonarqube { - properties { - property "sonar.coverage.exclusions", "**/metrics/*.java" - } -} \ No newline at end of file diff --git a/common-util/gradle/wrapper/gradle-wrapper.jar b/common-util/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index b1b8ef56b..000000000 Binary files a/common-util/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/common-util/gradle/wrapper/gradle-wrapper.properties b/common-util/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index b52fb7e71..000000000 --- a/common-util/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,9 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.0-bin.zip -networkTimeout=10000 -retries=0 -retryBackOffMs=500 -validateDistributionUrl=true -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/common-util/gradlew b/common-util/gradlew deleted file mode 100755 index b9bb139f7..000000000 --- a/common-util/gradlew +++ /dev/null @@ -1,248 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015 the original authors. -# -# 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 -# -# https://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. -# -# SPDX-License-Identifier: Apache-2.0 -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - if ! command -v java >/dev/null 2>&1 - then - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, -# and any embedded shellness will be escaped. -# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be -# treated as '${Hostname}' itself on the command line. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/common-util/gradlew.bat b/common-util/gradlew.bat deleted file mode 100644 index aa5f10b06..000000000 --- a/common-util/gradlew.bat +++ /dev/null @@ -1,82 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem -@rem SPDX-License-Identifier: Apache-2.0 -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables, and ensure extensions are enabled -setlocal EnableExtensions - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -"%COMSPEC%" /c exit 1 - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -"%COMSPEC%" /c exit 1 - -:execute -@rem Setup the command line - - - -@rem Execute Gradle -@rem endlocal doesn't take effect until after the line is parsed and variables are expanded -@rem which allows us to clear the local environment before executing the java command -endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel - -:exitWithErrorLevel -@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts -"%COMSPEC%" /c exit %ERRORLEVEL% diff --git a/common-util/settings.gradle b/common-util/settings.gradle deleted file mode 100644 index a6a5cd8bc..000000000 --- a/common-util/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'common-util' \ No newline at end of file diff --git a/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/CommonUtilApplication.java b/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/CommonUtilApplication.java deleted file mode 100644 index 143244fbf..000000000 --- a/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/CommonUtilApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package gov.cdc.etldatapipeline.commonutil; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class CommonUtilApplication { - - public static void main(String[] args) { - SpringApplication.run(CommonUtilApplication.class, args); - } - -} diff --git a/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/DataProcessingException.java b/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/DataProcessingException.java deleted file mode 100644 index 72f5548b7..000000000 --- a/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/DataProcessingException.java +++ /dev/null @@ -1,11 +0,0 @@ -package gov.cdc.etldatapipeline.commonutil; - -public class DataProcessingException extends RuntimeException { - public DataProcessingException(String message) { - super(message); - } - - public DataProcessingException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/NoDataException.java b/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/NoDataException.java deleted file mode 100644 index 1ffa4dae6..000000000 --- a/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/NoDataException.java +++ /dev/null @@ -1,11 +0,0 @@ -package gov.cdc.etldatapipeline.commonutil; - -public class NoDataException extends RuntimeException { - public NoDataException(String message) { - super(message); - } - - public NoDataException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/TestUtils.java b/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/TestUtils.java deleted file mode 100644 index 48e4a4540..000000000 --- a/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/TestUtils.java +++ /dev/null @@ -1,25 +0,0 @@ -package gov.cdc.etldatapipeline.commonutil; - -import org.apache.commons.io.FileUtils; -import org.springframework.core.io.ClassPathResource; - -import java.io.IOException; -import java.nio.charset.Charset; - -public class TestUtils { - - private TestUtils() { - throw new IllegalStateException("Utility class"); - } - - // Read file data - public static String readFileData(String fileName) { - try { - return FileUtils.readFileToString( - new ClassPathResource(fileName).getFile(), - Charset.defaultCharset()); - } catch (IOException e) { - throw new DataProcessingException("File Read failed : " + fileName); - } - } -} diff --git a/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/UtilHelper.java b/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/UtilHelper.java deleted file mode 100644 index 007dab456..000000000 --- a/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/UtilHelper.java +++ /dev/null @@ -1,65 +0,0 @@ -package gov.cdc.etldatapipeline.commonutil; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import lombok.extern.slf4j.Slf4j; - -import java.util.NoSuchElementException; - -@Slf4j -public class UtilHelper { - private static final ObjectMapper objectMapper = new ObjectMapper() - .registerModule(new JavaTimeModule()); - - private static final String PAYLOAD_KEY = "payload"; - private static final String DEFAULT_PATH = "after"; - - private UtilHelper() { - throw new IllegalStateException("Utility class"); - } - - public static T deserializePayload(String jsonString, Class type) { - try { - if (jsonString == null) return null; - return objectMapper.readValue(jsonString, type); - } catch (JsonProcessingException e) { - log.error("JsonProcessingException: ", e); - } - return null; - } - - public static String extractUid(String value, String uidName, String... overridePath) throws JsonProcessingException { - JsonNode jsonNode = objectMapper.readTree(value); - JsonNode payloadNode = jsonNode.get(PAYLOAD_KEY); - - String path = overridePath.length > 0 ? overridePath[0] : DEFAULT_PATH; - JsonNode dataNode = jsonNode.get(PAYLOAD_KEY).path(path); - payloadNode = dataNode.isMissingNode() ? payloadNode : dataNode; - if (payloadNode.has(uidName)) { - return payloadNode.get(uidName).asText(); - } else { - throw new NoSuchElementException("The " + uidName + " field is missing in the message payload."); - } - } - - public static String extractValue(String message, String fieldName, String... overridePath) throws JsonProcessingException { - JsonNode jsonNode = objectMapper.readTree(message); - String nodePath = overridePath.length > 0 ? overridePath[0] : DEFAULT_PATH; - return jsonNode.get(PAYLOAD_KEY).path(nodePath).path(fieldName).asText(); - } - - public static String extractChangeDataCaptureOperation(String message) throws JsonProcessingException { - JsonNode jsonNode = objectMapper.readTree(message); - return jsonNode.get(PAYLOAD_KEY).path("op").asText(); - } - - public static String errorMessage(String entityName, String ids, Exception e) { - String base = "Error processing " + entityName + " data"; - if (ids != null && !ids.isEmpty()) { - base += " with ids '" + ids + "'"; - } - return base + ": " + e.getMessage(); - } -} \ No newline at end of file diff --git a/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/json/CustomJsonGeneratorImpl.java b/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/json/CustomJsonGeneratorImpl.java deleted file mode 100644 index 7818bb231..000000000 --- a/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/json/CustomJsonGeneratorImpl.java +++ /dev/null @@ -1,95 +0,0 @@ -package gov.cdc.etldatapipeline.commonutil.json; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.google.common.base.CaseFormat; -import lombok.extern.slf4j.Slf4j; - -import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; - -@Slf4j -public class CustomJsonGeneratorImpl { - - private static final ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); - private static final List DEFAULT_KEYS = Arrays.asList("public_health_case_uid", "act_uid", "observation_uid", - "organization_uid", "provider_uid", "patient_uid", "notification_uid"); - - public String generateStringJson(Object model, String... overrideKeys) { - try { - ObjectNode root = objectMapper.createObjectNode(); - ObjectNode schemaNode = root.putObject("schema"); - schemaNode.put("type", "struct"); - List pkeys = Optional.ofNullable(overrideKeys) - .filter(keys -> keys.length > 0) - .map(Arrays::asList) - .orElse(DEFAULT_KEYS); - schemaNode.set("fields", generateFieldsArray(model, pkeys)); - ObjectNode payloadNode = root.putObject("payload"); - generatePayloadNode(payloadNode, model); - return objectMapper.writeValueAsString(root); - } catch (Exception e) { - log.error("Failed to generate JSON string for model: {}", model.getClass().getName(), e); - return null; - } - } - - private static ArrayNode generateFieldsArray(Object model, List pKeys) { - ArrayNode fieldsArray = objectMapper.createArrayNode(); - try { - Class modelClass = model.getClass(); - for (Field field : modelClass.getDeclaredFields()) { - ObjectNode fieldNode = objectMapper.createObjectNode(); - - String fieldName = getFieldName(field); - - fieldNode.put("type", getType(field.getType().getSimpleName().toLowerCase())); - fieldNode.put("optional", (!pKeys.contains(fieldName))); - fieldNode.put("field", fieldName); - fieldsArray.add(fieldNode); - } - } catch (Exception e) { - log.error("Failed to generate JSON array node for model: {}", model.getClass().getName(), e); - } - - return fieldsArray; - } - - private static ObjectNode generatePayloadNode(ObjectNode payloadNode, Object model) { - try { - Class modelClass = model.getClass(); - for (java.lang.reflect.Field field : modelClass.getDeclaredFields()) { - field.setAccessible(true); - String fieldName = getFieldName(field); - - payloadNode.set(fieldName, objectMapper.valueToTree(field.get(model))); - } - } catch (Exception e) { - log.error("Failed to generate JSON payload node for model: {}", model.getClass().getName(), e); - } - - return payloadNode; - } - - private static String getFieldName(Field field) { - if (field.isAnnotationPresent(JsonProperty.class)) { - return field.getAnnotation(JsonProperty.class).value(); - } else { - return CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, field.getName()); - } - } - - private static String getType(String javaType) { - return switch (javaType.toLowerCase()) { - case "long" -> "int64"; - case "integer", "int" -> "int32"; - case "instant" -> "string"; - default -> javaType.toLowerCase(); - }; - } -} diff --git a/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/json/NumberToPlainStringDeserializer.java b/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/json/NumberToPlainStringDeserializer.java deleted file mode 100644 index 8db77c520..000000000 --- a/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/json/NumberToPlainStringDeserializer.java +++ /dev/null @@ -1,25 +0,0 @@ -package gov.cdc.etldatapipeline.commonutil.json; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonToken; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; - -import java.io.IOException; -import java.math.BigDecimal; - -public class NumberToPlainStringDeserializer extends JsonDeserializer { - @Override - public String deserialize(JsonParser p, DeserializationContext ctx) throws IOException { - JsonToken t = p.getCurrentToken(); - if (t == JsonToken.VALUE_NUMBER_INT || t == JsonToken.VALUE_NUMBER_FLOAT) { - // Use BigDecimal to avoid scientific notation - BigDecimal bd = p.getDecimalValue(); - return bd.toPlainString(); // preserves non-sci; scale preserved if available - } else if (t == JsonToken.VALUE_STRING) { - return p.getText(); - } - // fallback - return ctx.handleUnexpectedToken(String.class, p).toString(); - } -} diff --git a/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/metrics/CustomMetrics.java b/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/metrics/CustomMetrics.java deleted file mode 100644 index 6188ced68..000000000 --- a/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/metrics/CustomMetrics.java +++ /dev/null @@ -1,47 +0,0 @@ -package gov.cdc.etldatapipeline.commonutil.metrics; - -import io.micrometer.core.instrument.*; -import lombok.RequiredArgsConstructor; -import lombok.Setter; -import org.springframework.stereotype.Component; - -import java.util.Objects; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -@Component -@RequiredArgsConstructor -@Setter -public class CustomMetrics { - private final MeterRegistry registry; - private final ConcurrentMap meters = new ConcurrentHashMap<>(); - - public Counter counter(String name, String... tags) { - return (Counter) meters.computeIfAbsent(name, k -> - Counter.builder(name).tags(tags).register(registry)); - } - - public Timer timer(String name, String... tags) { - return (Timer) meters.computeIfAbsent(name, k -> - Timer.builder(name).tags(tags).register(registry) - ); - } - - public void gauge(String name, T obj, java.util.function.ToDoubleFunction valueFunction, String... tags) { - Objects.requireNonNull(obj, "gauge source"); - meters.computeIfAbsent(name, k -> - Gauge.builder(name, obj, valueFunction) - .tags(tags).register(registry)); - } - - public void recordTime(String name, Runnable runnable, String... tags) { - timer(name, tags).record(runnable); - } - - public Timer.Sample startSample() { - return Timer.start(registry); - } - public void stopSample(Timer.Sample sample, Timer timer) { - sample.stop(timer); - } -} diff --git a/common-util/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/common-util/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index 5797a0c9d..000000000 --- a/common-util/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -gov.cdc.etldatapipeline.commonutil.metrics.CustomMetricsAutoConfiguration \ No newline at end of file diff --git a/common-util/src/main/resources/application.properties b/common-util/src/main/resources/application.properties deleted file mode 100644 index 2e1541183..000000000 --- a/common-util/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=common-util diff --git a/common-util/src/test/java/gov/cdc/etldatapipeline/commonutil/CommonUtilApplicationTests.java b/common-util/src/test/java/gov/cdc/etldatapipeline/commonutil/CommonUtilApplicationTests.java deleted file mode 100644 index 9e248b4f4..000000000 --- a/common-util/src/test/java/gov/cdc/etldatapipeline/commonutil/CommonUtilApplicationTests.java +++ /dev/null @@ -1,39 +0,0 @@ -package gov.cdc.etldatapipeline.commonutil; - -import org.junit.jupiter.api.Test; -import org.mockito.MockedStatic; -import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Configuration; - -import static org.junit.jupiter.api.Assertions.assertNotNull; - -@SpringBootTest -class CommonUtilApplicationTests { - - @Autowired - private ApplicationContext context; - - @Test - void testMain() { - try (MockedStatic mocked = Mockito.mockStatic(SpringApplication.class)) { - mocked.when(() -> SpringApplication.run(CommonUtilApplicationTests.class, new String[]{})) - .thenReturn(null); - - CommonUtilApplication.main(new String[]{}); - mocked.verify(() -> SpringApplication.run(CommonUtilApplication.class, new String[]{}), Mockito.times(1)); - } - } - - @Test - void contextLoads() { - assertNotNull(context, "The application context should not be null"); - } - - @Configuration - static class TestConfiguration { - } -} diff --git a/common-util/src/test/java/gov/cdc/etldatapipeline/commonutil/DataExceptionTest.java b/common-util/src/test/java/gov/cdc/etldatapipeline/commonutil/DataExceptionTest.java deleted file mode 100644 index 4e6e3d946..000000000 --- a/common-util/src/test/java/gov/cdc/etldatapipeline/commonutil/DataExceptionTest.java +++ /dev/null @@ -1,63 +0,0 @@ -package gov.cdc.etldatapipeline.commonutil; - -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import java.lang.reflect.Constructor; -import java.util.stream.Stream; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; - -class DataExceptionTest { - - static Stream messageOnlyProvider() { - return Stream.of( - Arguments.of(NoDataException.class, "No data found"), - Arguments.of(DataProcessingException.class, "Processing error") - ); - } - - static Stream messageAndCauseProvider() { - return Stream.of( - Arguments.of( - NoDataException.class, - "No data found", - new RuntimeException("Underlying cause") - ), - Arguments.of( - DataProcessingException.class, - "Processing error", - new IllegalStateException("Bad state") - ) - ); - } - - @ParameterizedTest(name = "{0}.(\"{1}\")") - @MethodSource("messageOnlyProvider") - void testConstructorWithMessage( - Class exceptionClass, - String message - ) throws Exception { - Constructor ctor = exceptionClass.getConstructor(String.class); - T ex = ctor.newInstance(message); - - assertEquals(message, ex.getMessage()); - assertNull(ex.getCause()); - } - - @ParameterizedTest(name = "{0}.(\"{1}\", cause={2})") - @MethodSource("messageAndCauseProvider") - void testConstructorWithMessageAndCause( - Class exceptionClass, - String message, - Throwable cause - ) throws Exception { - Constructor ctor = exceptionClass.getConstructor(String.class, Throwable.class); - T ex = ctor.newInstance(message, cause); - - assertEquals(message, ex.getMessage()); - assertEquals(cause, ex.getCause()); - } -} diff --git a/common-util/src/test/java/gov/cdc/etldatapipeline/commonutil/TestUtilsTest.java b/common-util/src/test/java/gov/cdc/etldatapipeline/commonutil/TestUtilsTest.java deleted file mode 100644 index 1244ba110..000000000 --- a/common-util/src/test/java/gov/cdc/etldatapipeline/commonutil/TestUtilsTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package gov.cdc.etldatapipeline.commonutil; - -import org.junit.jupiter.api.Test; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; - -import static org.junit.jupiter.api.Assertions.*; - -class TestUtilsTest { - - @Test - void testConstructor() throws Exception { - Constructor constructor = TestUtils.class.getDeclaredConstructor(); - constructor.setAccessible(true); - - InvocationTargetException exception = assertThrows(InvocationTargetException.class, constructor::newInstance); - assertInstanceOf(IllegalStateException.class, exception.getCause()); - assertEquals("Utility class", exception.getCause().getMessage()); - } - - @Test - void testReadFileData_validFile_returnsContent() { - String fileContent = TestUtils.readFileData("test-data/sample.txt"); - - assertNotNull(fileContent); - assertTrue(fileContent.contains("Hello, this is test content.")); - } - - @Test - void testReadFileData_fileNotFound_throwsRuntimeException() { - RuntimeException ex = assertThrows(RuntimeException.class, () -> TestUtils.readFileData("nonexistent-file.txt")); - - assertTrue(ex.getMessage().contains("File Read failed")); - } -} diff --git a/common-util/src/test/java/gov/cdc/etldatapipeline/commonutil/UtilHelperTest.java b/common-util/src/test/java/gov/cdc/etldatapipeline/commonutil/UtilHelperTest.java deleted file mode 100644 index 33a0cfb8f..000000000 --- a/common-util/src/test/java/gov/cdc/etldatapipeline/commonutil/UtilHelperTest.java +++ /dev/null @@ -1,144 +0,0 @@ -package gov.cdc.etldatapipeline.commonutil; - -import com.fasterxml.jackson.core.JsonProcessingException; -import org.junit.jupiter.api.Test; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.NoSuchElementException; - -import static org.junit.jupiter.api.Assertions.*; - -class UtilHelperTest { - - private final String sampleJson = """ - { - "payload": { - "before": { - "uid": "12344", - "name": "Test Name Before", - "age": 30 - }, - "after": { - "uid": "12345", - "name": "Test Name", - "age": 30 - }, - "op": "d" - } - } - """; - - @Test - void testConstructor() throws Exception { - Constructor constructor = UtilHelper.class.getDeclaredConstructor(); - constructor.setAccessible(true); - - InvocationTargetException exception = assertThrows(InvocationTargetException.class, constructor::newInstance); - assertInstanceOf(IllegalStateException.class, exception.getCause()); - assertEquals("Utility class", exception.getCause().getMessage()); - } - - - @Test - void testDeserializePayload_validJson() { - record Person(String uid, String name, int age) {} - String json = """ - { - "uid": "12345", - "name": "John", - "age": 25 - } - """; - - Person person = UtilHelper.deserializePayload(json, Person.class); - assertNotNull(person); - assertEquals("12345", person.uid()); - assertEquals("John", person.name()); - assertEquals(25, person.age()); - } - - @Test - void testDeserializePayload_invalidJson() { - String invalidJson = "{ invalid json }"; - assertNull(UtilHelper.deserializePayload(invalidJson, Object.class)); - } - - @Test - void testDeserializePayload_nullJson() { - String invalidJson = null; - assertNull(UtilHelper.deserializePayload(invalidJson, Object.class)); - } - - @Test - void testExtractUid_validField() throws JsonProcessingException { - String uid = UtilHelper.extractUid(sampleJson, "uid"); - assertEquals("12345", uid); - - uid = UtilHelper.extractUid(sampleJson, "uid", "before"); - assertEquals("12344", uid); - - uid = UtilHelper.extractUid("{\"payload\": {\"uid\": \"12346\"}}", "uid"); - assertEquals("12346", uid); - } - - @Test - void testExtractUid_invalidField() { - String inValidJson = """ - { - "payload": "" - } - """; - Exception exception = assertThrows(NoSuchElementException.class, - () -> UtilHelper.extractUid(inValidJson, "uid")); - assertTrue(exception.getMessage().contains("The uid field is missing in the message payload")); - } - - @Test - void testExtractUid_missingField() { - Exception exception = assertThrows(NoSuchElementException.class, - () -> UtilHelper.extractUid(sampleJson, "nonexistentField")); - - assertTrue(exception.getMessage().contains("nonexistentField")); - } - - @Test - void testExtractValue_validField() throws JsonProcessingException { - String name = UtilHelper.extractValue(sampleJson, "name"); - assertEquals("Test Name", name); - - name = UtilHelper.extractValue(sampleJson, "name", "before"); - assertEquals("Test Name Before", name); - } - - @Test - void testExtractValue_missingField() throws JsonProcessingException { - String value = UtilHelper.extractValue(sampleJson, "missingField"); - assertEquals("", value); // .asText() on missing node returns "" - } - - @Test - void testErrorMessage_withIds() { - String msg = UtilHelper.errorMessage("Person", "1,2,3", new RuntimeException("Something went wrong")); - assertTrue(msg.contains("Person")); - assertTrue(msg.contains("1,2,3")); - assertTrue(msg.contains("Something went wrong")); - } - - @Test - void testErrorMessage_withoutIds() { - String msg = UtilHelper.errorMessage("Person", "", new RuntimeException("Boom")); - assertTrue(msg.contains("Person")); - assertTrue(msg.contains("Boom")); - assertFalse(msg.contains("with ids")); - - msg = UtilHelper.errorMessage("Person", null, new RuntimeException("Boom")); - assertFalse(msg.contains("with ids")); - } - - @Test - void testExtractCdcOperation() throws JsonProcessingException { - String value = UtilHelper.extractChangeDataCaptureOperation(sampleJson); - assertEquals("d", value); - } -} \ No newline at end of file diff --git a/common-util/src/test/java/gov/cdc/etldatapipeline/commonutil/json/CustomJsonGeneratorImplTest.java b/common-util/src/test/java/gov/cdc/etldatapipeline/commonutil/json/CustomJsonGeneratorImplTest.java deleted file mode 100644 index bb26aa5fd..000000000 --- a/common-util/src/test/java/gov/cdc/etldatapipeline/commonutil/json/CustomJsonGeneratorImplTest.java +++ /dev/null @@ -1,130 +0,0 @@ -package gov.cdc.etldatapipeline.commonutil.json; - -import com.fasterxml.jackson.annotation.JsonProperty; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.time.Instant; - -import static org.junit.jupiter.api.Assertions.*; - -class CustomJsonGeneratorImplTest { - private CustomJsonGeneratorImpl jsonGenerator = null; - - @BeforeEach - void setUp() { - jsonGenerator = new CustomJsonGeneratorImpl(); - } - - @AfterEach - void tearDown() { - } - - private static class TestBean { - private String attr1; - public TestBean(String attr1) { - this.attr1 = attr1; - } - } - private static class ComplexTestBean { - private String stringField; - private int intField; - private long longField; - private Instant instantField; - @JsonProperty("custom_name") - private String annotatedField; - - public ComplexTestBean(String stringField, int intField, long longField, Instant instantField, String annotatedField) { - this.stringField = stringField; - this.intField = intField; - this.longField = longField; - this.instantField = instantField; - this.annotatedField = annotatedField; - } - } - - @Test - void testGenerateStringJson() { - TestBean testBean = new TestBean( "value1"); - /** - * { - * "schema":{ - * "type":"struct", - * "fields":[{"type":"string","optional":true,"field":"attr1"}] - * }, - * "payload":{"attr1":"value1"} - * } - */ - String actualVal = """ - {"schema":{"type":"struct","fields":[{"type":"string","optional":true,"field":"attr1"}]},"payload":{"attr1":"value1"}} - """.replace("\n",""); - String jsonVal = jsonGenerator.generateStringJson(testBean); - assertEquals(actualVal, jsonVal); - } - - - @Test - void testGenerateStringJson_ComplexObject() { - ComplexTestBean testBean = new ComplexTestBean("test", 42, 1234L, Instant.ofEpochSecond(1001), "annotated"); - String jsonVal = jsonGenerator.generateStringJson(testBean); - - assertTrue(jsonVal.contains("\"string_field\":\"test\"")); - assertTrue(jsonVal.contains("\"int_field\":42")); - assertTrue(jsonVal.contains("\"long_field\":1234")); - assertTrue(jsonVal.contains("\"instant_field\":1001")); - assertTrue(jsonVal.contains("\"custom_name\":\"annotated\"")); - assertTrue(jsonVal.contains("\"type\":\"int32\"")); - assertTrue(jsonVal.contains("\"type\":\"int64\"")); - } - - @Test - void testGenerateStringJson_WithOverrideKeys() { - ComplexTestBean testBean = new ComplexTestBean("test", 42, 1234L, Instant.ofEpochSecond(1001),"annotated"); - String jsonVal = jsonGenerator.generateStringJson(testBean, "string_field", "custom_name"); - - assertTrue(jsonVal.contains("\"optional\":false") && - jsonVal.contains("\"field\":\"string_field\"")); - assertTrue(jsonVal.contains("\"optional\":false") && - jsonVal.contains("\"field\":\"custom_name\"")); - assertTrue(jsonVal.contains("\"optional\":true") && - jsonVal.contains("\"field\":\"int_field\"")); - } - - @Test - void testGenerateStringJson_NullModel() { - RuntimeException ex = assertThrows(RuntimeException.class, - () -> jsonGenerator.generateStringJson(null)); - - assertTrue(ex.getMessage().contains("Cannot invoke \"Object.getClass()\" because \"model\" is null")); - } - - @Test - void testTypeMapping() { - class TypeTestBean { - private long longVal; - private int intVal; - private String stringVal; - } - - TypeTestBean testBean = new TypeTestBean(); - String jsonVal = jsonGenerator.generateStringJson(testBean); - - assertTrue(jsonVal.contains("\"type\":\"int64\"")); - assertTrue(jsonVal.contains("\"type\":\"int32\"")); - assertTrue(jsonVal.contains("\"type\":\"string\"")); - } - - @Test - void testSchemaStructure() { - TestBean testBean = new TestBean("test"); - String jsonVal = jsonGenerator.generateStringJson(testBean); - - assertTrue(jsonVal.contains("\"schema\":{")); - assertTrue(jsonVal.contains("\"type\":\"struct\"")); - assertTrue(jsonVal.contains("\"fields\":[")); - assertTrue(jsonVal.contains("\"payload\":{")); - } - - -} \ No newline at end of file diff --git a/common-util/src/test/java/gov/cdc/etldatapipeline/commonutil/json/NumberToPlainStringDeserializerTest.java b/common-util/src/test/java/gov/cdc/etldatapipeline/commonutil/json/NumberToPlainStringDeserializerTest.java deleted file mode 100644 index 1f1100927..000000000 --- a/common-util/src/test/java/gov/cdc/etldatapipeline/commonutil/json/NumberToPlainStringDeserializerTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package gov.cdc.etldatapipeline.commonutil.json; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -class NumberToPlainStringDeserializerTest { - - private final ObjectMapper objectMapper = new ObjectMapper(); - - static class Wrapper { - @JsonDeserialize(using = NumberToPlainStringDeserializer.class) - public String value; - } - - @ParameterizedTest - @CsvSource( - value = { - "{\"value\": 1.23E+7}|12300000", - "{\"value\": 10000000}|10000000", - "{\"value\": \"1.23E+7\"}|1.23E+7" - }, - delimiter = '|' - ) - void shouldDeserializeToPlainString(String json, String expected) throws Exception { - Wrapper wrapper = objectMapper.readValue(json, Wrapper.class); - assertThat(wrapper.value).isEqualTo(expected); - } - - @Test - void shouldHandleNullValue() throws Exception { - Wrapper wrapper = objectMapper.readValue("{\"value\": null}", Wrapper.class); - assertThat(wrapper.value).isNull(); - } - - @Test - void shouldFailOnUnexpectedType() { - assertThatThrownBy(() -> objectMapper.readValue("{\"value\": {\"nested\":1}}", Wrapper.class)) - .isInstanceOf(Exception.class); - } -} diff --git a/reporting-pipeline-service/Dockerfile b/reporting-pipeline-service/Dockerfile index bc233882b..8bf5fa662 100644 --- a/reporting-pipeline-service/Dockerfile +++ b/reporting-pipeline-service/Dockerfile @@ -8,7 +8,6 @@ COPY gradlew /usr/src/gradlew COPY settings.gradle /usr/src/settings.gradle #Copy sources -COPY common-util /usr/src/common-util COPY reporting-pipeline-service /usr/src/reporting-pipeline-service #cd to root directory diff --git a/reporting-pipeline-service/build.gradle b/reporting-pipeline-service/build.gradle index b98da6158..b6fc683e3 100644 --- a/reporting-pipeline-service/build.gradle +++ b/reporting-pipeline-service/build.gradle @@ -98,19 +98,14 @@ dependencies { compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' + compileOnly 'org.slf4j:slf4j-api' implementation 'org.modelmapper:modelmapper:3.2.0' implementation 'com.google.guava:guava:33.5.0-jre' implementation 'io.micrometer:micrometer-core' runtimeOnly 'io.micrometer:micrometer-registry-prometheus' - - if (findProject(':common-util')) { - implementation project(':common-util') - } else { - // this mostly needed when testing the app on idea - implementation files('libs/common-util-0.0.1-SNAPSHOT.jar') - } + implementation 'commons-io:commons-io:2.21.0' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml' diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/investigation/service/InvestigationService.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/investigation/service/InvestigationService.java index 45b81c44e..36d9c559b 100644 --- a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/investigation/service/InvestigationService.java +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/investigation/service/InvestigationService.java @@ -1,17 +1,17 @@ package gov.cdc.nbs.report.pipeline.investigation.service; -import static gov.cdc.etldatapipeline.commonutil.UtilHelper.*; +import static gov.cdc.nbs.report.pipeline.util.UtilHelper.*; -import gov.cdc.etldatapipeline.commonutil.DataProcessingException; -import gov.cdc.etldatapipeline.commonutil.NoDataException; -import gov.cdc.etldatapipeline.commonutil.json.CustomJsonGeneratorImpl; -import gov.cdc.etldatapipeline.commonutil.metrics.CustomMetrics; import gov.cdc.nbs.report.pipeline.investigation.repository.*; import gov.cdc.nbs.report.pipeline.investigation.repository.model.dto.*; import gov.cdc.nbs.report.pipeline.investigation.repository.model.reporting.InvestigationKey; import gov.cdc.nbs.report.pipeline.investigation.repository.model.reporting.InvestigationReporting; import gov.cdc.nbs.report.pipeline.investigation.repository.model.reporting.TreatmentReportingKey; import gov.cdc.nbs.report.pipeline.investigation.util.ProcessInvestigationDataUtil; +import gov.cdc.nbs.report.pipeline.util.DataProcessingException; +import gov.cdc.nbs.report.pipeline.util.NoDataException; +import gov.cdc.nbs.report.pipeline.util.json.CustomJsonGeneratorImpl; +import gov.cdc.nbs.report.pipeline.util.metrics.CustomMetrics; import io.micrometer.core.instrument.Counter; import jakarta.annotation.PostConstruct; import jakarta.persistence.EntityNotFoundException; diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/investigation/util/ProcessInvestigationDataUtil.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/investigation/util/ProcessInvestigationDataUtil.java index 13f01afba..7a34d2bf2 100644 --- a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/investigation/util/ProcessInvestigationDataUtil.java +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/investigation/util/ProcessInvestigationDataUtil.java @@ -4,11 +4,11 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import gov.cdc.etldatapipeline.commonutil.json.CustomJsonGeneratorImpl; -import gov.cdc.etldatapipeline.commonutil.metrics.CustomMetrics; import gov.cdc.nbs.report.pipeline.investigation.repository.InvestigationRepository; import gov.cdc.nbs.report.pipeline.investigation.repository.model.dto.*; import gov.cdc.nbs.report.pipeline.investigation.repository.model.reporting.*; +import gov.cdc.nbs.report.pipeline.util.json.CustomJsonGeneratorImpl; +import gov.cdc.nbs.report.pipeline.util.metrics.CustomMetrics; import io.micrometer.core.instrument.Counter; import java.util.*; import java.util.stream.Collectors; diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/ldfdata/service/LdfDataService.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/ldfdata/service/LdfDataService.java index 8259850c9..a376b5895 100644 --- a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/ldfdata/service/LdfDataService.java +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/ldfdata/service/LdfDataService.java @@ -1,17 +1,17 @@ package gov.cdc.nbs.report.pipeline.ldfdata.service; -import static gov.cdc.etldatapipeline.commonutil.UtilHelper.extractChangeDataCaptureOperation; +import static gov.cdc.nbs.report.pipeline.util.UtilHelper.extractChangeDataCaptureOperation; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import gov.cdc.etldatapipeline.commonutil.DataProcessingException; -import gov.cdc.etldatapipeline.commonutil.NoDataException; -import gov.cdc.etldatapipeline.commonutil.json.CustomJsonGeneratorImpl; -import gov.cdc.etldatapipeline.commonutil.metrics.CustomMetrics; import gov.cdc.nbs.report.pipeline.ldfdata.model.dto.LdfData; import gov.cdc.nbs.report.pipeline.ldfdata.model.dto.LdfDataKey; import gov.cdc.nbs.report.pipeline.ldfdata.repository.LdfDataRepository; +import gov.cdc.nbs.report.pipeline.util.DataProcessingException; +import gov.cdc.nbs.report.pipeline.util.NoDataException; +import gov.cdc.nbs.report.pipeline.util.json.CustomJsonGeneratorImpl; +import gov.cdc.nbs.report.pipeline.util.metrics.CustomMetrics; import io.micrometer.core.instrument.Counter; import jakarta.annotation.PostConstruct; import jakarta.persistence.EntityNotFoundException; diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/observation/model/dto/observation/ObservationNumeric.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/observation/model/dto/observation/ObservationNumeric.java index 005d00f93..b3c4b162a 100644 --- a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/observation/model/dto/observation/ObservationNumeric.java +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/observation/model/dto/observation/ObservationNumeric.java @@ -5,7 +5,7 @@ import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonNaming; -import gov.cdc.etldatapipeline.commonutil.json.NumberToPlainStringDeserializer; +import gov.cdc.nbs.report.pipeline.util.json.NumberToPlainStringDeserializer; import lombok.Data; @Data diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/observation/service/ObservationService.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/observation/service/ObservationService.java index 14978c7ed..23cf7f3cc 100644 --- a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/observation/service/ObservationService.java +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/observation/service/ObservationService.java @@ -1,17 +1,17 @@ package gov.cdc.nbs.report.pipeline.observation.service; -import static gov.cdc.etldatapipeline.commonutil.UtilHelper.*; +import static gov.cdc.nbs.report.pipeline.util.UtilHelper.*; -import gov.cdc.etldatapipeline.commonutil.DataProcessingException; -import gov.cdc.etldatapipeline.commonutil.NoDataException; -import gov.cdc.etldatapipeline.commonutil.json.CustomJsonGeneratorImpl; -import gov.cdc.etldatapipeline.commonutil.metrics.CustomMetrics; import gov.cdc.nbs.report.pipeline.observation.model.dto.observation.Observation; import gov.cdc.nbs.report.pipeline.observation.model.dto.observation.ObservationKey; import gov.cdc.nbs.report.pipeline.observation.model.dto.observation.ObservationReporting; import gov.cdc.nbs.report.pipeline.observation.model.dto.observation.ObservationTransformed; import gov.cdc.nbs.report.pipeline.observation.repository.ObservationRepository; import gov.cdc.nbs.report.pipeline.observation.transformer.ProcessObservationDataUtil; +import gov.cdc.nbs.report.pipeline.util.DataProcessingException; +import gov.cdc.nbs.report.pipeline.util.NoDataException; +import gov.cdc.nbs.report.pipeline.util.json.CustomJsonGeneratorImpl; +import gov.cdc.nbs.report.pipeline.util.metrics.CustomMetrics; import io.micrometer.core.instrument.Counter; import jakarta.annotation.PostConstruct; import jakarta.persistence.EntityNotFoundException; diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/observation/transformer/ProcessObservationDataUtil.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/observation/transformer/ProcessObservationDataUtil.java index 473594132..cd329051e 100644 --- a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/observation/transformer/ProcessObservationDataUtil.java +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/observation/transformer/ProcessObservationDataUtil.java @@ -4,10 +4,10 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import gov.cdc.etldatapipeline.commonutil.json.CustomJsonGeneratorImpl; import gov.cdc.nbs.report.pipeline.observation.model.dto.observation.*; import gov.cdc.nbs.report.pipeline.observation.model.dto.observation.Observation; import gov.cdc.nbs.report.pipeline.observation.model.dto.observation.ObservationTransformed; +import gov.cdc.nbs.report.pipeline.util.json.CustomJsonGeneratorImpl; import java.util.ArrayList; import java.util.Arrays; import java.util.List; diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/organization/service/OrganizationService.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/organization/service/OrganizationService.java index f86dd0d4c..f5e447d0d 100644 --- a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/organization/service/OrganizationService.java +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/organization/service/OrganizationService.java @@ -1,11 +1,8 @@ package gov.cdc.nbs.report.pipeline.organization.service; -import static gov.cdc.etldatapipeline.commonutil.UtilHelper.errorMessage; -import static gov.cdc.etldatapipeline.commonutil.UtilHelper.extractUid; +import static gov.cdc.nbs.report.pipeline.util.UtilHelper.errorMessage; +import static gov.cdc.nbs.report.pipeline.util.UtilHelper.extractUid; -import gov.cdc.etldatapipeline.commonutil.DataProcessingException; -import gov.cdc.etldatapipeline.commonutil.NoDataException; -import gov.cdc.etldatapipeline.commonutil.metrics.CustomMetrics; import gov.cdc.nbs.report.pipeline.organization.model.dto.org.OrganizationSp; import gov.cdc.nbs.report.pipeline.organization.model.dto.place.Place; import gov.cdc.nbs.report.pipeline.organization.model.dto.place.PlaceTele; @@ -13,6 +10,9 @@ import gov.cdc.nbs.report.pipeline.organization.repository.PlaceRepository; import gov.cdc.nbs.report.pipeline.organization.transformer.DataTransformers; import gov.cdc.nbs.report.pipeline.organization.transformer.OrganizationType; +import gov.cdc.nbs.report.pipeline.util.DataProcessingException; +import gov.cdc.nbs.report.pipeline.util.NoDataException; +import gov.cdc.nbs.report.pipeline.util.metrics.CustomMetrics; import io.micrometer.core.instrument.Counter; import jakarta.annotation.PostConstruct; import jakarta.persistence.EntityNotFoundException; diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/organization/transformer/DataPostProcessor.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/organization/transformer/DataPostProcessor.java index 67367158c..8be6b73bc 100644 --- a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/organization/transformer/DataPostProcessor.java +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/organization/transformer/DataPostProcessor.java @@ -1,6 +1,6 @@ package gov.cdc.nbs.report.pipeline.organization.transformer; -import static gov.cdc.etldatapipeline.commonutil.UtilHelper.deserializePayload; +import static gov.cdc.nbs.report.pipeline.util.UtilHelper.deserializePayload; import static java.util.Objects.requireNonNull; import gov.cdc.nbs.report.pipeline.organization.model.dto.org.OrganizationElasticSearch; diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/organization/transformer/DataTransformers.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/organization/transformer/DataTransformers.java index 37ef2e4f4..9968e2af9 100644 --- a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/organization/transformer/DataTransformers.java +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/organization/transformer/DataTransformers.java @@ -1,11 +1,11 @@ package gov.cdc.nbs.report.pipeline.organization.transformer; -import gov.cdc.etldatapipeline.commonutil.json.CustomJsonGeneratorImpl; import gov.cdc.nbs.report.pipeline.organization.model.dto.org.OrganizationElasticSearch; import gov.cdc.nbs.report.pipeline.organization.model.dto.org.OrganizationKey; import gov.cdc.nbs.report.pipeline.organization.model.dto.org.OrganizationReporting; import gov.cdc.nbs.report.pipeline.organization.model.dto.org.OrganizationSp; import gov.cdc.nbs.report.pipeline.organization.model.dto.place.*; +import gov.cdc.nbs.report.pipeline.util.json.CustomJsonGeneratorImpl; import java.util.List; import org.springframework.stereotype.Component; diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/person/service/PersonService.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/person/service/PersonService.java index 41e794954..cfb7f55a5 100644 --- a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/person/service/PersonService.java +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/person/service/PersonService.java @@ -1,14 +1,11 @@ package gov.cdc.nbs.report.pipeline.person.service; -import static gov.cdc.etldatapipeline.commonutil.UtilHelper.errorMessage; -import static gov.cdc.etldatapipeline.commonutil.UtilHelper.extractUid; +import static gov.cdc.nbs.report.pipeline.util.UtilHelper.errorMessage; +import static gov.cdc.nbs.report.pipeline.util.UtilHelper.extractUid; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import gov.cdc.etldatapipeline.commonutil.DataProcessingException; -import gov.cdc.etldatapipeline.commonutil.NoDataException; -import gov.cdc.etldatapipeline.commonutil.metrics.CustomMetrics; import gov.cdc.nbs.report.pipeline.person.model.dto.patient.PatientSp; import gov.cdc.nbs.report.pipeline.person.model.dto.provider.ProviderSp; import gov.cdc.nbs.report.pipeline.person.model.dto.user.AuthUser; @@ -17,6 +14,9 @@ import gov.cdc.nbs.report.pipeline.person.repository.UserRepository; import gov.cdc.nbs.report.pipeline.person.transformer.PersonTransformers; import gov.cdc.nbs.report.pipeline.person.transformer.PersonType; +import gov.cdc.nbs.report.pipeline.util.DataProcessingException; +import gov.cdc.nbs.report.pipeline.util.NoDataException; +import gov.cdc.nbs.report.pipeline.util.metrics.CustomMetrics; import io.micrometer.core.instrument.Counter; import jakarta.annotation.PostConstruct; import jakarta.persistence.EntityNotFoundException; diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/person/transformer/DataPostProcessor.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/person/transformer/DataPostProcessor.java index bf74d7c94..f940180b5 100644 --- a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/person/transformer/DataPostProcessor.java +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/person/transformer/DataPostProcessor.java @@ -1,6 +1,6 @@ package gov.cdc.nbs.report.pipeline.person.transformer; -import static gov.cdc.etldatapipeline.commonutil.UtilHelper.deserializePayload; +import static gov.cdc.nbs.report.pipeline.util.UtilHelper.deserializePayload; import static java.util.Objects.requireNonNull; import static java.util.stream.Collectors.groupingBy; import static java.util.stream.Collectors.toList; diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/person/transformer/PersonTransformers.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/person/transformer/PersonTransformers.java index 97c34bc22..dccf25b94 100644 --- a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/person/transformer/PersonTransformers.java +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/person/transformer/PersonTransformers.java @@ -1,6 +1,5 @@ package gov.cdc.nbs.report.pipeline.person.transformer; -import gov.cdc.etldatapipeline.commonutil.json.CustomJsonGeneratorImpl; import gov.cdc.nbs.report.pipeline.person.model.dto.PersonExtendedProps; import gov.cdc.nbs.report.pipeline.person.model.dto.patient.PatientElasticSearch; import gov.cdc.nbs.report.pipeline.person.model.dto.patient.PatientKey; @@ -12,6 +11,7 @@ import gov.cdc.nbs.report.pipeline.person.model.dto.provider.ProviderSp; import gov.cdc.nbs.report.pipeline.person.model.dto.user.AuthUser; import gov.cdc.nbs.report.pipeline.person.model.dto.user.AuthUserKey; +import gov.cdc.nbs.report.pipeline.util.json.CustomJsonGeneratorImpl; import org.springframework.stereotype.Component; @Component diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/postprocessing/service/PostProcessingService.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/postprocessing/service/PostProcessingService.java index 0914030e8..421f5402a 100644 --- a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/postprocessing/service/PostProcessingService.java +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/postprocessing/service/PostProcessingService.java @@ -1,6 +1,5 @@ package gov.cdc.nbs.report.pipeline.postprocessing.service; -import static gov.cdc.etldatapipeline.commonutil.UtilHelper.errorMessage; import static gov.cdc.nbs.report.pipeline.postprocessing.service.Entity.AGGREGATE_REPORT_DATAMART; import static gov.cdc.nbs.report.pipeline.postprocessing.service.Entity.CASE_ANSWERS; import static gov.cdc.nbs.report.pipeline.postprocessing.service.Entity.CASE_COUNT; @@ -38,17 +37,18 @@ import static gov.cdc.nbs.report.pipeline.postprocessing.service.Entity.VAR_PAM_LDF; import static gov.cdc.nbs.report.pipeline.postprocessing.service.ProcessDatamartData.MULTI_ID_DATAMART; import static gov.cdc.nbs.report.pipeline.postprocessing.service.ProcessDatamartData.STATUS_READY; +import static gov.cdc.nbs.report.pipeline.util.UtilHelper.errorMessage; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import gov.cdc.etldatapipeline.commonutil.DataProcessingException; -import gov.cdc.etldatapipeline.commonutil.metrics.CustomMetrics; import gov.cdc.nbs.report.pipeline.postprocessing.repository.InvestigationRepository; import gov.cdc.nbs.report.pipeline.postprocessing.repository.PostProcRepository; import gov.cdc.nbs.report.pipeline.postprocessing.repository.model.BackfillData; import gov.cdc.nbs.report.pipeline.postprocessing.repository.model.DatamartData; import gov.cdc.nbs.report.pipeline.postprocessing.repository.model.dto.Datamart; +import gov.cdc.nbs.report.pipeline.util.DataProcessingException; +import gov.cdc.nbs.report.pipeline.util.metrics.CustomMetrics; import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.Timer; import jakarta.annotation.PostConstruct; diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/postprocessing/service/ProcessDatamartData.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/postprocessing/service/ProcessDatamartData.java index 9997c2720..2e1d91ed6 100644 --- a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/postprocessing/service/ProcessDatamartData.java +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/postprocessing/service/ProcessDatamartData.java @@ -1,18 +1,18 @@ package gov.cdc.nbs.report.pipeline.postprocessing.service; -import static gov.cdc.etldatapipeline.commonutil.UtilHelper.errorMessage; import static gov.cdc.nbs.report.pipeline.postprocessing.service.Entity.*; +import static gov.cdc.nbs.report.pipeline.util.UtilHelper.errorMessage; import com.google.common.base.Strings; -import gov.cdc.etldatapipeline.commonutil.DataProcessingException; -import gov.cdc.etldatapipeline.commonutil.json.CustomJsonGeneratorImpl; -import gov.cdc.etldatapipeline.commonutil.metrics.CustomMetrics; import gov.cdc.nbs.report.pipeline.postprocessing.repository.InvestigationRepository; import gov.cdc.nbs.report.pipeline.postprocessing.repository.PostProcRepository; import gov.cdc.nbs.report.pipeline.postprocessing.repository.model.BackfillData; import gov.cdc.nbs.report.pipeline.postprocessing.repository.model.DatamartData; import gov.cdc.nbs.report.pipeline.postprocessing.repository.model.dto.Datamart; import gov.cdc.nbs.report.pipeline.postprocessing.repository.model.dto.DatamartKey; +import gov.cdc.nbs.report.pipeline.util.DataProcessingException; +import gov.cdc.nbs.report.pipeline.util.json.CustomJsonGeneratorImpl; +import gov.cdc.nbs.report.pipeline.util.metrics.CustomMetrics; import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.Timer; import jakarta.annotation.PostConstruct; diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/DataProcessingException.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/DataProcessingException.java new file mode 100644 index 000000000..4940066dc --- /dev/null +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/DataProcessingException.java @@ -0,0 +1,11 @@ +package gov.cdc.nbs.report.pipeline.util; + +public class DataProcessingException extends RuntimeException { + public DataProcessingException(String message) { + super(message); + } + + public DataProcessingException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/NoDataException.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/NoDataException.java new file mode 100644 index 000000000..fa284c71f --- /dev/null +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/NoDataException.java @@ -0,0 +1,11 @@ +package gov.cdc.nbs.report.pipeline.util; + +public class NoDataException extends RuntimeException { + public NoDataException(String message) { + super(message); + } + + public NoDataException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/TestUtils.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/TestUtils.java new file mode 100644 index 000000000..1a5970be3 --- /dev/null +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/TestUtils.java @@ -0,0 +1,23 @@ +package gov.cdc.nbs.report.pipeline.util; + +import java.io.IOException; +import java.nio.charset.Charset; +import org.apache.commons.io.FileUtils; +import org.springframework.core.io.ClassPathResource; + +public class TestUtils { + + private TestUtils() { + throw new IllegalStateException("Utility class"); + } + + // Read file data + public static String readFileData(String fileName) { + try { + return FileUtils.readFileToString( + new ClassPathResource(fileName).getFile(), Charset.defaultCharset()); + } catch (IOException e) { + throw new DataProcessingException("File Read failed : " + fileName); + } + } +} diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/UtilHelper.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/UtilHelper.java new file mode 100644 index 000000000..f6ce8e601 --- /dev/null +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/UtilHelper.java @@ -0,0 +1,68 @@ +package gov.cdc.nbs.report.pipeline.util; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import java.util.NoSuchElementException; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class UtilHelper { + private static final ObjectMapper objectMapper = + new ObjectMapper().registerModule(new JavaTimeModule()); + + private static final String PAYLOAD_KEY = "payload"; + private static final String DEFAULT_PATH = "after"; + + private UtilHelper() { + throw new IllegalStateException("Utility class"); + } + + public static T deserializePayload(String jsonString, Class type) { + try { + if (jsonString == null) return null; + return objectMapper.readValue(jsonString, type); + } catch (JsonProcessingException e) { + log.error("JsonProcessingException: ", e); + } + return null; + } + + public static String extractUid(String value, String uidName, String... overridePath) + throws JsonProcessingException { + JsonNode jsonNode = objectMapper.readTree(value); + JsonNode payloadNode = jsonNode.get(PAYLOAD_KEY); + + String path = overridePath.length > 0 ? overridePath[0] : DEFAULT_PATH; + JsonNode dataNode = jsonNode.get(PAYLOAD_KEY).path(path); + payloadNode = dataNode.isMissingNode() ? payloadNode : dataNode; + if (payloadNode.has(uidName)) { + return payloadNode.get(uidName).asText(); + } else { + throw new NoSuchElementException( + "The " + uidName + " field is missing in the message payload."); + } + } + + public static String extractValue(String message, String fieldName, String... overridePath) + throws JsonProcessingException { + JsonNode jsonNode = objectMapper.readTree(message); + String nodePath = overridePath.length > 0 ? overridePath[0] : DEFAULT_PATH; + return jsonNode.get(PAYLOAD_KEY).path(nodePath).path(fieldName).asText(); + } + + public static String extractChangeDataCaptureOperation(String message) + throws JsonProcessingException { + JsonNode jsonNode = objectMapper.readTree(message); + return jsonNode.get(PAYLOAD_KEY).path("op").asText(); + } + + public static String errorMessage(String entityName, String ids, Exception e) { + String base = "Error processing " + entityName + " data"; + if (ids != null && !ids.isEmpty()) { + base += " with ids '" + ids + "'"; + } + return base + ": " + e.getMessage(); + } +} diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/json/CustomJsonGeneratorImpl.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/json/CustomJsonGeneratorImpl.java new file mode 100644 index 000000000..a00004f58 --- /dev/null +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/json/CustomJsonGeneratorImpl.java @@ -0,0 +1,104 @@ +package gov.cdc.nbs.report.pipeline.util.json; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.google.common.base.CaseFormat; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class CustomJsonGeneratorImpl { + + private static final ObjectMapper objectMapper = + new ObjectMapper().registerModule(new JavaTimeModule()); + private static final List DEFAULT_KEYS = + Arrays.asList( + "public_health_case_uid", + "act_uid", + "observation_uid", + "organization_uid", + "provider_uid", + "patient_uid", + "notification_uid"); + + public String generateStringJson(Object model, String... overrideKeys) { + try { + ObjectNode root = objectMapper.createObjectNode(); + ObjectNode schemaNode = root.putObject("schema"); + schemaNode.put("type", "struct"); + List pkeys = + Optional.ofNullable(overrideKeys) + .filter(keys -> keys.length > 0) + .map(Arrays::asList) + .orElse(DEFAULT_KEYS); + schemaNode.set("fields", generateFieldsArray(model, pkeys)); + ObjectNode payloadNode = root.putObject("payload"); + generatePayloadNode(payloadNode, model); + return objectMapper.writeValueAsString(root); + } catch (Exception e) { + log.error("Failed to generate JSON string for model: {}", model.getClass().getName(), e); + return null; + } + } + + private static ArrayNode generateFieldsArray(Object model, List pKeys) { + ArrayNode fieldsArray = objectMapper.createArrayNode(); + try { + Class modelClass = model.getClass(); + for (Field field : modelClass.getDeclaredFields()) { + ObjectNode fieldNode = objectMapper.createObjectNode(); + + String fieldName = getFieldName(field); + + fieldNode.put("type", getType(field.getType().getSimpleName().toLowerCase())); + fieldNode.put("optional", (!pKeys.contains(fieldName))); + fieldNode.put("field", fieldName); + fieldsArray.add(fieldNode); + } + } catch (Exception e) { + log.error("Failed to generate JSON array node for model: {}", model.getClass().getName(), e); + } + + return fieldsArray; + } + + private static ObjectNode generatePayloadNode(ObjectNode payloadNode, Object model) { + try { + Class modelClass = model.getClass(); + for (java.lang.reflect.Field field : modelClass.getDeclaredFields()) { + field.setAccessible(true); + String fieldName = getFieldName(field); + + payloadNode.set(fieldName, objectMapper.valueToTree(field.get(model))); + } + } catch (Exception e) { + log.error( + "Failed to generate JSON payload node for model: {}", model.getClass().getName(), e); + } + + return payloadNode; + } + + private static String getFieldName(Field field) { + if (field.isAnnotationPresent(JsonProperty.class)) { + return field.getAnnotation(JsonProperty.class).value(); + } else { + return CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, field.getName()); + } + } + + private static String getType(String javaType) { + return switch (javaType.toLowerCase()) { + case "long" -> "int64"; + case "integer", "int" -> "int32"; + case "instant" -> "string"; + default -> javaType.toLowerCase(); + }; + } +} diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/json/NumberToPlainStringDeserializer.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/json/NumberToPlainStringDeserializer.java new file mode 100644 index 000000000..6eaa78324 --- /dev/null +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/json/NumberToPlainStringDeserializer.java @@ -0,0 +1,24 @@ +package gov.cdc.nbs.report.pipeline.util.json; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import java.io.IOException; +import java.math.BigDecimal; + +public class NumberToPlainStringDeserializer extends JsonDeserializer { + @Override + public String deserialize(JsonParser p, DeserializationContext ctx) throws IOException { + JsonToken t = p.getCurrentToken(); + if (t == JsonToken.VALUE_NUMBER_INT || t == JsonToken.VALUE_NUMBER_FLOAT) { + // Use BigDecimal to avoid scientific notation + BigDecimal bd = p.getDecimalValue(); + return bd.toPlainString(); // preserves non-sci; scale preserved if available + } else if (t == JsonToken.VALUE_STRING) { + return p.getText(); + } + // fallback + return ctx.handleUnexpectedToken(String.class, p).toString(); + } +} diff --git a/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/metrics/CustomMetrics.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/metrics/CustomMetrics.java new file mode 100644 index 000000000..b19606f9d --- /dev/null +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/metrics/CustomMetrics.java @@ -0,0 +1,46 @@ +package gov.cdc.nbs.report.pipeline.util.metrics; + +import io.micrometer.core.instrument.*; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@Setter +public class CustomMetrics { + private final MeterRegistry registry; + private final ConcurrentMap meters = new ConcurrentHashMap<>(); + + public Counter counter(String name, String... tags) { + return (Counter) + meters.computeIfAbsent(name, k -> Counter.builder(name).tags(tags).register(registry)); + } + + public Timer timer(String name, String... tags) { + return (Timer) + meters.computeIfAbsent(name, k -> Timer.builder(name).tags(tags).register(registry)); + } + + public void gauge( + String name, T obj, java.util.function.ToDoubleFunction valueFunction, String... tags) { + Objects.requireNonNull(obj, "gauge source"); + meters.computeIfAbsent( + name, k -> Gauge.builder(name, obj, valueFunction).tags(tags).register(registry)); + } + + public void recordTime(String name, Runnable runnable, String... tags) { + timer(name, tags).record(runnable); + } + + public Timer.Sample startSample() { + return Timer.start(registry); + } + + public void stopSample(Timer.Sample sample, Timer timer) { + sample.stop(timer); + } +} diff --git a/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/metrics/CustomMetricsAutoConfiguration.java b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/metrics/CustomMetricsAutoConfiguration.java similarity index 61% rename from common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/metrics/CustomMetricsAutoConfiguration.java rename to reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/metrics/CustomMetricsAutoConfiguration.java index df43334aa..73c190c51 100644 --- a/common-util/src/main/java/gov/cdc/etldatapipeline/commonutil/metrics/CustomMetricsAutoConfiguration.java +++ b/reporting-pipeline-service/src/main/java/gov/cdc/nbs/report/pipeline/util/metrics/CustomMetricsAutoConfiguration.java @@ -1,4 +1,4 @@ -package gov.cdc.etldatapipeline.commonutil.metrics; +package gov.cdc.nbs.report.pipeline.util.metrics; import io.micrometer.core.instrument.MeterRegistry; import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -10,11 +10,13 @@ @AutoConfiguration @ConditionalOnClass(MeterRegistry.class) @ConditionalOnBean(MeterRegistry.class) -@AutoConfigureAfter(name = "org.springframework.boot.actuate.autoconfigure.metrics.export.prometheus.PrometheusMetricsExportAutoConfiguration") +@AutoConfigureAfter( + name = + "org.springframework.boot.actuate.autoconfigure.metrics.export.prometheus.PrometheusMetricsExportAutoConfiguration") public class CustomMetricsAutoConfiguration { - @Bean - public CustomMetrics customMetrics(MeterRegistry meterRegistry) { - return new CustomMetrics(meterRegistry); - } + @Bean + public CustomMetrics customMetrics(MeterRegistry meterRegistry) { + return new CustomMetrics(meterRegistry); + } } diff --git a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/investigation/InvestigationDataProcessingTests.java b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/investigation/InvestigationDataProcessingTests.java index fc5c55f80..53350b7f7 100644 --- a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/investigation/InvestigationDataProcessingTests.java +++ b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/investigation/InvestigationDataProcessingTests.java @@ -1,7 +1,7 @@ package gov.cdc.nbs.report.pipeline.investigation; -import static gov.cdc.etldatapipeline.commonutil.TestUtils.readFileData; import static gov.cdc.nbs.report.pipeline.investigation.utils.TestUtils.*; +import static gov.cdc.nbs.report.pipeline.util.TestUtils.readFileData; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @@ -11,12 +11,12 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import gov.cdc.etldatapipeline.commonutil.metrics.CustomMetrics; import gov.cdc.nbs.report.pipeline.investigation.repository.InvestigationRepository; import gov.cdc.nbs.report.pipeline.investigation.repository.model.dto.*; import gov.cdc.nbs.report.pipeline.investigation.repository.model.reporting.*; import gov.cdc.nbs.report.pipeline.investigation.repository.model.reporting.InterviewReporting; import gov.cdc.nbs.report.pipeline.investigation.util.ProcessInvestigationDataUtil; +import gov.cdc.nbs.report.pipeline.util.metrics.CustomMetrics; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import java.util.List; import java.util.concurrent.CompletableFuture; diff --git a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/investigation/service/InvestigationServiceTest.java b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/investigation/service/InvestigationServiceTest.java index e4eed5cc5..213b23fb2 100644 --- a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/investigation/service/InvestigationServiceTest.java +++ b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/investigation/service/InvestigationServiceTest.java @@ -1,21 +1,21 @@ package gov.cdc.nbs.report.pipeline.investigation.service; -import static gov.cdc.etldatapipeline.commonutil.TestUtils.readFileData; import static gov.cdc.nbs.report.pipeline.investigation.service.InvestigationService.toBatchId; import static gov.cdc.nbs.report.pipeline.investigation.utils.TestUtils.*; import static gov.cdc.nbs.report.pipeline.investigation.utils.TestUtils.FILE_PATH_PREFIX; +import static gov.cdc.nbs.report.pipeline.util.TestUtils.readFileData; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import gov.cdc.etldatapipeline.commonutil.DataProcessingException; -import gov.cdc.etldatapipeline.commonutil.NoDataException; -import gov.cdc.etldatapipeline.commonutil.metrics.CustomMetrics; import gov.cdc.nbs.report.pipeline.investigation.repository.*; import gov.cdc.nbs.report.pipeline.investigation.repository.model.dto.*; import gov.cdc.nbs.report.pipeline.investigation.repository.model.reporting.*; import gov.cdc.nbs.report.pipeline.investigation.util.ProcessInvestigationDataUtil; +import gov.cdc.nbs.report.pipeline.util.DataProcessingException; +import gov.cdc.nbs.report.pipeline.util.NoDataException; +import gov.cdc.nbs.report.pipeline.util.metrics.CustomMetrics; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import java.util.List; import java.util.Optional; diff --git a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/investigation/utils/TestUtils.java b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/investigation/utils/TestUtils.java index 46c899aad..58ff36bd1 100644 --- a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/investigation/utils/TestUtils.java +++ b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/investigation/utils/TestUtils.java @@ -1,6 +1,6 @@ package gov.cdc.nbs.report.pipeline.investigation.utils; -import static gov.cdc.etldatapipeline.commonutil.TestUtils.readFileData; +import static gov.cdc.nbs.report.pipeline.util.TestUtils.readFileData; import gov.cdc.nbs.report.pipeline.investigation.repository.model.dto.*; import gov.cdc.nbs.report.pipeline.investigation.repository.model.reporting.*; diff --git a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/ldfdata/service/LdfDataServiceTest.java b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/ldfdata/service/LdfDataServiceTest.java index a4cca7c4a..fffdb8731 100644 --- a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/ldfdata/service/LdfDataServiceTest.java +++ b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/ldfdata/service/LdfDataServiceTest.java @@ -6,13 +6,13 @@ import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; -import gov.cdc.etldatapipeline.commonutil.DataProcessingException; -import gov.cdc.etldatapipeline.commonutil.NoDataException; -import gov.cdc.etldatapipeline.commonutil.json.CustomJsonGeneratorImpl; -import gov.cdc.etldatapipeline.commonutil.metrics.CustomMetrics; import gov.cdc.nbs.report.pipeline.ldfdata.model.dto.LdfData; import gov.cdc.nbs.report.pipeline.ldfdata.model.dto.LdfDataKey; import gov.cdc.nbs.report.pipeline.ldfdata.repository.LdfDataRepository; +import gov.cdc.nbs.report.pipeline.util.DataProcessingException; +import gov.cdc.nbs.report.pipeline.util.NoDataException; +import gov.cdc.nbs.report.pipeline.util.json.CustomJsonGeneratorImpl; +import gov.cdc.nbs.report.pipeline.util.metrics.CustomMetrics; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import java.util.List; import java.util.Optional; diff --git a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/observation/ObservationDataProcessTests.java b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/observation/ObservationDataProcessTests.java index ec9a6f265..b2ff48dd0 100644 --- a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/observation/ObservationDataProcessTests.java +++ b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/observation/ObservationDataProcessTests.java @@ -1,6 +1,6 @@ package gov.cdc.nbs.report.pipeline.observation; -import static gov.cdc.etldatapipeline.commonutil.TestUtils.readFileData; +import static gov.cdc.nbs.report.pipeline.util.TestUtils.readFileData; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.*; diff --git a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/observation/service/ObservationServiceTest.java b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/observation/service/ObservationServiceTest.java index 356e65446..10d99c8e3 100644 --- a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/observation/service/ObservationServiceTest.java +++ b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/observation/service/ObservationServiceTest.java @@ -1,20 +1,20 @@ package gov.cdc.nbs.report.pipeline.observation.service; -import static gov.cdc.etldatapipeline.commonutil.TestUtils.readFileData; import static gov.cdc.nbs.report.pipeline.observation.service.ObservationService.toBatchId; +import static gov.cdc.nbs.report.pipeline.util.TestUtils.readFileData; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import gov.cdc.etldatapipeline.commonutil.NoDataException; -import gov.cdc.etldatapipeline.commonutil.metrics.CustomMetrics; import gov.cdc.nbs.report.pipeline.observation.model.dto.observation.Observation; import gov.cdc.nbs.report.pipeline.observation.model.dto.observation.ObservationKey; import gov.cdc.nbs.report.pipeline.observation.model.dto.observation.ObservationReporting; import gov.cdc.nbs.report.pipeline.observation.repository.ObservationRepository; import gov.cdc.nbs.report.pipeline.observation.transformer.ProcessObservationDataUtil; +import gov.cdc.nbs.report.pipeline.util.NoDataException; +import gov.cdc.nbs.report.pipeline.util.metrics.CustomMetrics; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import java.util.NoSuchElementException; import java.util.Optional; diff --git a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/organization/OrganizationDataProcessTests.java b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/organization/OrganizationDataProcessTests.java index aa3de7b16..41b40434e 100644 --- a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/organization/OrganizationDataProcessTests.java +++ b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/organization/OrganizationDataProcessTests.java @@ -1,8 +1,8 @@ package gov.cdc.nbs.report.pipeline.organization; -import static gov.cdc.etldatapipeline.commonutil.TestUtils.readFileData; -import static gov.cdc.etldatapipeline.commonutil.UtilHelper.deserializePayload; import static gov.cdc.nbs.report.pipeline.organization.transformer.OrganizationType.ORGANIZATION_REPORTING; +import static gov.cdc.nbs.report.pipeline.util.TestUtils.readFileData; +import static gov.cdc.nbs.report.pipeline.util.UtilHelper.deserializePayload; import static org.junit.jupiter.api.Assertions.*; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/organization/service/OrganizationServiceTest.java b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/organization/service/OrganizationServiceTest.java index d56c926f4..566253843 100644 --- a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/organization/service/OrganizationServiceTest.java +++ b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/organization/service/OrganizationServiceTest.java @@ -1,7 +1,7 @@ package gov.cdc.nbs.report.pipeline.organization.service; -import static gov.cdc.etldatapipeline.commonutil.TestUtils.readFileData; -import static gov.cdc.etldatapipeline.commonutil.UtilHelper.deserializePayload; +import static gov.cdc.nbs.report.pipeline.util.TestUtils.readFileData; +import static gov.cdc.nbs.report.pipeline.util.UtilHelper.deserializePayload; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.*; @@ -12,13 +12,13 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import gov.cdc.etldatapipeline.commonutil.NoDataException; -import gov.cdc.etldatapipeline.commonutil.metrics.CustomMetrics; import gov.cdc.nbs.report.pipeline.organization.model.dto.org.OrganizationSp; import gov.cdc.nbs.report.pipeline.organization.model.dto.place.*; import gov.cdc.nbs.report.pipeline.organization.repository.OrgRepository; import gov.cdc.nbs.report.pipeline.organization.repository.PlaceRepository; import gov.cdc.nbs.report.pipeline.organization.transformer.DataTransformers; +import gov.cdc.nbs.report.pipeline.util.NoDataException; +import gov.cdc.nbs.report.pipeline.util.metrics.CustomMetrics; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import java.util.*; import java.util.concurrent.CompletableFuture; diff --git a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/person/PersonDataPostProcessingTests.java b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/person/PersonDataPostProcessingTests.java index bbe61aaf0..7c8f6d5c6 100644 --- a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/person/PersonDataPostProcessingTests.java +++ b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/person/PersonDataPostProcessingTests.java @@ -1,7 +1,7 @@ package gov.cdc.nbs.report.pipeline.person; -import static gov.cdc.etldatapipeline.commonutil.TestUtils.readFileData; -import static gov.cdc.etldatapipeline.commonutil.UtilHelper.deserializePayload; +import static gov.cdc.nbs.report.pipeline.util.TestUtils.readFileData; +import static gov.cdc.nbs.report.pipeline.util.UtilHelper.deserializePayload; import static org.junit.jupiter.api.Assertions.assertEquals; import com.fasterxml.jackson.core.JsonProcessingException; diff --git a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/person/PersonDetailsDeserializationTests.java b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/person/PersonDetailsDeserializationTests.java index 6e1e6e77d..0c752066d 100644 --- a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/person/PersonDetailsDeserializationTests.java +++ b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/person/PersonDetailsDeserializationTests.java @@ -1,7 +1,7 @@ package gov.cdc.nbs.report.pipeline.person; -import static gov.cdc.etldatapipeline.commonutil.TestUtils.readFileData; -import static gov.cdc.etldatapipeline.commonutil.UtilHelper.deserializePayload; +import static gov.cdc.nbs.report.pipeline.util.TestUtils.readFileData; +import static gov.cdc.nbs.report.pipeline.util.UtilHelper.deserializePayload; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; diff --git a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/person/service/PersonServiceTest.java b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/person/service/PersonServiceTest.java index f5354646e..ca16b566a 100644 --- a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/person/service/PersonServiceTest.java +++ b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/person/service/PersonServiceTest.java @@ -1,6 +1,6 @@ package gov.cdc.nbs.report.pipeline.person.service; -import static gov.cdc.etldatapipeline.commonutil.TestUtils.readFileData; +import static gov.cdc.nbs.report.pipeline.util.TestUtils.readFileData; import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.anyString; @@ -12,9 +12,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import gov.cdc.etldatapipeline.commonutil.DataProcessingException; -import gov.cdc.etldatapipeline.commonutil.NoDataException; -import gov.cdc.etldatapipeline.commonutil.metrics.CustomMetrics; import gov.cdc.nbs.report.pipeline.person.model.dto.patient.PatientSp; import gov.cdc.nbs.report.pipeline.person.model.dto.provider.ProviderSp; import gov.cdc.nbs.report.pipeline.person.model.dto.user.AuthUser; @@ -23,6 +20,9 @@ import gov.cdc.nbs.report.pipeline.person.repository.ProviderRepository; import gov.cdc.nbs.report.pipeline.person.repository.UserRepository; import gov.cdc.nbs.report.pipeline.person.transformer.PersonTransformers; +import gov.cdc.nbs.report.pipeline.util.DataProcessingException; +import gov.cdc.nbs.report.pipeline.util.NoDataException; +import gov.cdc.nbs.report.pipeline.util.metrics.CustomMetrics; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import java.util.*; import java.util.concurrent.CompletableFuture; diff --git a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/postprocessing/service/DatamartProcessingTest.java b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/postprocessing/service/DatamartProcessingTest.java index a2f6526eb..46e72e9a0 100644 --- a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/postprocessing/service/DatamartProcessingTest.java +++ b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/postprocessing/service/DatamartProcessingTest.java @@ -1,19 +1,19 @@ package gov.cdc.nbs.report.pipeline.postprocessing.service; -import static gov.cdc.etldatapipeline.commonutil.TestUtils.readFileData; import static gov.cdc.nbs.report.pipeline.postprocessing.service.Entity.*; +import static gov.cdc.nbs.report.pipeline.util.TestUtils.readFileData; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.verify; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import gov.cdc.etldatapipeline.commonutil.metrics.CustomMetrics; import gov.cdc.nbs.report.pipeline.postprocessing.repository.InvestigationRepository; import gov.cdc.nbs.report.pipeline.postprocessing.repository.PostProcRepository; import gov.cdc.nbs.report.pipeline.postprocessing.repository.model.DatamartData; import gov.cdc.nbs.report.pipeline.postprocessing.repository.model.dto.Datamart; import gov.cdc.nbs.report.pipeline.postprocessing.repository.model.dto.DatamartKey; +import gov.cdc.nbs.report.pipeline.util.metrics.CustomMetrics; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import java.util.List; import java.util.stream.Stream; diff --git a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/postprocessing/service/PostProcessingServiceDmTest.java b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/postprocessing/service/PostProcessingServiceDmTest.java index c83b8cb6a..2172a682d 100644 --- a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/postprocessing/service/PostProcessingServiceDmTest.java +++ b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/postprocessing/service/PostProcessingServiceDmTest.java @@ -8,10 +8,10 @@ import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; -import gov.cdc.etldatapipeline.commonutil.metrics.CustomMetrics; import gov.cdc.nbs.report.pipeline.postprocessing.repository.InvestigationRepository; import gov.cdc.nbs.report.pipeline.postprocessing.repository.PostProcRepository; import gov.cdc.nbs.report.pipeline.postprocessing.repository.model.DatamartData; +import gov.cdc.nbs.report.pipeline.util.metrics.CustomMetrics; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import java.util.ArrayList; import java.util.List; diff --git a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/postprocessing/service/PostProcessingServiceEntityTest.java b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/postprocessing/service/PostProcessingServiceEntityTest.java index 7a92a3c3b..2568557a7 100644 --- a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/postprocessing/service/PostProcessingServiceEntityTest.java +++ b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/postprocessing/service/PostProcessingServiceEntityTest.java @@ -11,10 +11,10 @@ import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; -import gov.cdc.etldatapipeline.commonutil.metrics.CustomMetrics; import gov.cdc.nbs.report.pipeline.postprocessing.repository.InvestigationRepository; import gov.cdc.nbs.report.pipeline.postprocessing.repository.PostProcRepository; import gov.cdc.nbs.report.pipeline.postprocessing.repository.model.DatamartData; +import gov.cdc.nbs.report.pipeline.util.metrics.CustomMetrics; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import java.util.ArrayList; import java.util.List; diff --git a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/postprocessing/service/PostProcessingServiceRetryTest.java b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/postprocessing/service/PostProcessingServiceRetryTest.java index 936206f81..37e5127fe 100644 --- a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/postprocessing/service/PostProcessingServiceRetryTest.java +++ b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/postprocessing/service/PostProcessingServiceRetryTest.java @@ -9,11 +9,11 @@ import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; -import gov.cdc.etldatapipeline.commonutil.metrics.CustomMetrics; import gov.cdc.nbs.report.pipeline.postprocessing.repository.InvestigationRepository; import gov.cdc.nbs.report.pipeline.postprocessing.repository.PostProcRepository; import gov.cdc.nbs.report.pipeline.postprocessing.repository.model.BackfillData; import gov.cdc.nbs.report.pipeline.postprocessing.repository.model.DatamartData; +import gov.cdc.nbs.report.pipeline.util.metrics.CustomMetrics; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import java.util.ArrayList; import java.util.Collections; diff --git a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/util/DataExceptionTest.java b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/util/DataExceptionTest.java new file mode 100644 index 000000000..c4b2e5554 --- /dev/null +++ b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/util/DataExceptionTest.java @@ -0,0 +1,51 @@ +package gov.cdc.nbs.report.pipeline.util; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.lang.reflect.Constructor; +import java.util.stream.Stream; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class DataExceptionTest { + + static Stream messageOnlyProvider() { + return Stream.of( + Arguments.of(NoDataException.class, "No data found"), + Arguments.of(DataProcessingException.class, "Processing error")); + } + + static Stream messageAndCauseProvider() { + return Stream.of( + Arguments.of( + NoDataException.class, "No data found", new RuntimeException("Underlying cause")), + Arguments.of( + DataProcessingException.class, + "Processing error", + new IllegalStateException("Bad state"))); + } + + @ParameterizedTest(name = "{0}.(\"{1}\")") + @MethodSource("messageOnlyProvider") + void testConstructorWithMessage( + Class exceptionClass, String message) throws Exception { + Constructor ctor = exceptionClass.getConstructor(String.class); + T ex = ctor.newInstance(message); + + assertEquals(message, ex.getMessage()); + assertNull(ex.getCause()); + } + + @ParameterizedTest(name = "{0}.(\"{1}\", cause={2})") + @MethodSource("messageAndCauseProvider") + void testConstructorWithMessageAndCause( + Class exceptionClass, String message, Throwable cause) throws Exception { + Constructor ctor = exceptionClass.getConstructor(String.class, Throwable.class); + T ex = ctor.newInstance(message, cause); + + assertEquals(message, ex.getMessage()); + assertEquals(cause, ex.getCause()); + } +} diff --git a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/util/TestUtilsTest.java b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/util/TestUtilsTest.java new file mode 100644 index 000000000..d480ee361 --- /dev/null +++ b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/util/TestUtilsTest.java @@ -0,0 +1,37 @@ +package gov.cdc.nbs.report.pipeline.util; + +import static org.junit.jupiter.api.Assertions.*; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import org.junit.jupiter.api.Test; + +class TestUtilsTest { + + @Test + void testConstructor() throws Exception { + Constructor constructor = TestUtils.class.getDeclaredConstructor(); + constructor.setAccessible(true); + + InvocationTargetException exception = + assertThrows(InvocationTargetException.class, constructor::newInstance); + assertInstanceOf(IllegalStateException.class, exception.getCause()); + assertEquals("Utility class", exception.getCause().getMessage()); + } + + @Test + void testReadFileData_validFile_returnsContent() { + String fileContent = TestUtils.readFileData("testData/fileUtilData.txt"); + + assertNotNull(fileContent); + assertTrue(fileContent.contains("Hello, this is test content.")); + } + + @Test + void testReadFileData_fileNotFound_throwsRuntimeException() { + RuntimeException ex = + assertThrows(RuntimeException.class, () -> TestUtils.readFileData("nonexistent-file.txt")); + + assertTrue(ex.getMessage().contains("File Read failed")); + } +} diff --git a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/util/UtilHelperTest.java b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/util/UtilHelperTest.java new file mode 100644 index 000000000..e2ab3ca3f --- /dev/null +++ b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/util/UtilHelperTest.java @@ -0,0 +1,149 @@ +package gov.cdc.nbs.report.pipeline.util; + +import static org.junit.jupiter.api.Assertions.*; + +import com.fasterxml.jackson.core.JsonProcessingException; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.NoSuchElementException; +import org.junit.jupiter.api.Test; + +class UtilHelperTest { + + private final String sampleJson = + """ + { + "payload": { + "before": { + "uid": "12344", + "name": "Test Name Before", + "age": 30 + }, + "after": { + "uid": "12345", + "name": "Test Name", + "age": 30 + }, + "op": "d" + } + } + """; + + @Test + void testConstructor() throws Exception { + Constructor constructor = UtilHelper.class.getDeclaredConstructor(); + constructor.setAccessible(true); + + InvocationTargetException exception = + assertThrows(InvocationTargetException.class, constructor::newInstance); + assertInstanceOf(IllegalStateException.class, exception.getCause()); + assertEquals("Utility class", exception.getCause().getMessage()); + } + + @Test + void testDeserializePayload_validJson() { + record Person(String uid, String name, int age) {} + String json = + """ + { + "uid": "12345", + "name": "John", + "age": 25 + } + """; + + Person person = UtilHelper.deserializePayload(json, Person.class); + assertNotNull(person); + assertEquals("12345", person.uid()); + assertEquals("John", person.name()); + assertEquals(25, person.age()); + } + + @Test + void testDeserializePayload_invalidJson() { + String invalidJson = "{ invalid json }"; + assertNull(UtilHelper.deserializePayload(invalidJson, Object.class)); + } + + @Test + void testDeserializePayload_nullJson() { + String invalidJson = null; + assertNull(UtilHelper.deserializePayload(invalidJson, Object.class)); + } + + @Test + void testExtractUid_validField() throws JsonProcessingException { + String uid = UtilHelper.extractUid(sampleJson, "uid"); + assertEquals("12345", uid); + + uid = UtilHelper.extractUid(sampleJson, "uid", "before"); + assertEquals("12344", uid); + + uid = UtilHelper.extractUid("{\"payload\": {\"uid\": \"12346\"}}", "uid"); + assertEquals("12346", uid); + } + + @Test + void testExtractUid_invalidField() { + String inValidJson = + """ + { + "payload": "" + } + """; + Exception exception = + assertThrows(NoSuchElementException.class, () -> UtilHelper.extractUid(inValidJson, "uid")); + assertTrue(exception.getMessage().contains("The uid field is missing in the message payload")); + } + + @Test + void testExtractUid_missingField() { + Exception exception = + assertThrows( + NoSuchElementException.class, + () -> UtilHelper.extractUid(sampleJson, "nonexistentField")); + + assertTrue(exception.getMessage().contains("nonexistentField")); + } + + @Test + void testExtractValue_validField() throws JsonProcessingException { + String name = UtilHelper.extractValue(sampleJson, "name"); + assertEquals("Test Name", name); + + name = UtilHelper.extractValue(sampleJson, "name", "before"); + assertEquals("Test Name Before", name); + } + + @Test + void testExtractValue_missingField() throws JsonProcessingException { + String value = UtilHelper.extractValue(sampleJson, "missingField"); + assertEquals("", value); // .asText() on missing node returns "" + } + + @Test + void testErrorMessage_withIds() { + String msg = + UtilHelper.errorMessage("Person", "1,2,3", new RuntimeException("Something went wrong")); + assertTrue(msg.contains("Person")); + assertTrue(msg.contains("1,2,3")); + assertTrue(msg.contains("Something went wrong")); + } + + @Test + void testErrorMessage_withoutIds() { + String msg = UtilHelper.errorMessage("Person", "", new RuntimeException("Boom")); + assertTrue(msg.contains("Person")); + assertTrue(msg.contains("Boom")); + assertFalse(msg.contains("with ids")); + + msg = UtilHelper.errorMessage("Person", null, new RuntimeException("Boom")); + assertFalse(msg.contains("with ids")); + } + + @Test + void testExtractCdcOperation() throws JsonProcessingException { + String value = UtilHelper.extractChangeDataCaptureOperation(sampleJson); + assertEquals("d", value); + } +} diff --git a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/util/json/CustomJsonGeneratorImplTest.java b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/util/json/CustomJsonGeneratorImplTest.java new file mode 100644 index 000000000..8638390a5 --- /dev/null +++ b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/util/json/CustomJsonGeneratorImplTest.java @@ -0,0 +1,133 @@ +package gov.cdc.nbs.report.pipeline.util.json; + +import static org.junit.jupiter.api.Assertions.*; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.time.Instant; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class CustomJsonGeneratorImplTest { + private CustomJsonGeneratorImpl jsonGenerator = null; + + @BeforeEach + void setUp() { + jsonGenerator = new CustomJsonGeneratorImpl(); + } + + @AfterEach + void tearDown() {} + + private static class TestBean { + private String attr1; + + public TestBean(String attr1) { + this.attr1 = attr1; + } + } + + private static class ComplexTestBean { + private String stringField; + private int intField; + private long longField; + private Instant instantField; + + @JsonProperty("custom_name") + private String annotatedField; + + public ComplexTestBean( + String stringField, + int intField, + long longField, + Instant instantField, + String annotatedField) { + this.stringField = stringField; + this.intField = intField; + this.longField = longField; + this.instantField = instantField; + this.annotatedField = annotatedField; + } + } + + @Test + void testGenerateStringJson() { + TestBean testBean = new TestBean("value1"); + /** + * { "schema":{ "type":"struct", "fields":[{"type":"string","optional":true,"field":"attr1"}] }, + * "payload":{"attr1":"value1"} } + */ + String actualVal = + """ + {"schema":{"type":"struct","fields":[{"type":"string","optional":true,"field":"attr1"}]},"payload":{"attr1":"value1"}} + """ + .replace("\n", ""); + String jsonVal = jsonGenerator.generateStringJson(testBean); + assertEquals(actualVal, jsonVal); + } + + @Test + void testGenerateStringJson_ComplexObject() { + ComplexTestBean testBean = + new ComplexTestBean("test", 42, 1234L, Instant.ofEpochSecond(1001), "annotated"); + String jsonVal = jsonGenerator.generateStringJson(testBean); + + assertTrue(jsonVal.contains("\"string_field\":\"test\"")); + assertTrue(jsonVal.contains("\"int_field\":42")); + assertTrue(jsonVal.contains("\"long_field\":1234")); + assertTrue(jsonVal.contains("\"instant_field\":1001")); + assertTrue(jsonVal.contains("\"custom_name\":\"annotated\"")); + assertTrue(jsonVal.contains("\"type\":\"int32\"")); + assertTrue(jsonVal.contains("\"type\":\"int64\"")); + } + + @Test + void testGenerateStringJson_WithOverrideKeys() { + ComplexTestBean testBean = + new ComplexTestBean("test", 42, 1234L, Instant.ofEpochSecond(1001), "annotated"); + String jsonVal = jsonGenerator.generateStringJson(testBean, "string_field", "custom_name"); + + assertTrue( + jsonVal.contains("\"optional\":false") && jsonVal.contains("\"field\":\"string_field\"")); + assertTrue( + jsonVal.contains("\"optional\":false") && jsonVal.contains("\"field\":\"custom_name\"")); + assertTrue( + jsonVal.contains("\"optional\":true") && jsonVal.contains("\"field\":\"int_field\"")); + } + + @Test + void testGenerateStringJson_NullModel() { + RuntimeException ex = + assertThrows(RuntimeException.class, () -> jsonGenerator.generateStringJson(null)); + + assertTrue( + ex.getMessage().contains("Cannot invoke \"Object.getClass()\" because \"model\" is null")); + } + + @Test + void testTypeMapping() { + class TypeTestBean { + private long longVal; + private int intVal; + private String stringVal; + } + + TypeTestBean testBean = new TypeTestBean(); + String jsonVal = jsonGenerator.generateStringJson(testBean); + + assertTrue(jsonVal.contains("\"type\":\"int64\"")); + assertTrue(jsonVal.contains("\"type\":\"int32\"")); + assertTrue(jsonVal.contains("\"type\":\"string\"")); + } + + @Test + void testSchemaStructure() { + TestBean testBean = new TestBean("test"); + String jsonVal = jsonGenerator.generateStringJson(testBean); + + assertTrue(jsonVal.contains("\"schema\":{")); + assertTrue(jsonVal.contains("\"type\":\"struct\"")); + assertTrue(jsonVal.contains("\"fields\":[")); + assertTrue(jsonVal.contains("\"payload\":{")); + } +} diff --git a/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/util/json/NumberToPlainStringDeserializerTest.java b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/util/json/NumberToPlainStringDeserializerTest.java new file mode 100644 index 000000000..3e42cca99 --- /dev/null +++ b/reporting-pipeline-service/src/test/java/gov/cdc/nbs/report/pipeline/util/json/NumberToPlainStringDeserializerTest.java @@ -0,0 +1,45 @@ +package gov.cdc.nbs.report.pipeline.util.json; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +class NumberToPlainStringDeserializerTest { + + private final ObjectMapper objectMapper = new ObjectMapper(); + + static class Wrapper { + @JsonDeserialize(using = NumberToPlainStringDeserializer.class) + public String value; + } + + @ParameterizedTest + @CsvSource( + value = { + "{\"value\": 1.23E+7}|12300000", + "{\"value\": 10000000}|10000000", + "{\"value\": \"1.23E+7\"}|1.23E+7" + }, + delimiter = '|') + void shouldDeserializeToPlainString(String json, String expected) throws Exception { + Wrapper wrapper = objectMapper.readValue(json, Wrapper.class); + assertThat(wrapper.value).isEqualTo(expected); + } + + @Test + void shouldHandleNullValue() throws Exception { + Wrapper wrapper = objectMapper.readValue("{\"value\": null}", Wrapper.class); + assertThat(wrapper.value).isNull(); + } + + @Test + void shouldFailOnUnexpectedType() { + assertThatThrownBy(() -> objectMapper.readValue("{\"value\": {\"nested\":1}}", Wrapper.class)) + .isInstanceOf(Exception.class); + } +} diff --git a/common-util/src/test/resources/test-data/sample.txt b/reporting-pipeline-service/src/test/resources/testData/fileUtilData.txt similarity index 100% rename from common-util/src/test/resources/test-data/sample.txt rename to reporting-pipeline-service/src/test/resources/testData/fileUtilData.txt diff --git a/settings.gradle b/settings.gradle index a2617a8fc..7961b68fa 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,7 +1,4 @@ rootProject.name = 'NEDSS-DataReporting' -// Common utility library -include 'common-util' - // Data Reporting service include 'reporting-pipeline-service'