diff --git a/.gitea/CODEOWNERS b/.gitea/CODEOWNERS new file mode 100644 index 0000000..37668af --- /dev/null +++ b/.gitea/CODEOWNERS @@ -0,0 +1 @@ +* @jorge.bornhausen \ No newline at end of file diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml new file mode 100644 index 0000000..fe95ecf --- /dev/null +++ b/.gitea/workflows/build.yml @@ -0,0 +1,42 @@ +name: Build, test and publish the Quarkus libraries +on: [ push, workflow_dispatch ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout the code + uses: https://github.com/actions/checkout@v4 + + - name: Set up JDK 21 + uses: https://github.com/actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '21' + + - name: Configure Maven CI/CD settings + uses: https://github.com/s4u/maven-settings-action@v3.1.0 + with: + servers: | + [{ + "id": "kvant", + "configuration": { + "httpHeaders": { + "property": { + "name": "Authorization", + "value": "token ${{ secrets.PHOENIX_PACKAGE_WRITER_TOKEN }}" + } + } + } + }] + + - name: Make maven wrapper executable + run: chmod +x mvnw + + - name: Build and run tests + run: ./mvnw verify + + - name: Upload libs to Gitea Maven Registry + if: gitea.ref == 'refs/heads/main' + run: ./mvnw deploy -Dmaven.test.skip=true -Dmaven.javadoc.skip=true \ No newline at end of file diff --git a/.github/project.yaml b/.github/project.yaml deleted file mode 100644 index 39fcc44..0000000 --- a/.github/project.yaml +++ /dev/null @@ -1,5 +0,0 @@ -name: Quarkus Commons -release: - current-version: "1.1.2" - next-version: "1.1.3-SNAPSHOT" - diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml deleted file mode 100644 index 25b11b2..0000000 --- a/.github/workflows/build.yaml +++ /dev/null @@ -1,99 +0,0 @@ -name: Build - -on: - push: - branches: - - "main" - tags: - - '[0-9]+.[0-9]+.[0-9]+' - paths-ignore: - - '.gitattributes' - - '.gitignore' - - '.github/renovate.json5' - - '.github/project.yaml' - - 'docs/**' - - 'README.md' - pull_request: - workflow_dispatch: - -env: - COMMON_MAVEN_OPTS: "-e -B --fae" - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout the code - uses: https://github.com/actions/checkout@v5 - with: - fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - - name: Set up JDK 21 - uses: https://github.com/actions/setup-java@v5 - with: - distribution: 'temurin' - java-version: '21' - - - name: Generate cache keys - id: cache-key - run: | - CURRENT_BRANCH="${{ github.head_ref || github.ref_name }}" - CURRENT_MONTH=$(/bin/date -u "+%Y-%m") - CURRENT_DAY=$(/bin/date -u "+%d") - ROOT_CACHE_KEY="m2-cache-quarkus-commons" - echo "m2-monthly-cache-key=${ROOT_CACHE_KEY}-${CURRENT_MONTH}" >> $GITHUB_OUTPUT - echo "m2-monthly-branch-cache-key=${ROOT_CACHE_KEY}-${CURRENT_MONTH}-${CURRENT_BRANCH}" >> $GITHUB_OUTPUT - echo "m2-cache-key=${ROOT_CACHE_KEY}-${CURRENT_MONTH}-${CURRENT_BRANCH}-${CURRENT_DAY}" >> $GITHUB_OUTPUT - - - name: Cache Maven Repository - id: cache-maven - uses: https://github.com/actions/cache@v4 - with: - path: ~/.m2/repository - # The cache is per branch but in case we don't find a branch for a given branch, we will get a cache from another branch. - key: ${{ steps.cache-key.outputs.m2-cache-key }} - restore-keys: | - ${{ steps.cache-key.outputs.m2-monthly-branch-cache-key }} - ${{ steps.cache-key.outputs.m2-monthly-cache-key }} - - - name: Configure Maven CI/CD settings - uses: https://github.com/s4u/maven-settings-action@v4.0.0 - with: - servers: | - [{ - "id": "phoenix-oss", - "username": "${{ vars.ORG_PACKAGE_WRITER_USERNAME }}", - "password": "${{ secrets.ORG_PACKAGE_WRITER_TOKEN }}" - }] - - - name: Make maven wrapper executable - run: chmod +x mvnw - - - name: Validate tag - if: startsWith(github.ref, 'refs/tags/') - run: | - TAG_NAME="${GITHUB_REF#refs/tags/}" - PROJECT_VERSION=$(./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout) - - if [[ "$PROJECT_VERSION" != "$TAG_NAME" ]]; then - echo "::error::pom.xml version '$PROJECT_VERSION' does not match tag '$TAG_NAME'" - exit 1 - fi - - - name: Download dependencies - run: ./mvnw $COMMON_MAVEN_OPTS quarkus:go-offline - - - name: Build and run tests - run: ./mvnw $COMMON_MAVEN_OPTS verify - - - name: Analyze with Sonar - if: vars.SONAR_ENABLED == 'true' - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - SONAR_HOST_URL: ${{ vars.SONAR_HOST_URL }} - run: ./mvnw $COMMON_MAVEN_OPTS org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=quarkus-commons -Dsonar.projectName='quarkus-commons' -Dsonar.coverage.jacoco.xmlReportPaths=../**/target/jacoco-report/jacoco.xml - - - name: Publish jars - if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/') - run: ./mvnw $COMMON_MAVEN_OPTS deploy -Dmaven.test.skip=true -Dmaven.javadoc.skip=true \ No newline at end of file diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml deleted file mode 100644 index 4ac7764..0000000 --- a/.github/workflows/release.yaml +++ /dev/null @@ -1,97 +0,0 @@ -name: Release the current version - -on: - push: - branches: - - "main" - paths: - - '.github/project.yaml' - -env: - COMMON_MAVEN_OPTS: "-e -B --fae" - -jobs: - release: - name: Execute the release - runs-on: ubuntu-latest - - steps: - - name: Checkout the code - uses: https://github.com/actions/checkout@v5 - - - name: Retrieve project metadata - uses: https://github.com/radcortez/project-metadata-action@main - id: metadata - with: - metadata-file-path: '.github/project.yaml' - local-file: true - - - name: Validate current version - if: contains(steps.metadata.outputs.current-version, 'SNAPSHOT') - run: | - echo '::error::Cannot release a SNAPSHOT version.' - exit 1 - - - name: Validate next version - if: contains(steps.metadata.outputs.next-version, 'SNAPSHOT') == 'false' - run: | - echo '::error::Next development version should be a SNAPSHOT version.' - exit 1 - - - name: Set environment variables - run: | - echo "CURRENT_VERSION=${{steps.metadata.outputs.current-version}}" >> $GITHUB_ENV - echo "NEXT_VERSION=${{steps.metadata.outputs.next-version}}" >> $GITHUB_ENV - - - name: Configure SSH and Git - env: - SSH_DIR: /root/.ssh - MAVEN_RELEASE_SSH_KEY: ${{ secrets.MAVEN_RELEASE_SSH_KEY }} - run: | - mkdir -p ${SSH_DIR}/ - touch ${SSH_DIR}/known_hosts - ssh-keyscan -t rsa -p 2222 git-ssh.kvant.cloud >> ${SSH_DIR}/known_hosts - echo "${MAVEN_RELEASE_SSH_KEY}" | base64 -d >> ${SSH_DIR}/id_rsa - chmod 600 ${SSH_DIR}/id_rsa - git config --global user.name 'maven_release_technical_account' - git config --global user.email 'maven-release-bot@phoenix-technologies.ch' - git config --global commit.gpgsign true - git config --global gpg.format ssh - git config --global user.signingkey ${SSH_DIR}/id_rsa - - - name: Set up JDK 21 - uses: https://github.com/actions/setup-java@v5 - with: - distribution: 'temurin' - java-version: '21' - - - name: Generate cache keys - id: cache-key - run: | - CURRENT_BRANCH="${{ github.ref_name }}" - CURRENT_MONTH=$(/bin/date -u "+%Y-%m") - CURRENT_DAY=$(/bin/date -u "+%d") - ROOT_CACHE_KEY="m2-cache-quarkus-commons" - echo "m2-monthly-cache-key=${ROOT_CACHE_KEY}-${CURRENT_MONTH}" >> $GITHUB_OUTPUT - echo "m2-monthly-branch-cache-key=${ROOT_CACHE_KEY}-${CURRENT_MONTH}-${CURRENT_BRANCH}" >> $GITHUB_OUTPUT - echo "m2-cache-key=${ROOT_CACHE_KEY}-${CURRENT_MONTH}-${CURRENT_BRANCH}-${CURRENT_DAY}" >> $GITHUB_OUTPUT - - - name: Cache Maven Repository - id: cache-maven - uses: https://github.com/actions/cache@v4 - with: - path: ~/.m2/repository - # The cache is per branch but in case we don't find a branch for a given branch, we will get a cache from another branch. - key: ${{ steps.cache-key.outputs.m2-cache-key }} - restore-keys: | - ${{ steps.cache-key.outputs.m2-monthly-branch-cache-key }} - ${{ steps.cache-key.outputs.m2-monthly-cache-key }} - - - name: Make maven wrapper executable - run: chmod +x mvnw - - - name: Download dependencies - run: ./mvnw $COMMON_MAVEN_OPTS quarkus:go-offline - - - name: Prepare release - run: ./mvnw $COMMON_MAVEN_OPTS release:prepare -DreleaseVersion=${CURRENT_VERSION} -DdevelopmentVersion=${NEXT_VERSION} diff --git a/.github/workflows/validate-versions.yaml b/.github/workflows/validate-versions.yaml deleted file mode 100644 index 5050f4a..0000000 --- a/.github/workflows/validate-versions.yaml +++ /dev/null @@ -1,33 +0,0 @@ -name: Validate release versions - -on: - pull_request: - paths: - - '.github/project.yaml' - -jobs: - release: - runs-on: ubuntu-latest - - steps: - - name: Checkout the code - uses: https://github.com/actions/checkout@v5 - - - name: Retrieve project metadata - uses: https://github.com/radcortez/project-metadata-action@main - id: metadata - with: - metadata-file-path: '.github/project.yaml' - local-file: true - - - name: Validate current version - if: contains(steps.metadata.outputs.current-version, 'SNAPSHOT') - run: | - echo '::error::Cannot release a SNAPSHOT version.' - exit 1 - - - name: Validate next version - if: contains(steps.metadata.outputs.next-version, 'SNAPSHOT') == false - run: | - echo '::error::Next development version should be a SNAPSHOT version.' - exit 1 \ No newline at end of file diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index 44f3cf2..d58dfb7 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 distributionType=only-script -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.11/apache-maven-3.9.11-bin.zip +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip diff --git a/README.md b/README.md index 292fab1..ed89049 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,14 @@ Quarkus Commons =============== -[![Java version](https://img.shields.io/badge/Java%20version-21-brightgreen)](https://openjdk.org/projects/jdk/21/) -[![Coverage](https://sonarqube.pub.basel.kvant.cloud/api/project_badges/measure?project=quarkus-commons&metric=coverage&token=sqb_adbad7fd700ab79c5ba6243e02af58b35114bbbf)](https://sonarqube.pub.basel.kvant.cloud/dashboard?id=quarkus-commons) -[![Duplicated Lines (%)](https://sonarqube.pub.basel.kvant.cloud/api/project_badges/measure?project=quarkus-commons&metric=duplicated_lines_density&token=sqb_adbad7fd700ab79c5ba6243e02af58b35114bbbf)](https://sonarqube.pub.basel.kvant.cloud/dashboard?id=quarkus-commons) -[![Quality Gate Status](https://sonarqube.pub.basel.kvant.cloud/api/project_badges/measure?project=quarkus-commons&metric=alert_status&token=sqb_adbad7fd700ab79c5ba6243e02af58b35114bbbf)](https://sonarqube.pub.basel.kvant.cloud/dashboard?id=quarkus-commons) -[![Security Rating](https://sonarqube.pub.basel.kvant.cloud/api/project_badges/measure?project=quarkus-commons&metric=security_rating&token=sqb_adbad7fd700ab79c5ba6243e02af58b35114bbbf)](https://sonarqube.pub.basel.kvant.cloud/dashboard?id=quarkus-commons) -[![Reliability Rating](https://sonarqube.pub.basel.kvant.cloud/api/project_badges/measure?project=quarkus-commons&metric=reliability_rating&token=sqb_adbad7fd700ab79c5ba6243e02af58b35114bbbf)](https://sonarqube.pub.basel.kvant.cloud/dashboard?id=quarkus-commons) -[![Maintainability Rating](https://sonarqube.pub.basel.kvant.cloud/api/project_badges/measure?project=quarkus-commons&metric=sqale_rating&token=sqb_adbad7fd700ab79c5ba6243e02af58b35114bbbf)](https://sonarqube.pub.basel.kvant.cloud/dashboard?id=quarkus-commons) +[![Java version](https://img.shields.io/badge/Java%20version-21-brightgreen?style=for-the-badge)](https://openjdk.org/projects/jdk/21/) +[![Quarkus version](https://img.shields.io/badge/Quarkus%20version-3.16.2-brightgreen?style=for-the-badge)](https://quarkus.io/guides/) +[![Maven Wrapper](https://img.shields.io/badge/Maven%20version-3.9.9-brightgreen?style=for-the-badge)](https://maven.apache.org/) + + +* [Quarkus Commons](#quarkus-commons) +* [Introduction](#introduction) + # Introduction @@ -16,13 +17,9 @@ that can be used by Quarkus applications. The modules are: -* `quarkus-audit-tools` -* `quarkus-client-logger` * `quarkus-clock-service` * `quarkus-json-service` * `quarkus-message-digest-service` * `quarkus-random-number-generator` -* `quarkus-table-generator` -* `quarkus-tracing-service` * `quarkus-uuid-generator` diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS deleted file mode 100644 index 7e98295..0000000 --- a/docs/CODEOWNERS +++ /dev/null @@ -1 +0,0 @@ -* @jorge.bornhausen @pawel.derehajlo @roque.caballero @michal.tumilowicz \ No newline at end of file diff --git a/hooks/pre-commit b/hooks/pre-commit new file mode 100644 index 0000000..4d2b5a1 --- /dev/null +++ b/hooks/pre-commit @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +./mvnw spotless:apply diff --git a/mvnw b/mvnw index e9cf8d3..19529dd 100644 --- a/mvnw +++ b/mvnw @@ -19,7 +19,7 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Apache Maven Wrapper startup batch script, version 3.3.3 +# Apache Maven Wrapper startup batch script, version 3.3.2 # # Optional ENV vars # ----------------- @@ -105,17 +105,14 @@ trim() { printf "%s" "${1}" | tr -d '[:space:]' } -scriptDir="$(dirname "$0")" -scriptName="$(basename "$0")" - # parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties while IFS="=" read -r key value; do case "${key-}" in distributionUrl) distributionUrl=$(trim "${value-}") ;; distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; esac -done <"$scriptDir/.mvn/wrapper/maven-wrapper.properties" -[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" case "${distributionUrl##*/}" in maven-mvnd-*bin.*) @@ -133,7 +130,7 @@ maven-mvnd-*bin.*) distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" ;; maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; -*) MVN_CMD="mvn${scriptName#mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; esac # apply MVNW_REPOURL and calculate MAVEN_HOME @@ -230,7 +227,7 @@ if [ -n "${distributionSha256Sum-}" ]; then echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 exit 1 elif command -v sha256sum >/dev/null; then - if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c - >/dev/null 2>&1; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then distributionSha256Result=true fi elif command -v shasum >/dev/null; then @@ -255,41 +252,8 @@ if command -v unzip >/dev/null; then else tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" fi - -# Find the actual extracted directory name (handles snapshots where filename != directory name) -actualDistributionDir="" - -# First try the expected directory name (for regular distributions) -if [ -d "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" ]; then - if [ -f "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/bin/$MVN_CMD" ]; then - actualDistributionDir="$distributionUrlNameMain" - fi -fi - -# If not found, search for any directory with the Maven executable (for snapshots) -if [ -z "$actualDistributionDir" ]; then - # enable globbing to iterate over items - set +f - for dir in "$TMP_DOWNLOAD_DIR"/*; do - if [ -d "$dir" ]; then - if [ -f "$dir/bin/$MVN_CMD" ]; then - actualDistributionDir="$(basename "$dir")" - break - fi - fi - done - set -f -fi - -if [ -z "$actualDistributionDir" ]; then - verbose "Contents of $TMP_DOWNLOAD_DIR:" - verbose "$(ls -la "$TMP_DOWNLOAD_DIR")" - die "Could not find Maven distribution directory in extracted archive" -fi - -verbose "Found extracted Maven distribution directory: $actualDistributionDir" -printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$actualDistributionDir/mvnw.url" -mv -- "$TMP_DOWNLOAD_DIR/$actualDistributionDir" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" clean || : exec_maven "$@" diff --git a/mvnw.cmd b/mvnw.cmd index 3fd2be8..249bdf3 100644 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -1,189 +1,149 @@ -<# : batch portion -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM http://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Apache Maven Wrapper startup batch script, version 3.3.3 -@REM -@REM Optional ENV vars -@REM MVNW_REPOURL - repo url base for downloading maven distribution -@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven -@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output -@REM ---------------------------------------------------------------------------- - -@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) -@SET __MVNW_CMD__= -@SET __MVNW_ERROR__= -@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% -@SET PSModulePath= -@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( - IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) -) -@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% -@SET __MVNW_PSMODULEP_SAVE= -@SET __MVNW_ARG0_NAME__= -@SET MVNW_USERNAME= -@SET MVNW_PASSWORD= -@IF NOT "%__MVNW_CMD__%"=="" ("%__MVNW_CMD__%" %*) -@echo Cannot start maven from wrapper >&2 && exit /b 1 -@GOTO :EOF -: end batch / begin powershell #> - -$ErrorActionPreference = "Stop" -if ($env:MVNW_VERBOSE -eq "true") { - $VerbosePreference = "Continue" -} - -# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties -$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl -if (!$distributionUrl) { - Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" -} - -switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { - "maven-mvnd-*" { - $USE_MVND = $true - $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" - $MVN_CMD = "mvnd.cmd" - break - } - default { - $USE_MVND = $false - $MVN_CMD = $script -replace '^mvnw','mvn' - break - } -} - -# apply MVNW_REPOURL and calculate MAVEN_HOME -# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ -if ($env:MVNW_REPOURL) { - $MVNW_REPO_PATTERN = if ($USE_MVND -eq $False) { "/org/apache/maven/" } else { "/maven/mvnd/" } - $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace "^.*$MVNW_REPO_PATTERN",'')" -} -$distributionUrlName = $distributionUrl -replace '^.*/','' -$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' - -$MAVEN_M2_PATH = "$HOME/.m2" -if ($env:MAVEN_USER_HOME) { - $MAVEN_M2_PATH = "$env:MAVEN_USER_HOME" -} - -if (-not (Test-Path -Path $MAVEN_M2_PATH)) { - New-Item -Path $MAVEN_M2_PATH -ItemType Directory | Out-Null -} - -$MAVEN_WRAPPER_DISTS = $null -if ((Get-Item $MAVEN_M2_PATH).Target[0] -eq $null) { - $MAVEN_WRAPPER_DISTS = "$MAVEN_M2_PATH/wrapper/dists" -} else { - $MAVEN_WRAPPER_DISTS = (Get-Item $MAVEN_M2_PATH).Target[0] + "/wrapper/dists" -} - -$MAVEN_HOME_PARENT = "$MAVEN_WRAPPER_DISTS/$distributionUrlNameMain" -$MAVEN_HOME_NAME = ([System.Security.Cryptography.SHA256]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' -$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" - -if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { - Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" - Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" - exit $? -} - -if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { - Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" -} - -# prepare tmp dir -$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile -$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" -$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null -trap { - if ($TMP_DOWNLOAD_DIR.Exists) { - try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } - catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } - } -} - -New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null - -# Download and Install Apache Maven -Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." -Write-Verbose "Downloading from: $distributionUrl" -Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" - -$webclient = New-Object System.Net.WebClient -if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { - $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) -} -[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null - -# If specified, validate the SHA-256 sum of the Maven distribution zip file -$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum -if ($distributionSha256Sum) { - if ($USE_MVND) { - Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." - } - Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash - if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { - Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." - } -} - -# unzip and move -Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null - -# Find the actual extracted directory name (handles snapshots where filename != directory name) -$actualDistributionDir = "" - -# First try the expected directory name (for regular distributions) -$expectedPath = Join-Path "$TMP_DOWNLOAD_DIR" "$distributionUrlNameMain" -$expectedMvnPath = Join-Path "$expectedPath" "bin/$MVN_CMD" -if ((Test-Path -Path $expectedPath -PathType Container) -and (Test-Path -Path $expectedMvnPath -PathType Leaf)) { - $actualDistributionDir = $distributionUrlNameMain -} - -# If not found, search for any directory with the Maven executable (for snapshots) -if (!$actualDistributionDir) { - Get-ChildItem -Path "$TMP_DOWNLOAD_DIR" -Directory | ForEach-Object { - $testPath = Join-Path $_.FullName "bin/$MVN_CMD" - if (Test-Path -Path $testPath -PathType Leaf) { - $actualDistributionDir = $_.Name - } - } -} - -if (!$actualDistributionDir) { - Write-Error "Could not find Maven distribution directory in extracted archive" -} - -Write-Verbose "Found extracted Maven distribution directory: $actualDistributionDir" -Rename-Item -Path "$TMP_DOWNLOAD_DIR/$actualDistributionDir" -NewName $MAVEN_HOME_NAME | Out-Null -try { - Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null -} catch { - if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { - Write-Error "fail to move MAVEN_HOME" - } -} finally { - try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } - catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } -} - -Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/pom.xml b/pom.xml index 55d6b3a..404a812 100644 --- a/pom.xml +++ b/pom.xml @@ -1,60 +1,52 @@ - + 4.0.0 - ch.phoenix.oss + ch.phoenixtechnologies.quarkus quarkus-commons - 1.1.3-SNAPSHOT + 1.0.1-SNAPSHOT pom - quarkus-audit-tools - quarkus-client-logger quarkus-clock-service quarkus-json-service quarkus-message-digest-service quarkus-random-number-generator - quarkus-table-generator - quarkus-tracing-service quarkus-uuid-generator - - quarkus-bom - io.quarkus.platform - 3.28.4 - - - 3.14.1 - 3.5.4 - 3.0.0 - 2.72.0 - 0.8.14 - 3.5.0 - 3.1.1 - 3.3.1 - - - 21 + 21 UTF-8 UTF-8 - true + + 3.13.0 + 3.5.2 + 0.8.12 + 2.43.0 + 2.50.0 + 3.5.0 + + quarkus-bom + io.quarkus.platform + 3.16.2 - 5.1.1 + 5.1.0 - 3.27.6 + 3.26.3 - phoenix-oss - https://git.kvant.cloud/api/packages/phoenix-oss/maven + kvant + https://git.kvant.cloud/api/packages/phoenix/maven - phoenix-oss - https://git.kvant.cloud/api/packages/phoenix-oss/maven + kvant + https://git.kvant.cloud/api/packages/phoenix/maven @@ -70,22 +62,11 @@ - - scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git - scm:git:ssh://git@git-ssh.kvant.cloud:2222/phoenix-oss/quarkus-commons.git - https://git.kvant.cloud/phoenix-oss/quarkus-commons.git - HEAD - - io.quarkus quarkus-arc - - io.quarkus - quarkus-cyclonedx - org.assertj assertj-core @@ -139,6 +120,7 @@ -parameters + ${java.version} @@ -167,7 +149,7 @@ - + ${palantir-java-format.version} @@ -177,40 +159,18 @@ - io.smallrye - jandex-maven-plugin - ${jandex-plugin.version} - - - make-index - - jandex - - - - - - org.apache.maven.plugins - maven-release-plugin - ${release-plugin.version} + com.rudikershaw.gitbuildhook + git-build-hook-maven-plugin + ${git-build-hook-plugin.version} - @{project.version} - mvnw - chore: release @{releaseLabel} - chore: prepare for next development iteration - true + + hooks/pre-commit + - - - org.apache.maven.plugins - maven-source-plugin - ${source-plugin.version} - attach-sources - verify - jar-no-fork + install diff --git a/quarkus-audit-tools/pom.xml b/quarkus-audit-tools/pom.xml deleted file mode 100644 index 7002853..0000000 --- a/quarkus-audit-tools/pom.xml +++ /dev/null @@ -1,88 +0,0 @@ - - - 4.0.0 - - - ch.phoenix.oss - quarkus-commons - 1.1.3-SNAPSHOT - - - quarkus-audit-tools - jar - - - - ch.phoenix.oss - quarkus-tracing-service - ${project.version} - - - io.quarkus - quarkus-hibernate-envers - - - io.quarkus - quarkus-hibernate-orm-panache - - - io.quarkus - quarkus-jdbc-postgresql - - - io.quarkus - quarkus-flyway - test - - - io.quarkus - quarkus-flyway-postgresql - test - - - io.quarkus - quarkus-elytron-security-properties-file - test - - - io.quarkus - quarkus-config-yaml - test - - - - - - - org.jacoco - jacoco-maven-plugin - ${jacoco-plugin.version} - - - jacoco-check - - check - - test - - ${project.build.directory}/jacoco-quarkus.exec - - - BUNDLE - - - INSTRUCTION - COVEREDRATIO - 1 - - - - - - - - - - - - diff --git a/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditRevisionListener.java b/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditRevisionListener.java deleted file mode 100644 index 29884f8..0000000 --- a/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditRevisionListener.java +++ /dev/null @@ -1,20 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.audit; - -import jakarta.enterprise.inject.spi.CDI; -import org.hibernate.envers.RevisionListener; - -public class AuditRevisionListener implements RevisionListener { - - @Override - public void newRevision(Object revisionEntity) { - var provider = CDI.current().select(RevisionContextProvider.class).get(); - - var rev = (Revision) revisionEntity; - rev.actor = provider.getActor(); - rev.traceId = provider.getTraceId(); - rev.spanId = provider.getSpanId(); - rev.requestId = provider.getRequestId(); - rev.clientIp = provider.getClientIp(); - rev.hostName = provider.getHostName(); - } -} diff --git a/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntity.java b/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntity.java deleted file mode 100644 index 4540cbf..0000000 --- a/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntity.java +++ /dev/null @@ -1,30 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.audit; - -import io.quarkus.hibernate.orm.panache.PanacheEntity; -import jakarta.persistence.Column; -import jakarta.persistence.MappedSuperclass; -import java.time.Instant; -import org.hibernate.envers.NotAudited; - -/** - * The goal of this class is to have on the entity itself the exact same - * timestamps as the ones from revisions generated by envers. Because of that, - * we can't use @CreationTimestamp and @UpdateTimestamp, as those timestamp values - * are managed by different Hibernate classes, so the generated values will drift. - *

- * Manually setting these values to match envers revisions would be error-prone, - * verbose and tedious. So, the recommendation is to implement triggers on the - * audit tables which will update the main entity whenever a revision is created. - * An example of how to do that can be found in this module's integration tests. - */ -@MappedSuperclass -public abstract class AuditedPanacheEntity extends PanacheEntity { - - @NotAudited - @Column(updatable = false) - public Instant createdAt; - - @NotAudited - @Column(updatable = false) - public Instant lastUpdatedAt; -} diff --git a/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityBase.java b/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityBase.java deleted file mode 100644 index a6114b3..0000000 --- a/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityBase.java +++ /dev/null @@ -1,30 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.audit; - -import io.quarkus.hibernate.orm.panache.PanacheEntityBase; -import jakarta.persistence.Column; -import jakarta.persistence.MappedSuperclass; -import java.time.Instant; -import org.hibernate.envers.NotAudited; - -/** - * The goal of this class is to have on the entity itself the exact same - * timestamps as the ones from revisions generated by envers. Because of that, - * we can't use @CreationTimestamp and @UpdateTimestamp, as those timestamp values - * are managed by different Hibernate classes, so the generated values will drift. - *

- * Manually setting these values to match envers revisions would be error-prone, - * verbose and tedious. So, the recommendation is to implement triggers on the - * audit tables which will update the main entity whenever a revision is created. - * An example of how to do that can be found in this module's integration tests. - */ -@MappedSuperclass -public abstract class AuditedPanacheEntityBase extends PanacheEntityBase { - - @NotAudited - @Column(updatable = false) - public Instant createdAt; - - @NotAudited - @Column(updatable = false) - public Instant lastUpdatedAt; -} diff --git a/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/DefaultRevisionContextProvider.java b/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/DefaultRevisionContextProvider.java deleted file mode 100644 index 18ebba6..0000000 --- a/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/DefaultRevisionContextProvider.java +++ /dev/null @@ -1,67 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.audit; - -import ch.phoenix.oss.quarkus.commons.tracing.TracingService; -import io.opentelemetry.instrumentation.annotations.WithSpan; -import io.quarkus.arc.DefaultBean; -import io.quarkus.arc.Unremovable; -import io.quarkus.logging.Log; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.inject.Inject; -import java.net.InetAddress; -import java.net.UnknownHostException; - -@Unremovable -@DefaultBean -@ApplicationScoped -class DefaultRevisionContextProvider implements RevisionContextProvider { - - private static final String UNKNOWN = "unknown"; - - private final TracingService tracingService; - - @Inject - DefaultRevisionContextProvider(TracingService tracingService) { - this.tracingService = tracingService; - } - - @Override - @WithSpan - public String getActor() { - return tracingService.getActor(); - } - - @Override - @WithSpan - public String getTraceId() { - return tracingService.getTraceId(); - } - - @Override - @WithSpan - public String getSpanId() { - return tracingService.getSpanId(); - } - - @Override - @WithSpan - public String getRequestId() { - return tracingService.getRequestId(); - } - - @Override - @WithSpan - public String getClientIp() { - return tracingService.getClientIp(); - } - - @Override - @WithSpan - public String getHostName() { - try { - return InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException e) { - Log.error("Unable to determine host name", e); - return UNKNOWN; - } - } -} diff --git a/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/Revision.java b/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/Revision.java deleted file mode 100644 index fa3085a..0000000 --- a/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/Revision.java +++ /dev/null @@ -1,58 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.audit; - -import io.quarkus.hibernate.orm.panache.PanacheEntityBase; -import jakarta.persistence.*; -import java.time.Instant; -import java.util.Objects; -import org.hibernate.envers.RevisionEntity; -import org.hibernate.envers.RevisionNumber; -import org.hibernate.envers.RevisionTimestamp; - -@Entity -@Table(name = "revinfo") -@RevisionEntity(AuditRevisionListener.class) -public class Revision extends PanacheEntityBase { - - @Id - @GeneratedValue - @RevisionNumber - public long rev; - - @RevisionTimestamp - @Column(nullable = false, updatable = false) - public Instant timestamp; - - @Column(updatable = false) - public String actor; - - @Column(updatable = false) - public String traceId; - - @Column(updatable = false) - public String spanId; - - @Column(updatable = false) - public String requestId; - - @Column(updatable = false) - public String clientIp; - - @Column(updatable = false) - public String hostName; - - @Override - public boolean equals(Object o) { - if (!(o instanceof Revision that)) return false; - return rev == that.rev; - } - - @Override - public int hashCode() { - return Objects.hashCode(rev); - } - - @Override - public String toString() { - return "Revision{rev=" + rev + '}'; - } -} diff --git a/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/RevisionContextProvider.java b/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/RevisionContextProvider.java deleted file mode 100644 index 477c44b..0000000 --- a/quarkus-audit-tools/src/main/java/ch/phoenix/oss/quarkus/commons/audit/RevisionContextProvider.java +++ /dev/null @@ -1,16 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.audit; - -public interface RevisionContextProvider { - - String getActor(); - - String getTraceId(); - - String getSpanId(); - - String getRequestId(); - - String getClientIp(); - - String getHostName(); -} diff --git a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityBaseTest.java b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityBaseTest.java deleted file mode 100644 index f4ba0de..0000000 --- a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityBaseTest.java +++ /dev/null @@ -1,136 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.audit; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.mockito.Mockito.when; - -import ch.phoenix.oss.quarkus.commons.tracing.TracingService; -import io.quarkus.narayana.jta.QuarkusTransaction; -import io.quarkus.test.junit.QuarkusTest; -import io.quarkus.test.junit.mockito.InjectSpy; -import jakarta.inject.Inject; -import jakarta.persistence.EntityManager; -import java.time.Instant; -import org.hibernate.envers.AuditReaderFactory; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -@QuarkusTest -class AuditedPanacheEntityBaseTest { - - @Inject - EntityManager entityManager; - - @InjectSpy - TracingService tracingService; - - @SuppressWarnings("Convert2MethodRef") - @BeforeEach - void setup() { - QuarkusTransaction.requiringNew().run(() -> TestEntity2.deleteAll()); - } - - @Test - void persistAndUpdate() { - when(tracingService.getRequestId()).thenReturn("00000000-0000-0000-0000-000000000000"); - when(tracingService.getSpanId()).thenReturn("0000000000000000"); - when(tracingService.getTraceId()).thenReturn("00000000000000000000000000000000"); - when(tracingService.getActor()).thenReturn("unknown"); - when(tracingService.getClientIp()).thenReturn("unknown"); - - var now = Instant.now(); - - QuarkusTransaction.requiringNew().run(() -> { - var entity = new TestEntity2("something"); - entity.persist(); - }); - - QuarkusTransaction.requiringNew().run(() -> { - var entity = TestEntity2.findBySomething("something"); - assertAll( - () -> assertThat(entity.createdAt) - .as("createdAt should be after or equal to expected value") - .isAfterOrEqualTo(now), - () -> assertThat(entity.lastUpdatedAt) - .as("lastUpdatedAt should be equal to createdAt") - .isEqualTo(entity.createdAt)); - - var auditReader = AuditReaderFactory.get(entityManager); - - var revisions = auditReader.getRevisions(TestEntity2.class, entity.id); - assertThat(revisions).hasSize(1); - - var revInfo = entityManager.find(Revision.class, revisions.getFirst()); - assertThat(revInfo).isNotNull(); - - assertAll( - () -> assertThat(revInfo.timestamp) - .as("revision timestamp should be equal to entity's createdAt timestamp") - .isEqualTo(entity.createdAt), - () -> assertThat(revInfo.actor) - .as("actor should match expected value") - .isEqualTo("unknown"), - () -> assertThat(revInfo.traceId) - .as("traceId should match expected value") - .isEqualTo("00000000000000000000000000000000"), - () -> assertThat(revInfo.spanId) - .as("spanId should match expected value") - .isEqualTo("0000000000000000"), - () -> assertThat(revInfo.requestId) - .as("requestId should match expected value") - .isEqualTo("00000000-0000-0000-0000-000000000000"), - () -> assertThat(revInfo.clientIp) - .as("clientIp should match expected value") - .isEqualTo("unknown"), - () -> assertThat(revInfo.hostName) - .as("hostName should not be blank") - .isNotBlank()); - }); - - QuarkusTransaction.requiringNew().run(() -> { - var entity = TestEntity2.findBySomething("something"); - entity.something = "else"; - }); - - QuarkusTransaction.requiringNew().run(() -> { - var entity = TestEntity2.findBySomething("else"); - assertAll(() -> assertThat(entity.createdAt) - .as("createdAt should be before lastUpdatedAt") - .isBefore(entity.lastUpdatedAt)); - - var auditReader = AuditReaderFactory.get(entityManager); - - var revisions = auditReader.getRevisions(TestEntity2.class, entity.id); - assertThat(revisions).hasSize(2); - - Revision revInfo = Revision.findById(revisions.getLast()); - assertThat(revInfo).isNotNull(); - - assertAll( - () -> assertThat(revInfo.timestamp) - .as("revision timestamp should not be equal to entity's createdAt") - .isNotEqualTo(entity.createdAt), - () -> assertThat(revInfo.timestamp) - .as("revision timestamp should be equal to entity's lastUpdatedAt") - .isEqualTo(entity.lastUpdatedAt), - () -> assertThat(revInfo.actor) - .as("actor should match expected value") - .isEqualTo("unknown"), - () -> assertThat(revInfo.traceId) - .as("traceId should match expected value") - .isEqualTo("00000000000000000000000000000000"), - () -> assertThat(revInfo.spanId) - .as("spanId should match expected value") - .isEqualTo("0000000000000000"), - () -> assertThat(revInfo.requestId) - .as("requestId should match expected value") - .isEqualTo("00000000-0000-0000-0000-000000000000"), - () -> assertThat(revInfo.clientIp) - .as("clientIp should match expected value") - .isEqualTo("unknown"), - () -> assertThat(revInfo.hostName) - .as("hostName should not be blank") - .isNotBlank()); - }); - } -} diff --git a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityTest.java b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityTest.java deleted file mode 100644 index 0f182ee..0000000 --- a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/AuditedPanacheEntityTest.java +++ /dev/null @@ -1,136 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.audit; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.mockito.Mockito.when; - -import ch.phoenix.oss.quarkus.commons.tracing.TracingService; -import io.quarkus.narayana.jta.QuarkusTransaction; -import io.quarkus.test.junit.QuarkusTest; -import io.quarkus.test.junit.mockito.InjectSpy; -import jakarta.inject.Inject; -import jakarta.persistence.EntityManager; -import java.time.Instant; -import org.hibernate.envers.AuditReaderFactory; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -@QuarkusTest -class AuditedPanacheEntityTest { - - @Inject - EntityManager entityManager; - - @InjectSpy - TracingService tracingService; - - @SuppressWarnings("Convert2MethodRef") - @BeforeEach - void setup() { - QuarkusTransaction.requiringNew().run(() -> TestEntity.deleteAll()); - } - - @Test - void persistAndUpdate() { - when(tracingService.getRequestId()).thenReturn("00000000-0000-0000-0000-000000000000"); - when(tracingService.getSpanId()).thenReturn("0000000000000000"); - when(tracingService.getTraceId()).thenReturn("00000000000000000000000000000000"); - when(tracingService.getActor()).thenReturn("unknown"); - when(tracingService.getClientIp()).thenReturn("unknown"); - - var now = Instant.now(); - - QuarkusTransaction.requiringNew().run(() -> { - var entity = new TestEntity("something"); - entity.persist(); - }); - - QuarkusTransaction.requiringNew().run(() -> { - var entity = TestEntity.findBySomething("something"); - assertAll( - () -> assertThat(entity.createdAt) - .as("createdAt should be after or equal to expected value") - .isAfterOrEqualTo(now), - () -> assertThat(entity.lastUpdatedAt) - .as("lastUpdatedAt should be equal to createdAt") - .isEqualTo(entity.createdAt)); - - var auditReader = AuditReaderFactory.get(entityManager); - - var revisions = auditReader.getRevisions(TestEntity.class, entity.id); - assertThat(revisions).hasSize(1); - - var revInfo = entityManager.find(Revision.class, revisions.getFirst()); - assertThat(revInfo).isNotNull(); - - assertAll( - () -> assertThat(revInfo.timestamp) - .as("revision timestamp should be equal to entity's createdAt timestamp") - .isEqualTo(entity.createdAt), - () -> assertThat(revInfo.actor) - .as("actor should match expected value") - .isEqualTo("unknown"), - () -> assertThat(revInfo.traceId) - .as("traceId should match expected value") - .isEqualTo("00000000000000000000000000000000"), - () -> assertThat(revInfo.spanId) - .as("spanId should match expected value") - .isEqualTo("0000000000000000"), - () -> assertThat(revInfo.requestId) - .as("requestId should match expected value") - .isEqualTo("00000000-0000-0000-0000-000000000000"), - () -> assertThat(revInfo.clientIp) - .as("clientIp should match expected value") - .isEqualTo("unknown"), - () -> assertThat(revInfo.hostName) - .as("hostName should not be blank") - .isNotBlank()); - }); - - QuarkusTransaction.requiringNew().run(() -> { - var entity = TestEntity.findBySomething("something"); - entity.something = "else"; - }); - - QuarkusTransaction.requiringNew().run(() -> { - var entity = TestEntity.findBySomething("else"); - assertAll(() -> assertThat(entity.createdAt) - .as("createdAt should be before lastUpdatedAt") - .isBefore(entity.lastUpdatedAt)); - - var auditReader = AuditReaderFactory.get(entityManager); - - var revisions = auditReader.getRevisions(TestEntity.class, entity.id); - assertThat(revisions).hasSize(2); - - Revision revInfo = Revision.findById(revisions.getLast()); - assertThat(revInfo).isNotNull(); - - assertAll( - () -> assertThat(revInfo.timestamp) - .as("revision timestamp should not be equal to entity's createdAt") - .isNotEqualTo(entity.createdAt), - () -> assertThat(revInfo.timestamp) - .as("revision timestamp should be equal to entity's lastUpdatedAt") - .isEqualTo(entity.lastUpdatedAt), - () -> assertThat(revInfo.actor) - .as("actor should match expected value") - .isEqualTo("unknown"), - () -> assertThat(revInfo.traceId) - .as("traceId should match expected value") - .isEqualTo("00000000000000000000000000000000"), - () -> assertThat(revInfo.spanId) - .as("spanId should match expected value") - .isEqualTo("0000000000000000"), - () -> assertThat(revInfo.requestId) - .as("requestId should match expected value") - .isEqualTo("00000000-0000-0000-0000-000000000000"), - () -> assertThat(revInfo.clientIp) - .as("clientIp should match expected value") - .isEqualTo("unknown"), - () -> assertThat(revInfo.hostName) - .as("hostName should not be blank") - .isNotBlank()); - }); - } -} diff --git a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/DefaultRevisionContextProviderTest.java b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/DefaultRevisionContextProviderTest.java deleted file mode 100644 index 8ef3a73..0000000 --- a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/DefaultRevisionContextProviderTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.audit; - -import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; -import static org.mockito.Mockito.mockStatic; - -import io.quarkus.test.junit.QuarkusTest; -import jakarta.inject.Inject; -import java.net.InetAddress; -import java.net.UnknownHostException; -import org.junit.jupiter.api.Test; - -@QuarkusTest -class DefaultRevisionContextProviderTest { - - @Inject - DefaultRevisionContextProvider underTest; - - @Test - void getHostName() { - assertThat(underTest.getHostName()).isNotBlank(); - } - - @Test - void getHostNameWhenUnknown() { - try (var inetMock = mockStatic(InetAddress.class)) { - inetMock.when(InetAddress::getLocalHost).thenThrow(new UnknownHostException("simulated failure")); - - assertThat(underTest.getHostName()).isEqualTo("unknown"); - } - } -} diff --git a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/RevisionTest.java b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/RevisionTest.java deleted file mode 100644 index d0f5d1f..0000000 --- a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/RevisionTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.audit; - -import static org.assertj.core.api.Assertions.assertThat; - -import io.quarkus.test.junit.QuarkusTest; -import org.junit.jupiter.api.Test; - -@QuarkusTest -class RevisionTest { - - @Test - void testEquals() { - var r1 = new Revision(); - r1.rev = 1; - - var r2 = new Revision(); - r2.rev = 1; - - var r3 = new Revision(); - r3.rev = 2; - - assertThat(r1) - .as("Revisions equality should should match expected value") - .isEqualTo(r1) - .isEqualTo(r2) - .isNotEqualTo(r3) - .isNotEqualTo(new Object()); - } - - @Test - void testHashCode() { - var r1 = new Revision(); - r1.rev = 123; - - var r2 = new Revision(); - r2.rev = 123; - - var r3 = new Revision(); - r3.rev = 2; - - assertThat(r1.hashCode()).isEqualTo(123).isEqualTo(r2.hashCode()).isNotEqualTo(r3.hashCode()); - } - - @Test - void testToString() { - var rev = new Revision(); - rev.rev = 1; - - assertThat(rev).as("Revision's toString should match expected value").hasToString("Revision{rev=1}"); - } -} diff --git a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/TestEntity.java b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/TestEntity.java deleted file mode 100644 index 2dea9ea..0000000 --- a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/TestEntity.java +++ /dev/null @@ -1,23 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.audit; - -import jakarta.persistence.Entity; -import jakarta.persistence.Table; -import org.hibernate.envers.Audited; - -@Entity -@Audited -@Table(name = "test_entity") -public class TestEntity extends AuditedPanacheEntity { - - public String something; - - public TestEntity() {} - - public TestEntity(String something) { - this.something = something; - } - - public static TestEntity findBySomething(String something) { - return find("something", something).singleResult(); - } -} diff --git a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/TestEntity2.java b/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/TestEntity2.java deleted file mode 100644 index 922b96a..0000000 --- a/quarkus-audit-tools/src/test/java/ch/phoenix/oss/quarkus/commons/audit/TestEntity2.java +++ /dev/null @@ -1,29 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.audit; - -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import org.hibernate.envers.Audited; - -@Entity -@Audited -@Table(name = "test_entity") -public class TestEntity2 extends AuditedPanacheEntityBase { - - @Id - @GeneratedValue - public Long id; - - public String something; - - public TestEntity2() {} - - public TestEntity2(String something) { - this.something = something; - } - - public static TestEntity2 findBySomething(String something) { - return find("something", something).singleResult(); - } -} diff --git a/quarkus-audit-tools/src/test/resources/application.yaml b/quarkus-audit-tools/src/test/resources/application.yaml deleted file mode 100644 index d44d31a..0000000 --- a/quarkus-audit-tools/src/test/resources/application.yaml +++ /dev/null @@ -1,22 +0,0 @@ -quarkus: - flyway: - migrate-at-start: true - datasource: - db-kind: postgresql - hibernate-orm: - sql-load-script: no-file - schema-management: - strategy: none - log: - sql: true - bind-parameters: true - hibernate-envers: - audit-strategy: org.hibernate.envers.strategy.internal.ValidityAuditStrategy - revision-listener: ch.phoenix.oss.quarkus.commons.audit.AuditRevisionListener - security: - users: - embedded: - enabled: true - plain-text: true - users: - jon: doe diff --git a/quarkus-audit-tools/src/test/resources/db/migration/V1__create_schema.sql b/quarkus-audit-tools/src/test/resources/db/migration/V1__create_schema.sql deleted file mode 100644 index daabe85..0000000 --- a/quarkus-audit-tools/src/test/resources/db/migration/V1__create_schema.sql +++ /dev/null @@ -1,46 +0,0 @@ -create sequence revinfo_seq start with 1 increment by 50; -create sequence test_entity_seq start with 1 increment by 50; - -create table revinfo -( - rev bigint not null, - timestamp timestamp(6) with time zone not null, - actor varchar(255), - spanId varchar(255), - traceId varchar(255), - requestId varchar(255), - clientIp varchar(255), - hostName varchar(255), - primary key (rev) -); - -create table test_entity -( - - id bigint primary key not null, - something varchar(255), - createdAt timestamp(6) with time zone, - lastUpdatedAt timestamp(6) with time zone -); - -create table test_entity_aud -( - revtype smallint, - rev bigint not null, - revend bigint, - id bigint not null, - something varchar(255), - primary key (rev, id) -); - -alter table if exists test_entity_aud - add constraint fk_rev__revinfo_rev - foreign key (rev) - references revinfo; - - -alter table if exists test_entity_aud - add constraint fk_revend__revinfo_rev - foreign key (revend) - references revinfo; - diff --git a/quarkus-audit-tools/src/test/resources/db/migration/V2__create_audit_trigger.sql b/quarkus-audit-tools/src/test/resources/db/migration/V2__create_audit_trigger.sql deleted file mode 100644 index f76a2cb..0000000 --- a/quarkus-audit-tools/src/test/resources/db/migration/V2__create_audit_trigger.sql +++ /dev/null @@ -1,35 +0,0 @@ -CREATE OR REPLACE FUNCTION trg_test_entity_aud_apply_rev() - RETURNS TRIGGER - LANGUAGE plpgsql -AS $func$ -DECLARE - ts TIMESTAMP; -BEGIN - -- fetch the exact revision timestamp from revinfo - SELECT r.timestamp - INTO ts - FROM revinfo r - WHERE r.rev = NEW.rev; - - -- only set created_at once, when still NULL - UPDATE test_entity - SET createdAt = ts - WHERE id = NEW.id - AND createdAt IS NULL; - - -- always bump last_updated_at - UPDATE test_entity - SET lastUpdatedAt = ts - WHERE id = NEW.id; - - RETURN NULL; -END; -$func$; - -DROP TRIGGER IF EXISTS trg_test_entity_aud_after_insert - ON test_entity_aud; - -CREATE TRIGGER trg_test_entity_aud_after_insert - AFTER INSERT ON test_entity_aud - FOR EACH ROW -EXECUTE FUNCTION trg_test_entity_aud_apply_rev(); diff --git a/quarkus-audit-tools/src/test/resources/import.sql b/quarkus-audit-tools/src/test/resources/import.sql deleted file mode 100644 index c4a0b85..0000000 --- a/quarkus-audit-tools/src/test/resources/import.sql +++ /dev/null @@ -1,37 +0,0 @@ --- 1) Create or replace the trigger function -CREATE OR REPLACE FUNCTION trg_test_entity_aud_apply_rev() - RETURNS TRIGGER - LANGUAGE plpgsql -AS $func$ -DECLARE - ts TIMESTAMP; -BEGIN - -- fetch the exact revision timestamp from revinfo - SELECT r.timestamp - INTO ts - FROM revinfo r - WHERE r.rev = NEW.rev; - - -- only set created_at once, when still NULL - UPDATE test_entity - SET created_at = ts - WHERE id = NEW.id - AND created_at IS NULL; - - -- always bump last_updated_at - UPDATE test_entity - SET last_updated_at = ts - WHERE id = NEW.id; - - RETURN NULL; -- AFTER trigger ignores return value -END; -$func$; - --- 2) Drop any existing trigger, then attach the new one -DROP TRIGGER IF EXISTS trg_test_entity_aud_after_insert - ON test_entity_aud; - -CREATE TRIGGER trg_test_entity_aud_after_insert - AFTER INSERT ON test_entity_aud - FOR EACH ROW -EXECUTE FUNCTION trg_test_entity_aud_apply_rev(); diff --git a/quarkus-client-logger/pom.xml b/quarkus-client-logger/pom.xml deleted file mode 100644 index f22f45c..0000000 --- a/quarkus-client-logger/pom.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - 4.0.0 - - - ch.phoenix.oss - quarkus-commons - 1.1.3-SNAPSHOT - - - quarkus-client-logger - jar - - - - io.quarkus - quarkus-rest-client - - - io.quarkus - quarkus-config-yaml - test - - - io.quarkus - quarkus-rest-jackson - test - - - - - - - org.jacoco - jacoco-maven-plugin - ${jacoco-plugin.version} - - - jacoco-check - - check - - test - - ${project.build.directory}/jacoco-quarkus.exec - - - BUNDLE - - - INSTRUCTION - COVEREDRATIO - 0.92 - - - - - - - - - - - - diff --git a/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/LowerCaseStringConverter.java b/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/LowerCaseStringConverter.java deleted file mode 100644 index 498e318..0000000 --- a/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/LowerCaseStringConverter.java +++ /dev/null @@ -1,10 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.client.logger; - -import org.eclipse.microprofile.config.spi.Converter; - -public class LowerCaseStringConverter implements Converter { - @Override - public String convert(String value) throws IllegalArgumentException, NullPointerException { - return value.toLowerCase(); - } -} diff --git a/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLogger.java b/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLogger.java deleted file mode 100644 index cb2b63b..0000000 --- a/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLogger.java +++ /dev/null @@ -1,119 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.client.logger; - -import io.vertx.core.Handler; -import io.vertx.core.MultiMap; -import io.vertx.core.buffer.Buffer; -import io.vertx.core.http.HttpClientRequest; -import io.vertx.core.http.HttpClientResponse; -import jakarta.enterprise.context.Dependent; -import jakarta.inject.Inject; -import java.util.Map; -import java.util.Set; -import org.jboss.logging.Logger; -import org.jboss.resteasy.reactive.client.api.ClientLogger; - -/** - * This is based on org.jboss.resteasy.reactive.client.logging.DefaultClientLogger, - * with the only change being that headers are redacted based on the Set provided - * by the configuration. - */ -@Dependent -public class RedactingClientLogger implements ClientLogger { - - private static final Logger log = Logger.getLogger(RedactingClientLogger.class); - - private static final String REDACTED_VALUE = "*****"; - - private final Set redactedHeaders; - - private int bodySize; - - @Inject - public RedactingClientLogger(RedactingClientLoggerConfiguration configuration) { - this.redactedHeaders = configuration - .headers() - .redact() - .orElse(RedactingClientLoggerConfiguration.Headers.DEFAULT_REDACTED_HEADERS); - } - - @Override - public void setBodySize(int bodySize) { - this.bodySize = bodySize; - } - - @Override - public void logResponse(HttpClientResponse response, boolean redirect) { - if (!log.isDebugEnabled()) { - return; - } - - //noinspection Convert2Lambda - response.bodyHandler(new Handler<>() { - @Override - public void handle(Buffer body) { - log.debugf( - "%s: %s %s, Status[%d %s], Headers[%s], Body:\n%s", - redirect ? "Redirect" : "Response", - response.request().getMethod(), - response.request().absoluteURI(), - response.statusCode(), - response.statusMessage(), - asString(response.headers()), - bodyToString(body)); - } - }); - } - - @Override - public void logRequest(HttpClientRequest request, Buffer body, boolean omitBody) { - if (!log.isDebugEnabled()) { - return; - } - if (omitBody) { - log.debugf( - "Request: %s %s Headers[%s], Body omitted", - request.getMethod(), request.absoluteURI(), asString(request.headers())); - } else if (body == null || body.length() == 0) { - log.debugf( - "Request: %s %s Headers[%s], Empty body", - request.getMethod(), request.absoluteURI(), asString(request.headers())); - } else { - log.debugf( - "Request: %s %s Headers[%s], Body:\n%s", - request.getMethod(), request.absoluteURI(), asString(request.headers()), bodyToString(body)); - } - } - - private String bodyToString(Buffer body) { - if (body == null) { - return ""; - } else if (bodySize <= 0) { - return body.toString(); - } else { - String bodyAsString = body.toString(); - return bodyAsString.substring(0, Math.min(bodySize, bodyAsString.length())); - } - } - - private String asString(MultiMap headers) { - if (headers.isEmpty()) { - return ""; - } - StringBuilder sb = new StringBuilder((headers.size() * (6 + 1 + 6)) - + (headers.size() - 1)); // this is a very rough estimate of a result like 'key1=value1 key2=value2' - boolean isFirst = true; - for (Map.Entry entry : headers) { - if (isFirst) { - isFirst = false; - } else { - sb.append(' '); - } - - var key = entry.getKey(); - var value = redactedHeaders.contains(key.toLowerCase()) ? REDACTED_VALUE : entry.getValue(); - - sb.append(key).append('=').append(value); - } - return sb.toString(); - } -} diff --git a/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLoggerConfiguration.java b/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLoggerConfiguration.java deleted file mode 100644 index ff72f6f..0000000 --- a/quarkus-client-logger/src/main/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLoggerConfiguration.java +++ /dev/null @@ -1,20 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.client.logger; - -import io.smallrye.config.ConfigMapping; -import io.smallrye.config.WithConverter; -import jakarta.ws.rs.core.HttpHeaders; -import java.util.Optional; -import java.util.Set; - -@ConfigMapping(prefix = "phoenix-oss.client-logger") -public interface RedactingClientLoggerConfiguration { - - Headers headers(); - - interface Headers { - - Set DEFAULT_REDACTED_HEADERS = Set.of(HttpHeaders.AUTHORIZATION.toLowerCase()); - - Optional> redact(); - } -} diff --git a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/InfoLevelProfile.java b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/InfoLevelProfile.java deleted file mode 100644 index 35acb14..0000000 --- a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/InfoLevelProfile.java +++ /dev/null @@ -1,12 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.client.logger; - -import io.quarkus.test.junit.QuarkusTestProfile; -import java.util.Map; - -public class InfoLevelProfile implements QuarkusTestProfile { - - @Override - public Map getConfigOverrides() { - return Map.of("quarkus.log.category.\"ch.phoenix.oss.quarkus.commons.client.logger\".level", "INFO"); - } -} diff --git a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/InfoLevelTest.java b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/InfoLevelTest.java deleted file mode 100644 index c6b27ef..0000000 --- a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/InfoLevelTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.client.logger; - -import io.quarkus.rest.client.reactive.QuarkusRestClientBuilder; -import io.quarkus.test.junit.QuarkusTest; -import io.quarkus.test.junit.TestProfile; -import jakarta.inject.Inject; -import java.net.URI; -import java.util.Optional; -import org.eclipse.microprofile.rest.client.inject.RestClient; -import org.junit.jupiter.api.Test; - -@QuarkusTest -@TestProfile(InfoLevelProfile.class) -class InfoLevelTest { - - @Inject - @RestClient - TestClient injectedClient; - - TestClient builtClient = QuarkusRestClientBuilder.newBuilder() - .clientLogger(new RedactingClientLogger(() -> Optional::empty)) - .baseUri(URI.create("http://localhost:8087")) - .build(TestClient.class); - - @Test - void getWithInjectedClient() { - injectedClient.get("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "also redacted"); - } - - @Test - void getWithBuiltClientAndEmptyConfig() { - builtClient.get("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "not redacted"); - } - - @Test - void postWithInjectedClient() { - injectedClient.post("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "also redacted", "body"); - } - - @Test - void postWithBuiltClientAndEmptyConfig() { - builtClient.post("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "not redacted", ""); - } -} diff --git a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLoggerTest.java b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLoggerTest.java deleted file mode 100644 index 01e9389..0000000 --- a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/RedactingClientLoggerTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.client.logger; - -import io.quarkus.rest.client.reactive.QuarkusRestClientBuilder; -import io.quarkus.test.junit.QuarkusTest; -import jakarta.inject.Inject; -import java.net.URI; -import java.util.Optional; -import org.eclipse.microprofile.rest.client.inject.RestClient; -import org.junit.jupiter.api.Test; - -@QuarkusTest -class RedactingClientLoggerTest { - - @Inject - @RestClient - TestClient injectedClient; - - TestClient builtClient = QuarkusRestClientBuilder.newBuilder() - .clientLogger(new RedactingClientLogger(() -> Optional::empty)) - .baseUri(URI.create("http://localhost:8087")) - .build(TestClient.class); - - @Test - void getWithInjectedClient() { - injectedClient.get("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "also redacted"); - } - - @Test - void getWithBuiltClientAndEmptyConfig() { - builtClient.get("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "not redacted"); - } - - @Test - void postWithInjectedClient() { - injectedClient.post("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "also redacted", "body"); - } - - @Test - void postWithInjectedClientAndNullBody() { - injectedClient.post("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "also redacted", null); - } - - @Test - void postWithBuiltClientAndEmptyConfig() { - builtClient.post("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "not redacted", ""); - } -} diff --git a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/ScopeNoneProfile.java b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/ScopeNoneProfile.java deleted file mode 100644 index 42daa28..0000000 --- a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/ScopeNoneProfile.java +++ /dev/null @@ -1,12 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.client.logger; - -import io.quarkus.test.junit.QuarkusTestProfile; -import java.util.Map; - -public class ScopeNoneProfile implements QuarkusTestProfile { - - @Override - public Map getConfigOverrides() { - return Map.of("quarkus.rest-client.logging.scope", "none"); - } -} diff --git a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/ScopeNoneTest.java b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/ScopeNoneTest.java deleted file mode 100644 index 14538b2..0000000 --- a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/ScopeNoneTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.client.logger; - -import io.quarkus.rest.client.reactive.QuarkusRestClientBuilder; -import io.quarkus.test.junit.QuarkusTest; -import io.quarkus.test.junit.TestProfile; -import jakarta.inject.Inject; -import java.net.URI; -import java.util.Optional; -import org.eclipse.microprofile.rest.client.inject.RestClient; -import org.junit.jupiter.api.Test; - -@QuarkusTest -@TestProfile(ScopeNoneProfile.class) -class ScopeNoneTest { - - @Inject - @RestClient - TestClient injectedClient; - - TestClient builtClient = QuarkusRestClientBuilder.newBuilder() - .clientLogger(new RedactingClientLogger(() -> Optional::empty)) - .baseUri(URI.create("http://localhost:8087")) - .build(TestClient.class); - - @Test - void getWithInjectedClient() { - injectedClient.get("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "also redacted"); - } - - @Test - void getWithBuiltClientAndEmptyConfig() { - builtClient.get("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "not redacted"); - } - - @Test - void postWithInjectedClient() { - injectedClient.post("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "also redacted", "body"); - } - - @Test - void postWithBuiltClientAndEmptyConfig() { - builtClient.post("this will be redacted", "5c0d8e45-e402-4b71-8f84-24cc0cfd7eec", "not redacted", ""); - } -} diff --git a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/TestClient.java b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/TestClient.java deleted file mode 100644 index 79769ac..0000000 --- a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/TestClient.java +++ /dev/null @@ -1,28 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.client.logger; - -import jakarta.ws.rs.*; -import jakarta.ws.rs.core.MediaType; -import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; - -@SuppressWarnings("UastIncorrectHttpHeaderInspection") -@RegisterRestClient(configKey = "test") -public interface TestClient { - - @GET - @Path("/") - @Produces(MediaType.TEXT_PLAIN) - String get( - @HeaderParam("Authorization") String authorization, - @HeaderParam("X-Request-ID") String requestId, - @HeaderParam("X-Something-Else") String somethingElse); - - @POST - @Path("/") - @Consumes(MediaType.TEXT_PLAIN) - @Produces(MediaType.TEXT_PLAIN) - String post( - @HeaderParam("Authorization") String authorization, - @HeaderParam("X-Request-ID") String requestId, - @HeaderParam("X-Something-Else") String somethingElse, - String body); -} diff --git a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/TestResource.java b/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/TestResource.java deleted file mode 100644 index c83bdd0..0000000 --- a/quarkus-client-logger/src/test/java/ch/phoenix/oss/quarkus/commons/client/logger/TestResource.java +++ /dev/null @@ -1,21 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.client.logger; - -import jakarta.ws.rs.*; -import jakarta.ws.rs.core.MediaType; - -@Path("/") -public class TestResource { - - @GET - @Produces(MediaType.TEXT_PLAIN) - public String get() { - return "get"; - } - - @POST - @Consumes(MediaType.TEXT_PLAIN) - @Produces(MediaType.TEXT_PLAIN) - public String post(String body) { - return body; - } -} diff --git a/quarkus-client-logger/src/test/resources/application.yaml b/quarkus-client-logger/src/test/resources/application.yaml deleted file mode 100644 index 0108460..0000000 --- a/quarkus-client-logger/src/test/resources/application.yaml +++ /dev/null @@ -1,20 +0,0 @@ -quarkus: - http: - test-port: 8087 - rest-client: - logging: - scope: request-response - body-limit: 10000 - test: - url: http://localhost:${quarkus.http.test-port} - log: - category: - "ch.phoenix.oss.quarkus.commons.client.logger": - level: DEBUG - -phoenix-oss: - client-logger: - headers: - redact: - - AUTHORIZATION - - X-SOMETHING-ELSE diff --git a/quarkus-clock-service/pom.xml b/quarkus-clock-service/pom.xml index eb5d94b..4b37c7a 100644 --- a/quarkus-clock-service/pom.xml +++ b/quarkus-clock-service/pom.xml @@ -1,11 +1,13 @@ - + 4.0.0 - ch.phoenix.oss + ch.phoenixtechnologies.quarkus quarkus-commons - 1.1.3-SNAPSHOT + 1.0.1-SNAPSHOT quarkus-clock-service diff --git a/quarkus-clock-service/src/main/java/ch/phoenix/oss/quarkus/commons/clock/ClockService.java b/quarkus-clock-service/src/main/java/ch/phoenix/oss/quarkus/commons/clock/ClockService.java deleted file mode 100644 index f6c3c26..0000000 --- a/quarkus-clock-service/src/main/java/ch/phoenix/oss/quarkus/commons/clock/ClockService.java +++ /dev/null @@ -1,19 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.clock; - -import java.time.Instant; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZonedDateTime; - -public interface ClockService { - - Instant instant(); - - long currentTimeMillis(); - - LocalDate localDate(); - - LocalDateTime localDateTime(); - - ZonedDateTime zonedDateTime(); -} diff --git a/quarkus-clock-service/src/main/java/ch/phoenix/oss/quarkus/commons/clock/ClockProducer.java b/quarkus-clock-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/clock/ClockProducer.java similarity index 85% rename from quarkus-clock-service/src/main/java/ch/phoenix/oss/quarkus/commons/clock/ClockProducer.java rename to quarkus-clock-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/clock/ClockProducer.java index 104b0c7..6426fa3 100644 --- a/quarkus-clock-service/src/main/java/ch/phoenix/oss/quarkus/commons/clock/ClockProducer.java +++ b/quarkus-clock-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/clock/ClockProducer.java @@ -1,4 +1,4 @@ -package ch.phoenix.oss.quarkus.commons.clock; +package ch.phoenixtechnologies.quarkus.commons.clock; import io.quarkus.arc.DefaultBean; import jakarta.enterprise.context.ApplicationScoped; diff --git a/quarkus-clock-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/clock/ClockService.java b/quarkus-clock-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/clock/ClockService.java new file mode 100644 index 0000000..5954727 --- /dev/null +++ b/quarkus-clock-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/clock/ClockService.java @@ -0,0 +1,10 @@ +package ch.phoenixtechnologies.quarkus.commons.clock; + +import java.time.Instant; + +public interface ClockService { + + Instant instant(); + + long currentTimeMillis(); +} diff --git a/quarkus-clock-service/src/main/java/ch/phoenix/oss/quarkus/commons/clock/ClockServiceImpl.java b/quarkus-clock-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/clock/ClockServiceImpl.java similarity index 54% rename from quarkus-clock-service/src/main/java/ch/phoenix/oss/quarkus/commons/clock/ClockServiceImpl.java rename to quarkus-clock-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/clock/ClockServiceImpl.java index e47c757..e1a32c1 100644 --- a/quarkus-clock-service/src/main/java/ch/phoenix/oss/quarkus/commons/clock/ClockServiceImpl.java +++ b/quarkus-clock-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/clock/ClockServiceImpl.java @@ -1,8 +1,9 @@ -package ch.phoenix.oss.quarkus.commons.clock; +package ch.phoenixtechnologies.quarkus.commons.clock; import io.quarkus.arc.DefaultBean; import jakarta.enterprise.context.ApplicationScoped; -import java.time.*; +import java.time.Clock; +import java.time.Instant; @DefaultBean @ApplicationScoped @@ -23,19 +24,4 @@ class ClockServiceImpl implements ClockService { public long currentTimeMillis() { return clock.millis(); } - - @Override - public LocalDate localDate() { - return LocalDate.now(clock); - } - - @Override - public LocalDateTime localDateTime() { - return LocalDateTime.now(clock); - } - - @Override - public ZonedDateTime zonedDateTime() { - return ZonedDateTime.now(clock); - } } diff --git a/quarkus-clock-service/src/test/java/ch/phoenix/oss/quarkus/commons/clock/ClockServiceImplTest.java b/quarkus-clock-service/src/test/java/ch/phoenix/oss/quarkus/commons/clock/ClockServiceImplTest.java deleted file mode 100644 index dfffea8..0000000 --- a/quarkus-clock-service/src/test/java/ch/phoenix/oss/quarkus/commons/clock/ClockServiceImplTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.clock; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.when; - -import io.quarkus.test.InjectMock; -import io.quarkus.test.junit.QuarkusTest; -import jakarta.inject.Inject; -import java.time.*; -import org.junit.jupiter.api.Test; - -@QuarkusTest -class ClockServiceImplTest { - - @Inject - ClockService clockService; - - @InjectMock - Clock clock; - - @Test - void instant() { - var expected = Instant.ofEpochMilli(1729280640915L); - when(clock.instant()).thenReturn(expected); - - assertThat(clockService.instant()) - .as("Instant should match expected value") - .isEqualTo(expected); - } - - @Test - void currentTimeMillis() { - var expected = 1729280640915L; - when(clock.millis()).thenReturn(expected); - - assertThat(clockService.currentTimeMillis()) - .as("Instant should match expected value") - .isEqualTo(expected); - } - - @Test - void localDate() { - var instant = Instant.ofEpochMilli(1729280640915L); - when(clock.instant()).thenReturn(instant); - when(clock.getZone()).thenReturn(ZoneId.of("UTC")); - assertThat(clockService.localDate()) - .as("LocalDate should match expected value") - .isEqualTo(LocalDate.parse("2024-10-18")); - } - - @Test - void localDateTime() { - var instant = Instant.ofEpochMilli(1729280640915L); - when(clock.instant()).thenReturn(instant); - when(clock.getZone()).thenReturn(ZoneId.of("UTC")); - assertThat(clockService.localDateTime()) - .as("LocalDateTime should match expected value") - .isEqualTo(LocalDateTime.parse("2024-10-18T19:44:00.915")); - } - - @Test - void zonedDateTime() { - var instant = Instant.ofEpochMilli(1729280640915L); - when(clock.instant()).thenReturn(instant); - when(clock.getZone()).thenReturn(ZoneId.of("UTC")); - assertThat(clockService.zonedDateTime()) - .as("ZonedDateTime should match expected value") - .isEqualTo(ZonedDateTime.parse("2024-10-18T19:44:00.915Z[UTC]")); - } -} diff --git a/quarkus-clock-service/src/test/java/ch/phoenix/oss/quarkus/commons/clock/ClockProducerTest.java b/quarkus-clock-service/src/test/java/ch/phoenixtechnologies/quarkus/commons/clock/ClockProducerTest.java similarity index 89% rename from quarkus-clock-service/src/test/java/ch/phoenix/oss/quarkus/commons/clock/ClockProducerTest.java rename to quarkus-clock-service/src/test/java/ch/phoenixtechnologies/quarkus/commons/clock/ClockProducerTest.java index c05ad74..63a5be2 100644 --- a/quarkus-clock-service/src/test/java/ch/phoenix/oss/quarkus/commons/clock/ClockProducerTest.java +++ b/quarkus-clock-service/src/test/java/ch/phoenixtechnologies/quarkus/commons/clock/ClockProducerTest.java @@ -1,4 +1,4 @@ -package ch.phoenix.oss.quarkus.commons.clock; +package ch.phoenixtechnologies.quarkus.commons.clock; import static org.assertj.core.api.Assertions.assertThat; diff --git a/quarkus-clock-service/src/test/java/ch/phoenixtechnologies/quarkus/commons/clock/ClockServiceImplTest.java b/quarkus-clock-service/src/test/java/ch/phoenixtechnologies/quarkus/commons/clock/ClockServiceImplTest.java new file mode 100644 index 0000000..fc4d312 --- /dev/null +++ b/quarkus-clock-service/src/test/java/ch/phoenixtechnologies/quarkus/commons/clock/ClockServiceImplTest.java @@ -0,0 +1,41 @@ +package ch.phoenixtechnologies.quarkus.commons.clock; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +import io.quarkus.test.InjectMock; +import io.quarkus.test.junit.QuarkusTest; +import jakarta.inject.Inject; +import java.time.Clock; +import java.time.Instant; +import org.junit.jupiter.api.Test; + +@QuarkusTest +class ClockServiceImplTest { + + @Inject + ClockService clockService; + + @InjectMock + Clock clock; + + @Test + void instant() { + var expected = Instant.ofEpochMilli(1729280640915L); + when(clock.instant()).thenReturn(expected); + + assertThat(clockService.instant()) + .as("Instant should match expected value") + .isEqualTo(expected); + } + + @Test + void currentTimeMillis() { + var expected = 1729280640915L; + when(clock.millis()).thenReturn(expected); + + assertThat(clockService.currentTimeMillis()) + .as("Instant should match expected value") + .isEqualTo(expected); + } +} diff --git a/quarkus-json-service/pom.xml b/quarkus-json-service/pom.xml index 9451cc2..a13978d 100644 --- a/quarkus-json-service/pom.xml +++ b/quarkus-json-service/pom.xml @@ -1,11 +1,13 @@ - + 4.0.0 - ch.phoenix.oss + ch.phoenixtechnologies.quarkus quarkus-commons - 1.1.3-SNAPSHOT + 1.0.1-SNAPSHOT quarkus-json-service @@ -40,7 +42,7 @@ INSTRUCTION COVEREDRATIO - 1 + 0.83 diff --git a/quarkus-json-service/src/main/java/ch/phoenix/oss/quarkus/commons/json/JsonService.java b/quarkus-json-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/json/JsonService.java similarity index 81% rename from quarkus-json-service/src/main/java/ch/phoenix/oss/quarkus/commons/json/JsonService.java rename to quarkus-json-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/json/JsonService.java index 9d229b7..d2c28bd 100644 --- a/quarkus-json-service/src/main/java/ch/phoenix/oss/quarkus/commons/json/JsonService.java +++ b/quarkus-json-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/json/JsonService.java @@ -1,4 +1,4 @@ -package ch.phoenix.oss.quarkus.commons.json; +package ch.phoenixtechnologies.quarkus.commons.json; import com.fasterxml.jackson.core.type.TypeReference; diff --git a/quarkus-json-service/src/main/java/ch/phoenix/oss/quarkus/commons/json/JsonServiceImpl.java b/quarkus-json-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/json/JsonServiceImpl.java similarity index 96% rename from quarkus-json-service/src/main/java/ch/phoenix/oss/quarkus/commons/json/JsonServiceImpl.java rename to quarkus-json-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/json/JsonServiceImpl.java index 5c310e6..c87d376 100644 --- a/quarkus-json-service/src/main/java/ch/phoenix/oss/quarkus/commons/json/JsonServiceImpl.java +++ b/quarkus-json-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/json/JsonServiceImpl.java @@ -1,4 +1,4 @@ -package ch.phoenix.oss.quarkus.commons.json; +package ch.phoenixtechnologies.quarkus.commons.json; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; diff --git a/quarkus-json-service/src/test/java/ch/phoenix/oss/quarkus/commons/json/JsonServiceImplTest.java b/quarkus-json-service/src/test/java/ch/phoenixtechnologies/quarkus/commons/json/JsonServiceImplTest.java similarity index 71% rename from quarkus-json-service/src/test/java/ch/phoenix/oss/quarkus/commons/json/JsonServiceImplTest.java rename to quarkus-json-service/src/test/java/ch/phoenixtechnologies/quarkus/commons/json/JsonServiceImplTest.java index 527a330..d01d46c 100644 --- a/quarkus-json-service/src/test/java/ch/phoenix/oss/quarkus/commons/json/JsonServiceImplTest.java +++ b/quarkus-json-service/src/test/java/ch/phoenixtechnologies/quarkus/commons/json/JsonServiceImplTest.java @@ -1,4 +1,4 @@ -package ch.phoenix.oss.quarkus.commons.json; +package ch.phoenixtechnologies.quarkus.commons.json; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -17,15 +17,6 @@ class JsonServiceImplTest { record TestRecord(String name, int age) {} - static class CircularReference { - CircularReference reference; - - @Override - public String toString() { - return "CircularReference"; - } - } - @Inject JsonServiceImpl jsonService; @@ -38,17 +29,6 @@ class JsonServiceImplTest { assertThat(actual).as("Json should match expected value").isEqualTo(expected); } - @Test - void toJsonWithCircularReference() { - var circularReference = new CircularReference(); - circularReference.reference = circularReference; - - assertThatThrownBy(() -> jsonService.toJson(circularReference)) - .as("Should throw IllegalArgumentException when input is invalid") - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("Unable to write object as json String: CircularReference"); - } - @Test void fromJsonWithClass() { var json = "{\"name\":\"John Doe\",\"age\":30}"; @@ -67,7 +47,7 @@ class JsonServiceImplTest { .as("Should throw IllegalArgumentException when input is invalid") .isInstanceOf(IllegalArgumentException.class) .hasMessage( - "Unable to read object of class [ch.phoenix.oss.quarkus.commons.json.JsonServiceImplTest$TestRecord] from json String: {\"name\":\"John Doe\",\"age\":\"30\""); + "Unable to read object of class [ch.phoenixtechnologies.quarkus.commons.json.JsonServiceImplTest$TestRecord] from json String: {\"name\":\"John Doe\",\"age\":\"30\""); } @Test @@ -90,6 +70,6 @@ class JsonServiceImplTest { .as("Should throw IllegalArgumentException when input is invalid") .isInstanceOf(IllegalArgumentException.class) .hasMessage( - "Unable to read object of type [java.util.List] from json String: {\"name\":\"John Doe\",\"age\":30},{\"name\":\"Jane Doe\",\"age\":\"25\"}"); + "Unable to read object of type [java.util.List] from json String: {\"name\":\"John Doe\",\"age\":30},{\"name\":\"Jane Doe\",\"age\":\"25\"}"); } } diff --git a/quarkus-message-digest-service/pom.xml b/quarkus-message-digest-service/pom.xml index b28af74..1ae7ddb 100644 --- a/quarkus-message-digest-service/pom.xml +++ b/quarkus-message-digest-service/pom.xml @@ -1,11 +1,13 @@ - + 4.0.0 - ch.phoenix.oss + ch.phoenixtechnologies.quarkus quarkus-commons - 1.1.3-SNAPSHOT + 1.0.1-SNAPSHOT quarkus-message-digest-service diff --git a/quarkus-message-digest-service/src/main/java/ch/phoenix/oss/quarkus/commons/digest/MessageDigestConfiguration.java b/quarkus-message-digest-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/digest/MessageDigestConfiguration.java similarity index 64% rename from quarkus-message-digest-service/src/main/java/ch/phoenix/oss/quarkus/commons/digest/MessageDigestConfiguration.java rename to quarkus-message-digest-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/digest/MessageDigestConfiguration.java index a17da7d..ebd7b78 100644 --- a/quarkus-message-digest-service/src/main/java/ch/phoenix/oss/quarkus/commons/digest/MessageDigestConfiguration.java +++ b/quarkus-message-digest-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/digest/MessageDigestConfiguration.java @@ -1,9 +1,9 @@ -package ch.phoenix.oss.quarkus.commons.digest; +package ch.phoenixtechnologies.quarkus.commons.digest; import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithDefault; -@ConfigMapping(prefix = "phoenix-oss.message-digest") +@ConfigMapping(prefix = "phoenix.message-digest") public interface MessageDigestConfiguration { @WithDefault("SHA-256") diff --git a/quarkus-message-digest-service/src/main/java/ch/phoenix/oss/quarkus/commons/digest/MessageDigestService.java b/quarkus-message-digest-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/digest/MessageDigestService.java similarity index 97% rename from quarkus-message-digest-service/src/main/java/ch/phoenix/oss/quarkus/commons/digest/MessageDigestService.java rename to quarkus-message-digest-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/digest/MessageDigestService.java index f2cd285..de1f2a5 100644 --- a/quarkus-message-digest-service/src/main/java/ch/phoenix/oss/quarkus/commons/digest/MessageDigestService.java +++ b/quarkus-message-digest-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/digest/MessageDigestService.java @@ -1,4 +1,4 @@ -package ch.phoenix.oss.quarkus.commons.digest; +package ch.phoenixtechnologies.quarkus.commons.digest; import java.nio.charset.Charset; import java.security.MessageDigest; diff --git a/quarkus-message-digest-service/src/main/java/ch/phoenix/oss/quarkus/commons/digest/MessageDigestServiceImpl.java b/quarkus-message-digest-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/digest/MessageDigestServiceImpl.java similarity index 96% rename from quarkus-message-digest-service/src/main/java/ch/phoenix/oss/quarkus/commons/digest/MessageDigestServiceImpl.java rename to quarkus-message-digest-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/digest/MessageDigestServiceImpl.java index b64c0ab..3b9e42e 100644 --- a/quarkus-message-digest-service/src/main/java/ch/phoenix/oss/quarkus/commons/digest/MessageDigestServiceImpl.java +++ b/quarkus-message-digest-service/src/main/java/ch/phoenixtechnologies/quarkus/commons/digest/MessageDigestServiceImpl.java @@ -1,4 +1,4 @@ -package ch.phoenix.oss.quarkus.commons.digest; +package ch.phoenixtechnologies.quarkus.commons.digest; import io.quarkus.arc.DefaultBean; import jakarta.enterprise.context.ApplicationScoped; diff --git a/quarkus-message-digest-service/src/test/java/ch/phoenix/oss/quarkus/commons/digest/MessageDigestServiceImplTest.java b/quarkus-message-digest-service/src/test/java/ch/phoenixtechnologies/quarkus/commons/digest/MessageDigestServiceImplTest.java similarity index 98% rename from quarkus-message-digest-service/src/test/java/ch/phoenix/oss/quarkus/commons/digest/MessageDigestServiceImplTest.java rename to quarkus-message-digest-service/src/test/java/ch/phoenixtechnologies/quarkus/commons/digest/MessageDigestServiceImplTest.java index 64e0374..341554a 100644 --- a/quarkus-message-digest-service/src/test/java/ch/phoenix/oss/quarkus/commons/digest/MessageDigestServiceImplTest.java +++ b/quarkus-message-digest-service/src/test/java/ch/phoenixtechnologies/quarkus/commons/digest/MessageDigestServiceImplTest.java @@ -1,4 +1,4 @@ -package ch.phoenix.oss.quarkus.commons.digest; +package ch.phoenixtechnologies.quarkus.commons.digest; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; diff --git a/quarkus-random-number-generator/pom.xml b/quarkus-random-number-generator/pom.xml index c178a94..e188b70 100644 --- a/quarkus-random-number-generator/pom.xml +++ b/quarkus-random-number-generator/pom.xml @@ -1,11 +1,13 @@ - + 4.0.0 - ch.phoenix.oss + ch.phoenixtechnologies.quarkus quarkus-commons - 1.1.3-SNAPSHOT + 1.0.1-SNAPSHOT quarkus-random-number-generator diff --git a/quarkus-random-number-generator/src/main/java/ch/phoenix/oss/quarkus/commons/random/RandomNumberGenerator.java b/quarkus-random-number-generator/src/main/java/ch/phoenixtechnologies/quarkus/commons/random/RandomNumberGenerator.java similarity index 98% rename from quarkus-random-number-generator/src/main/java/ch/phoenix/oss/quarkus/commons/random/RandomNumberGenerator.java rename to quarkus-random-number-generator/src/main/java/ch/phoenixtechnologies/quarkus/commons/random/RandomNumberGenerator.java index 32365f1..922eb78 100644 --- a/quarkus-random-number-generator/src/main/java/ch/phoenix/oss/quarkus/commons/random/RandomNumberGenerator.java +++ b/quarkus-random-number-generator/src/main/java/ch/phoenixtechnologies/quarkus/commons/random/RandomNumberGenerator.java @@ -1,4 +1,4 @@ -package ch.phoenix.oss.quarkus.commons.random; +package ch.phoenixtechnologies.quarkus.commons.random; import java.math.BigInteger; import java.util.Random; diff --git a/quarkus-random-number-generator/src/main/java/ch/phoenix/oss/quarkus/commons/random/RandomNumberGeneratorImpl.java b/quarkus-random-number-generator/src/main/java/ch/phoenixtechnologies/quarkus/commons/random/RandomNumberGeneratorImpl.java similarity index 97% rename from quarkus-random-number-generator/src/main/java/ch/phoenix/oss/quarkus/commons/random/RandomNumberGeneratorImpl.java rename to quarkus-random-number-generator/src/main/java/ch/phoenixtechnologies/quarkus/commons/random/RandomNumberGeneratorImpl.java index b88353b..bed44c6 100644 --- a/quarkus-random-number-generator/src/main/java/ch/phoenix/oss/quarkus/commons/random/RandomNumberGeneratorImpl.java +++ b/quarkus-random-number-generator/src/main/java/ch/phoenixtechnologies/quarkus/commons/random/RandomNumberGeneratorImpl.java @@ -1,4 +1,4 @@ -package ch.phoenix.oss.quarkus.commons.random; +package ch.phoenixtechnologies.quarkus.commons.random; import io.quarkus.arc.DefaultBean; import jakarta.enterprise.context.ApplicationScoped; diff --git a/quarkus-random-number-generator/src/main/java/ch/phoenix/oss/quarkus/commons/random/RandomProvider.java b/quarkus-random-number-generator/src/main/java/ch/phoenixtechnologies/quarkus/commons/random/RandomProvider.java similarity index 87% rename from quarkus-random-number-generator/src/main/java/ch/phoenix/oss/quarkus/commons/random/RandomProvider.java rename to quarkus-random-number-generator/src/main/java/ch/phoenixtechnologies/quarkus/commons/random/RandomProvider.java index 95ed63d..e58466d 100644 --- a/quarkus-random-number-generator/src/main/java/ch/phoenix/oss/quarkus/commons/random/RandomProvider.java +++ b/quarkus-random-number-generator/src/main/java/ch/phoenixtechnologies/quarkus/commons/random/RandomProvider.java @@ -1,4 +1,4 @@ -package ch.phoenix.oss.quarkus.commons.random; +package ch.phoenixtechnologies.quarkus.commons.random; import java.util.Random; diff --git a/quarkus-random-number-generator/src/main/java/ch/phoenix/oss/quarkus/commons/random/RandomProviderImpl.java b/quarkus-random-number-generator/src/main/java/ch/phoenixtechnologies/quarkus/commons/random/RandomProviderImpl.java similarity index 90% rename from quarkus-random-number-generator/src/main/java/ch/phoenix/oss/quarkus/commons/random/RandomProviderImpl.java rename to quarkus-random-number-generator/src/main/java/ch/phoenixtechnologies/quarkus/commons/random/RandomProviderImpl.java index f32e8d4..d4be20a 100644 --- a/quarkus-random-number-generator/src/main/java/ch/phoenix/oss/quarkus/commons/random/RandomProviderImpl.java +++ b/quarkus-random-number-generator/src/main/java/ch/phoenixtechnologies/quarkus/commons/random/RandomProviderImpl.java @@ -1,4 +1,4 @@ -package ch.phoenix.oss.quarkus.commons.random; +package ch.phoenixtechnologies.quarkus.commons.random; import io.quarkus.arc.DefaultBean; import jakarta.enterprise.context.ApplicationScoped; diff --git a/quarkus-random-number-generator/src/test/java/ch/phoenix/oss/quarkus/commons/random/RandomNumberGeneratorImplTest.java b/quarkus-random-number-generator/src/test/java/ch/phoenixtechnologies/quarkus/commons/random/RandomNumberGeneratorImplTest.java similarity index 98% rename from quarkus-random-number-generator/src/test/java/ch/phoenix/oss/quarkus/commons/random/RandomNumberGeneratorImplTest.java rename to quarkus-random-number-generator/src/test/java/ch/phoenixtechnologies/quarkus/commons/random/RandomNumberGeneratorImplTest.java index 973e19b..11d4a91 100644 --- a/quarkus-random-number-generator/src/test/java/ch/phoenix/oss/quarkus/commons/random/RandomNumberGeneratorImplTest.java +++ b/quarkus-random-number-generator/src/test/java/ch/phoenixtechnologies/quarkus/commons/random/RandomNumberGeneratorImplTest.java @@ -1,4 +1,4 @@ -package ch.phoenix.oss.quarkus.commons.random; +package ch.phoenixtechnologies.quarkus.commons.random; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; diff --git a/quarkus-random-number-generator/src/test/java/ch/phoenix/oss/quarkus/commons/random/RandomProviderImplTest.java b/quarkus-random-number-generator/src/test/java/ch/phoenixtechnologies/quarkus/commons/random/RandomProviderImplTest.java similarity index 97% rename from quarkus-random-number-generator/src/test/java/ch/phoenix/oss/quarkus/commons/random/RandomProviderImplTest.java rename to quarkus-random-number-generator/src/test/java/ch/phoenixtechnologies/quarkus/commons/random/RandomProviderImplTest.java index bd01e75..7b84434 100644 --- a/quarkus-random-number-generator/src/test/java/ch/phoenix/oss/quarkus/commons/random/RandomProviderImplTest.java +++ b/quarkus-random-number-generator/src/test/java/ch/phoenixtechnologies/quarkus/commons/random/RandomProviderImplTest.java @@ -1,4 +1,4 @@ -package ch.phoenix.oss.quarkus.commons.random; +package ch.phoenixtechnologies.quarkus.commons.random; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; diff --git a/quarkus-table-generator/pom.xml b/quarkus-table-generator/pom.xml deleted file mode 100644 index e5ce9a1..0000000 --- a/quarkus-table-generator/pom.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - 4.0.0 - - - ch.phoenix.oss - quarkus-commons - 1.1.3-SNAPSHOT - - - quarkus-table-generator - jar - - - - - org.jacoco - jacoco-maven-plugin - ${jacoco-plugin.version} - - - jacoco-check - - check - - test - - ${project.build.directory}/jacoco-quarkus.exec - - - BUNDLE - - - INSTRUCTION - COVEREDRATIO - 1 - - - - - - - - - - - diff --git a/quarkus-table-generator/src/main/java/ch/phoenix/oss/quarkus/commons/table/TableGenerator.java b/quarkus-table-generator/src/main/java/ch/phoenix/oss/quarkus/commons/table/TableGenerator.java deleted file mode 100644 index 3a30730..0000000 --- a/quarkus-table-generator/src/main/java/ch/phoenix/oss/quarkus/commons/table/TableGenerator.java +++ /dev/null @@ -1,20 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.table; - -import java.util.List; - -public interface TableGenerator { - - /** - * Generates a Jira-style table from a list of records. - * Refer to notation - * - * @param records List of records to generate the table from - * @param headers Optional custom headers, list must match record field order and count. - * If null, field names are used as headers. - * @return String representing the records as a table in Jira notation - * @throws IllegalArgumentException If records are null or empty, if the type is not a Record. - * Also throws if custom headers are provided but the size does not match the record's field count - * @throws IllegalStateException if an error occurs while invoking a record's accessor - */ - String generateJiraTable(List records, List headers); -} diff --git a/quarkus-table-generator/src/main/java/ch/phoenix/oss/quarkus/commons/table/TableGeneratorImpl.java b/quarkus-table-generator/src/main/java/ch/phoenix/oss/quarkus/commons/table/TableGeneratorImpl.java deleted file mode 100644 index e05e3c4..0000000 --- a/quarkus-table-generator/src/main/java/ch/phoenix/oss/quarkus/commons/table/TableGeneratorImpl.java +++ /dev/null @@ -1,65 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.table; - -import jakarta.enterprise.context.ApplicationScoped; -import java.lang.reflect.RecordComponent; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -@ApplicationScoped -class TableGeneratorImpl implements TableGenerator { - - @Override - public String generateJiraTable(List records, List headers) { - if (records == null || records.isEmpty()) { - throw new IllegalArgumentException("Records can't be null or empty"); - } - - Class recordClass = records.getFirst().getClass(); - if (!recordClass.isRecord()) { - throw new IllegalArgumentException("Only records are supported at the moment"); - } - - var components = recordClass.getRecordComponents(); - var columns = components.length; - - List headerRow; - if (headers == null) { - headerRow = Arrays.stream(components).map(RecordComponent::getName).toList(); - } else if (headers.size() == columns) { - headerRow = headers; - } else { - throw new IllegalArgumentException("Custom header count [%s] does not match actual number of columns [%s]" - .formatted(headers.size(), columns)); - } - - var dataRows = new ArrayList>(); - for (var record : records) { - var row = new ArrayList(columns); - for (var component : components) { - try { - var val = component.getAccessor().invoke(record); - row.add(val == null ? "" : val.toString()); - } catch (Exception e) { - throw new IllegalStateException( - "Unable to invoke accessor for component [%s] of class [%s]" - .formatted(component.getName(), recordClass.getName()), - e); - } - } - dataRows.add(row); - } - - var sb = new StringBuilder("||"); - headerRow.forEach(header -> sb.append(" ").append(header).append(" ||")); - sb.append("\n"); - for (var row : dataRows) { - sb.append("|"); - for (String cell : row) { - sb.append(" ").append(cell).append(" |"); - } - sb.append("\n"); - } - return sb.toString(); - } -} diff --git a/quarkus-table-generator/src/test/java/ch/phoenix/oss/quarkus/commons/table/TableGeneratorImplTest.java b/quarkus-table-generator/src/test/java/ch/phoenix/oss/quarkus/commons/table/TableGeneratorImplTest.java deleted file mode 100644 index 6f90dfe..0000000 --- a/quarkus-table-generator/src/test/java/ch/phoenix/oss/quarkus/commons/table/TableGeneratorImplTest.java +++ /dev/null @@ -1,106 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.table; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.params.provider.Arguments.arguments; - -import io.quarkus.test.junit.QuarkusTest; -import jakarta.inject.Inject; -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import java.util.List; -import java.util.stream.Stream; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -@QuarkusTest -class TableGeneratorImplTest { - - @Inject - TableGenerator tableGenerator; - - public record TestDto(String what, Instant instant, Double number) {} - - static Stream generateJiraTable() { - var dtos = List.of( - new TestDto("What", Instant.ofEpochMilli(123).truncatedTo(ChronoUnit.MILLIS), 2.0d), - new TestDto("SupDog", Instant.ofEpochMilli(124313425).truncatedTo(ChronoUnit.MILLIS), null), - new TestDto(null, null, 214534.134d), - new TestDto(null, null, null)); - return Stream.of( - arguments( - dtos, - List.of("What", "Instant", "SomeNumber"), - """ - || What || Instant || SomeNumber || - | What | 1970-01-01T00:00:00.123Z | 2.0 | - | SupDog | 1970-01-02T10:31:53.425Z | | - | | | 214534.134 | - | | | | - """), - arguments( - dtos, - null, - """ - || what || instant || number || - | What | 1970-01-01T00:00:00.123Z | 2.0 | - | SupDog | 1970-01-02T10:31:53.425Z | | - | | | 214534.134 | - | | | | - """)); - } - - @MethodSource - @ParameterizedTest - void generateJiraTable(List testDtos, List headers, String expected) { - var actual = tableGenerator.generateJiraTable(testDtos, headers); - assertThat(actual).as("Generated table should match expected value").isEqualTo(expected); - } - - @Test - void generateJiraTableWhenRecordsIsNull() { - assertThatThrownBy(() -> tableGenerator.generateJiraTable(null, null)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("Records can't be null or empty"); - } - - @Test - void generateJiraTableWhenRecordsIsEmpty() { - assertThatThrownBy(() -> tableGenerator.generateJiraTable(List.of(), null)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("Records can't be null or empty"); - } - - @Test - void generateJiraTableWhenNotRecord() { - var notARecord = List.of("just a string"); - assertThatThrownBy(() -> tableGenerator.generateJiraTable(notARecord, null)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("Only records are supported"); - } - - @Test - void generateJiraTableWhenCustomHeaderWrongSize() { - var dtos = List.of(new TestDto("foo", Instant.now(), 1.2d)); - assertThatThrownBy(() -> tableGenerator.generateJiraTable(dtos, List.of("One", "Two"))) - .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("Custom header count [2] does not match actual number of columns [3]"); - } - - public record EvilRecord(String value) { - @Override - public String value() { - throw new RuntimeException("Accessor failure!"); - } - } - - @Test - void generateJiraTableWhenAccessorThrows() { - var list = List.of(new EvilRecord("hi")); - assertThatThrownBy(() -> tableGenerator.generateJiraTable(list, null)) - .isInstanceOf(IllegalStateException.class) - .hasMessageContaining("Unable to invoke accessor"); - } -} diff --git a/quarkus-tracing-service/pom.xml b/quarkus-tracing-service/pom.xml deleted file mode 100644 index 0e5cb86..0000000 --- a/quarkus-tracing-service/pom.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - 4.0.0 - - - ch.phoenix.oss - quarkus-commons - 1.1.3-SNAPSHOT - - - quarkus-tracing-service - jar - - - - io.quarkus - quarkus-rest-jackson - - - io.quarkus - quarkus-opentelemetry - - - io.quarkus - quarkus-security - - - io.quarkus - quarkus-elytron-security-properties-file - test - - - io.quarkus - quarkus-config-yaml - test - - - io.rest-assured - rest-assured - test - - - - - - - org.jacoco - jacoco-maven-plugin - ${jacoco-plugin.version} - - - jacoco-check - - check - - test - - ${project.build.directory}/jacoco-quarkus.exec - - - BUNDLE - - - INSTRUCTION - COVEREDRATIO - 0.95 - - - - - - - - - - - - diff --git a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/LowerCaseStringConverter.java b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/LowerCaseStringConverter.java deleted file mode 100644 index ede1518..0000000 --- a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/LowerCaseStringConverter.java +++ /dev/null @@ -1,10 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.tracing; - -import org.eclipse.microprofile.config.spi.Converter; - -public class LowerCaseStringConverter implements Converter { - @Override - public String convert(String value) throws IllegalArgumentException, NullPointerException { - return value.toLowerCase(); - } -} diff --git a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingConfiguration.java b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingConfiguration.java deleted file mode 100644 index dc05e6d..0000000 --- a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingConfiguration.java +++ /dev/null @@ -1,58 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.tracing; - -import io.smallrye.config.ConfigMapping; -import io.smallrye.config.WithConverter; -import io.smallrye.config.WithDefault; -import jakarta.ws.rs.core.HttpHeaders; -import java.util.Optional; -import java.util.Set; - -@ConfigMapping(prefix = "phoenix-oss.tracing") -public interface TracingConfiguration { - - RequestFilterConfiguration requestFilter(); - - interface RequestFilterConfiguration { - - Headers headers(); - - interface Headers { - - Set DEFAULT_REDACTED = Set.of(HttpHeaders.AUTHORIZATION.toLowerCase()); - - /** - * Optional set of headers to redact when tracing. By default, redacts - * the 'Authorization' header. - * - * @return the set of headers to be redacted - */ - Optional> redact(); - } - - Path path(); - - interface Path { - - @WithDefault("false") - boolean includeRaw(); - } - - Query query(); - - interface Query { - - Set DEFAULT_REDACTED = Set.of("access_token", "refresh_token", "apikey"); - - @WithDefault("false") - boolean includeRaw(); - - /** - * Optional set of query params to redact when tracing. By default, redacts - * the following params: 'access_token', 'refresh_token' and 'apikey'. - * - * @return the set of query params to be redacted - */ - Optional> redact(); - } - } -} diff --git a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingConstants.java b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingConstants.java deleted file mode 100644 index 7022a22..0000000 --- a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingConstants.java +++ /dev/null @@ -1,18 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.tracing; - -public class TracingConstants { - - public static final String ACTOR = "actor"; - public static final String ANONYMOUS = "anonymous"; - public static final String REQUEST_ROUTE = "request.route"; - public static final String REQUEST_METHOD = "request.method"; - public static final String REQUEST_PATH_RAW = "request.path.raw"; - public static final String REQUEST_PATH_PARAMS = "request.path.params"; - public static final String REQUEST_QUERY_RAW = "request.query.raw"; - public static final String REQUEST_QUERY_PARAMS = "request.query.params"; - public static final String REQUEST_HEADERS = "request.headers"; - public static final String REQUEST_CLIENT_IP = "request.client.ip"; - public static final String SCHEDULER_JOB_NAME = "scheduler.job.name"; - - private TracingConstants() {} -} diff --git a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingRequestFilter.java b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingRequestFilter.java deleted file mode 100644 index 7bb2427..0000000 --- a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingRequestFilter.java +++ /dev/null @@ -1,151 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.tracing; - -import io.quarkus.arc.Unremovable; -import io.quarkus.logging.Log; -import io.quarkus.security.identity.SecurityIdentity; -import io.vertx.ext.web.RoutingContext; -import jakarta.inject.Inject; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.container.ContainerRequestContext; -import jakarta.ws.rs.container.ResourceInfo; -import java.util.List; -import org.jboss.resteasy.reactive.server.ServerRequestFilter; - -@Unremovable -public class TracingRequestFilter { - - private static final String REDACTED_VALUE = "********"; - - private final RoutingContext routingContext; - private final TracingService tracingService; - private final SecurityIdentity securityIdentity; - private final TracingConfiguration configuration; - - @Inject - public TracingRequestFilter( - RoutingContext routingContext, - TracingService tracingService, - SecurityIdentity securityIdentity, - TracingConfiguration configuration) { - this.routingContext = routingContext; - this.tracingService = tracingService; - this.securityIdentity = securityIdentity; - this.configuration = configuration; - } - - @ServerRequestFilter - public void filter(ContainerRequestContext requestContext, ResourceInfo resourceInfo) { - if (securityIdentity.isAnonymous()) { - tracingService.trace(TracingConstants.ACTOR, TracingConstants.ANONYMOUS); - } else { - tracingService.trace( - TracingConstants.ACTOR, securityIdentity.getPrincipal().getName()); - } - - var method = requestContext.getMethod(); - tracingService.trace(TracingConstants.REQUEST_METHOD, method); - - var routePattern = getRoutePattern(resourceInfo); - tracingService.trace(TracingConstants.REQUEST_ROUTE, routePattern); - - var uriInfo = requestContext.getUriInfo(); - uriInfo.getPathParameters() - .forEach((key, value) -> - tracingService.trace(TracingConstants.REQUEST_PATH_PARAMS + '.' + key, joinStrings(value))); - - if (configuration.requestFilter().path().includeRaw()) { - tracingService.trace( - TracingConstants.REQUEST_PATH_RAW, uriInfo.getAbsolutePath().getRawPath()); - } - - var redactedHeaders = configuration - .requestFilter() - .headers() - .redact() - .orElse(TracingConfiguration.RequestFilterConfiguration.Headers.DEFAULT_REDACTED); - - requestContext.getHeaders().forEach((key, value) -> { - var lowerCaseKey = key.toLowerCase(); - var property = TracingConstants.REQUEST_HEADERS + '.' + lowerCaseKey; - if (redactedHeaders.contains(lowerCaseKey)) { - tracingService.trace(property, REDACTED_VALUE); - } else { - tracingService.trace(property, joinStrings(value)); - } - }); - - var redactedQueryParams = configuration - .requestFilter() - .query() - .redact() - .orElse(TracingConfiguration.RequestFilterConfiguration.Query.DEFAULT_REDACTED); - - uriInfo.getQueryParameters().forEach((key, value) -> { - var lowerCaseKey = key.toLowerCase(); - var property = TracingConstants.REQUEST_QUERY_PARAMS + '.' + lowerCaseKey; - - if (redactedQueryParams.contains(lowerCaseKey)) { - tracingService.trace(property, REDACTED_VALUE); - } else { - tracingService.trace(property, joinStrings(value)); - } - }); - - if (configuration.requestFilter().query().includeRaw()) { - var rawQuery = uriInfo.getRequestUri().getRawQuery(); - if (rawQuery != null && !rawQuery.isBlank()) { - tracingService.trace(TracingConstants.REQUEST_QUERY_RAW, rawQuery); - } - } - - tracingService.trace( - TracingConstants.REQUEST_CLIENT_IP, - routingContext.request().connection().remoteAddress(true).hostAddress()); - - Log.debugf("Incoming request: %s %s", method, uriInfo.getAbsolutePath().getRawPath()); - } - - private static String joinStrings(List value) { - return String.join(", ", value); - } - - private String getRoutePattern(ResourceInfo resourceInfo) { - String classPath = getPathValue(resourceInfo.getResourceClass().getAnnotation(Path.class)); - String methodPath = getPathValue(resourceInfo.getResourceMethod().getAnnotation(Path.class)); - - if (!classPath.isEmpty()) { - if (methodPath.isEmpty()) { - return "/" + classPath; - } else { - return "/" + classPath + "/" + methodPath; - } - } else { - if (methodPath.isEmpty()) { - return "/"; - } else { - return "/" + methodPath; - } - } - } - - private static String getPathValue(Path path) { - if (path == null) { - return ""; - } - return trimSlashes(path.value()); - } - - private static String trimSlashes(String segment) { - if (segment.isEmpty() || "/".equals(segment)) { - return ""; - } - - // Assuming that it's not possible for a segment to contain //, - // thus it's possible to avoid extra ifs and whiles, as well - // as the use of regexes - int start = (segment.charAt(0) == '/') ? 1 : 0; - int end = (segment.charAt(segment.length() - 1) == '/') ? segment.length() - 1 : segment.length(); - - return segment.substring(start, end); - } -} diff --git a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingService.java b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingService.java deleted file mode 100644 index 812867d..0000000 --- a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingService.java +++ /dev/null @@ -1,24 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.tracing; - -public interface TracingService { - - void clearAll(); - - void trace(String key, Object value); - - String getActor(); - - String getRequestPathRaw(); - - String getRequestMethod(); - - String getRequestId(); - - String getTraceId(); - - String getSpanId(); - - String getClientIp(); - - String getSchedulerJob(); -} diff --git a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImpl.java b/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImpl.java deleted file mode 100644 index d46f684..0000000 --- a/quarkus-tracing-service/src/main/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImpl.java +++ /dev/null @@ -1,69 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.tracing; - -import io.opentelemetry.api.trace.Span; -import io.quarkus.arc.DefaultBean; -import io.quarkus.logging.Log; -import jakarta.enterprise.context.ApplicationScoped; -import org.jboss.logging.MDC; - -@DefaultBean -@ApplicationScoped -class TracingServiceImpl implements TracingService { - - private final Span span; - - TracingServiceImpl(Span span) { - this.span = span; - } - - @Override - public void clearAll() { - MDC.clear(); - } - - @Override - public void trace(final String key, final Object value) { - Log.tracef("tracing key=%s value=%s", key, value); - MDC.put(key, value); - } - - @Override - public String getActor() { - return (String) MDC.get(TracingConstants.ACTOR); - } - - @Override - public String getRequestPathRaw() { - return (String) MDC.get(TracingConstants.REQUEST_PATH_RAW); - } - - @Override - public String getRequestMethod() { - return (String) MDC.get(TracingConstants.REQUEST_METHOD); - } - - @Override - public String getRequestId() { - return (String) MDC.get(TracingConstants.REQUEST_HEADERS + ".x-request-id"); - } - - @Override - public String getTraceId() { - return span.getSpanContext().getTraceId(); - } - - @Override - public String getSpanId() { - return span.getSpanContext().getSpanId(); - } - - @Override - public String getClientIp() { - return (String) MDC.get(TracingConstants.REQUEST_CLIENT_IP); - } - - @Override - public String getSchedulerJob() { - return (String) MDC.get(TracingConstants.SCHEDULER_JOB_NAME); - } -} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/ActorTest.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/ActorTest.java deleted file mode 100644 index 8ab52eb..0000000 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/ActorTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.tracing; - -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.startsWith; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; - -import io.quarkus.test.junit.QuarkusTest; -import io.quarkus.test.junit.mockito.InjectSpy; -import io.restassured.RestAssured; -import io.restassured.http.ContentType; -import org.junit.jupiter.api.Test; - -@QuarkusTest -class ActorTest { - - @InjectSpy - TracingService tracingService; - - @Test - void getAuthenticated() { - var route = "/authenticated"; - RestAssured.given() - .auth() - .basic("jon", "doe") - .accept(ContentType.TEXT) - .when() - .get(route) - .then() - .statusCode(200); - - verify(tracingService).trace("actor", "jon"); - verify(tracingService).trace("request.method", "GET"); - verify(tracingService).trace("request.route", route); - verify(tracingService).trace("request.headers.accept", "text/plain"); - verify(tracingService).trace("request.headers.accept-encoding", "gzip,deflate"); - verify(tracingService).trace("request.headers.authorization", "********"); - verify(tracingService).trace("request.headers.connection", "Keep-Alive"); - verify(tracingService).trace(eq("request.headers.host"), startsWith("localhost:")); - verify(tracingService).trace(eq("request.headers.user-agent"), startsWith("Apache-HttpClient")); - verify(tracingService).trace("request.client.ip", "127.0.0.1"); - verifyNoMoreInteractions(tracingService); - } -} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/QueryParamTest.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/QueryParamTest.java deleted file mode 100644 index 10b3894..0000000 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/QueryParamTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.tracing; - -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.startsWith; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; - -import io.quarkus.test.junit.QuarkusTest; -import io.quarkus.test.junit.mockito.InjectSpy; -import io.restassured.RestAssured; -import io.restassured.http.ContentType; -import org.junit.jupiter.api.Test; - -@QuarkusTest -class QueryParamTest { - - @InjectSpy - TracingService tracingService; - - @Test - void traceQueryParams() { - var route = "/authenticated"; - RestAssured.given() - .auth() - .basic("jon", "doe") - .accept(ContentType.TEXT) - .header("X-SOMETHING-ELSE", "whatever") - .queryParam("access_token", "api123") - .queryParam("refresh_token", "refresh123") - .queryParam("apikey", "apikey123") - .queryParam("grant_type", "authorization_code") - .when() - .get(route) - .then() - .statusCode(200); - - verify(tracingService).trace("actor", "jon"); - verify(tracingService).trace("request.method", "GET"); - verify(tracingService).trace("request.route", route); - verify(tracingService).trace("request.headers.accept", "text/plain"); - verify(tracingService).trace("request.headers.accept-encoding", "gzip,deflate"); - verify(tracingService).trace("request.headers.authorization", "********"); - verify(tracingService).trace("request.headers.connection", "Keep-Alive"); - verify(tracingService).trace(eq("request.headers.host"), startsWith("localhost:")); - verify(tracingService).trace(eq("request.headers.user-agent"), startsWith("Apache-HttpClient")); - verify(tracingService).trace("request.headers.x-something-else", "whatever"); - verify(tracingService).trace("request.query.params.access_token", "********"); - verify(tracingService).trace("request.query.params.refresh_token", "********"); - verify(tracingService).trace("request.query.params.apikey", "********"); - verify(tracingService).trace("request.query.params.grant_type", "authorization_code"); - verify(tracingService).trace("request.client.ip", "127.0.0.1"); - verifyNoMoreInteractions(tracingService); - } -} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RawPathTest.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RawPathTest.java deleted file mode 100644 index e3579ba..0000000 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RawPathTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.tracing; - -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.startsWith; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; - -import io.quarkus.test.junit.QuarkusTest; -import io.quarkus.test.junit.TestProfile; -import io.quarkus.test.junit.mockito.InjectSpy; -import io.restassured.RestAssured; -import io.restassured.http.ContentType; -import org.junit.jupiter.api.Test; - -@QuarkusTest -@TestProfile(Test2Profile.class) -class RawPathTest { - - @InjectSpy - TracingService tracingService; - - @Test - void getWithRawPath() { - var route = "/no-leading-and-trailing/{param}/{param2}"; - RestAssured.given() - .accept(ContentType.TEXT) - .when() - .get(route, 1, 2) - .then() - .statusCode(200); - - verify(tracingService).trace("actor", "anonymous"); - verify(tracingService).trace("request.method", "GET"); - verify(tracingService).trace("request.route", route); - verify(tracingService).trace("request.path.params.param", "1"); - verify(tracingService).trace("request.path.params.param2", "2"); - verify(tracingService).trace("request.path.raw", "/no-leading-and-trailing/1/2"); - verify(tracingService).trace("request.headers.accept", "text/plain"); - verify(tracingService).trace("request.headers.accept-encoding", "gzip,deflate"); - verify(tracingService).trace("request.headers.connection", "Keep-Alive"); - verify(tracingService).trace(eq("request.headers.host"), startsWith("localhost:")); - verify(tracingService).trace(eq("request.headers.user-agent"), startsWith("Apache-HttpClient")); - verify(tracingService).trace("request.client.ip", "127.0.0.1"); - verifyNoMoreInteractions(tracingService); - } -} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RedactedTest.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RedactedTest.java deleted file mode 100644 index c928917..0000000 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RedactedTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.tracing; - -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.startsWith; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; - -import io.quarkus.test.junit.QuarkusTest; -import io.quarkus.test.junit.TestProfile; -import io.quarkus.test.junit.mockito.InjectSpy; -import io.restassured.RestAssured; -import io.restassured.http.ContentType; -import org.junit.jupiter.api.Test; - -@QuarkusTest -@TestProfile(Test2Profile.class) -class RedactedTest { - - @InjectSpy - TracingService tracingService; - - @Test - void traceRedactedValues() { - var route = "/authenticated"; - RestAssured.given() - .auth() - .basic("jon", "doe") - .accept(ContentType.TEXT) - .header("X-SOMETHING-ELSE", "whatever") - .queryParam("access_token", "api123") - .queryParam("refresh_token", "refresh123") - .queryParam("apikey", "apikey123") - .queryParam("grant_type", "authorization_code") - .when() - .get(route) - .then() - .statusCode(200); - - verify(tracingService).trace("actor", "jon"); - verify(tracingService).trace("request.method", "GET"); - verify(tracingService).trace("request.route", route); - verify(tracingService).trace("request.path.raw", route); - verify(tracingService).trace("request.headers.accept", "text/plain"); - verify(tracingService).trace("request.headers.accept-encoding", "gzip,deflate"); - verify(tracingService).trace("request.headers.authorization", "********"); - verify(tracingService).trace("request.headers.connection", "Keep-Alive"); - verify(tracingService).trace(eq("request.headers.host"), startsWith("localhost:")); - verify(tracingService).trace(eq("request.headers.user-agent"), startsWith("Apache-HttpClient")); - verify(tracingService).trace("request.headers.x-something-else", "********"); - verify(tracingService).trace("request.query.params.access_token", "********"); - verify(tracingService).trace("request.query.params.refresh_token", "refresh123"); - verify(tracingService).trace("request.query.params.apikey", "apikey123"); - verify(tracingService).trace("request.query.params.grant_type", "authorization_code"); - verify(tracingService) - .trace( - "request.query.raw", - "access_token=api123&refresh_token=refresh123&apikey=apikey123&grant_type=authorization_code"); - verify(tracingService).trace("request.client.ip", "127.0.0.1"); - verifyNoMoreInteractions(tracingService); - } -} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RoutePatternTest.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RoutePatternTest.java deleted file mode 100644 index 156c0a4..0000000 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/RoutePatternTest.java +++ /dev/null @@ -1,87 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.tracing; - -import static org.junit.jupiter.params.provider.Arguments.arguments; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.startsWith; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; - -import io.quarkus.test.junit.QuarkusTest; -import io.quarkus.test.junit.mockito.InjectSpy; -import io.restassured.RestAssured; -import io.restassured.http.ContentType; -import java.util.Map; -import java.util.stream.Stream; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -@QuarkusTest -class RoutePatternTest { - - @InjectSpy - TracingService tracingService; - - static Stream get() { - return Stream.of( - arguments("/", Map.of()), - arguments("/leading-and-no-trailing", Map.of()), - arguments("/leading/{param}/{param2}", Map.of("param", "1", "param2", "2")), - arguments("/{param}/{param2}/trailing", Map.of("param", "1", "param2", "2")), - arguments("/leading-and-no-trailing/{param}", Map.of("param", "1")), - arguments("/leading-and-no-trailing/{param}/{param2}", Map.of("param", "1", "param2", "2")), - arguments("/leading-and-trailing", Map.of()), - arguments("/leading-and-trailing/{param}", Map.of("param", "1")), - arguments("/leading-and-trailing/{param}/{param2}", Map.of("param", "1", "param2", "2")), - arguments("/no-leading-and-no-trailing", Map.of()), - arguments("/no-leading-and-no-trailing/{param}", Map.of("param", "1")), - arguments("/no-leading-and-no-trailing/{param}/{param2}", Map.of("param", "1", "param2", "2")), - arguments("/no-leading-and-trailing", Map.of()), - arguments("/no-leading-and-trailing/{param}", Map.of("param", "1")), - arguments("/no-leading-and-trailing/{param}/{param2}", Map.of("param", "1", "param2", "2"))); - } - - @MethodSource - @ParameterizedTest - void get(String route, Map pathParams) { - RestAssured.given() - .accept(ContentType.TEXT) - .when() - .get(route, pathParams) - .then() - .statusCode(200); - - verify(tracingService).trace("actor", "anonymous"); - verify(tracingService).trace("request.method", "GET"); - verify(tracingService).trace("request.route", route); - pathParams.forEach((key, value) -> verify(tracingService).trace("request.path.params." + key, value)); - verify(tracingService).trace("request.headers.accept", "text/plain"); - verify(tracingService).trace("request.headers.accept-encoding", "gzip,deflate"); - verify(tracingService).trace("request.headers.connection", "Keep-Alive"); - verify(tracingService).trace(eq("request.headers.host"), startsWith("localhost:")); - verify(tracingService).trace(eq("request.headers.user-agent"), startsWith("Apache-HttpClient")); - verify(tracingService).trace("request.client.ip", "127.0.0.1"); - verifyNoMoreInteractions(tracingService); - } - - @Test - void postBlankResource() { - var route = "/"; - RestAssured.given().accept(ContentType.TEXT).when().post(route).then().statusCode(200); - - verify(tracingService).trace("actor", "anonymous"); - verify(tracingService).trace("request.method", "POST"); - verify(tracingService).trace("request.route", route); - verify(tracingService).trace("request.headers.accept", "text/plain"); - verify(tracingService).trace("request.headers.accept-encoding", "gzip,deflate"); - verify(tracingService).trace("request.headers.connection", "Keep-Alive"); - verify(tracingService).trace("request.headers.content-length", "0"); - verify(tracingService) - .trace("request.headers.content-type", "application/x-www-form-urlencoded; charset=ISO-8859-1"); - verify(tracingService).trace(eq("request.headers.host"), startsWith("localhost:")); - verify(tracingService).trace(eq("request.headers.user-agent"), startsWith("Apache-HttpClient")); - verify(tracingService).trace("request.client.ip", "127.0.0.1"); - verifyNoMoreInteractions(tracingService); - } -} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/Test2Profile.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/Test2Profile.java deleted file mode 100644 index f98dcff..0000000 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/Test2Profile.java +++ /dev/null @@ -1,11 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.tracing; - -import io.quarkus.test.junit.QuarkusTestProfile; - -public class Test2Profile implements QuarkusTestProfile { - - @Override - public String getConfigProfile() { - return "test2"; - } -} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImplTest.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImplTest.java deleted file mode 100644 index f728e14..0000000 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/TracingServiceImplTest.java +++ /dev/null @@ -1,98 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.tracing; - -import static org.assertj.core.api.Assertions.assertThat; - -import io.opentelemetry.api.trace.Span; -import io.opentelemetry.instrumentation.annotations.WithSpan; -import io.quarkus.test.junit.QuarkusTest; -import jakarta.inject.Inject; -import org.jboss.logging.MDC; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -@QuarkusTest -class TracingServiceImplTest { - - @Inject - TracingService tracingService; - - @Inject - Span span; - - @BeforeEach - void setUp() { - MDC.clear(); - } - - @Test - void getActor() { - tracingService.trace("actor", "abc"); - assertThat(tracingService.getActor()) - .as("Actor should match expected value") - .isEqualTo("abc"); - } - - @Test - void getRequestPathRaw() { - tracingService.trace("request.path.raw", "/foo/bar"); - assertThat(tracingService.getRequestPathRaw()) - .as("Request Path Raw should match expected value") - .isEqualTo("/foo/bar"); - } - - @Test - void getRequestMethod() { - tracingService.trace("request.method", "GET"); - assertThat(tracingService.getRequestMethod()) - .as("Request Method should match expected value") - .isEqualTo("GET"); - } - - @Test - void getRequestId() { - tracingService.trace("request.headers.x-request-id", "ba458367-bfeb-46ba-87da-50b9343be8f9"); - assertThat(tracingService.getRequestId()) - .as("Request Id should match expected value") - .isEqualTo("ba458367-bfeb-46ba-87da-50b9343be8f9"); - } - - @Test - @WithSpan - void getTraceId() { - assertThat(tracingService.getTraceId()) - .as("Request Trace Id should match expected value") - .isEqualTo(span.getSpanContext().getTraceId()); - } - - @Test - @WithSpan - void getSpanId() { - assertThat(tracingService.getSpanId()) - .as("Request Span Id should match expected value") - .isEqualTo(span.getSpanContext().getSpanId()); - } - - @Test - void getClientIp() { - tracingService.trace("request.client.ip", "127.0.0.1"); - assertThat(tracingService.getClientIp()) - .as("Request Client Iü should match expected value") - .isEqualTo("127.0.0.1"); - } - - @Test - void getSchedulerJob() { - tracingService.trace("scheduler.job.name", "scheduler/abc"); - assertThat(tracingService.getSchedulerJob()) - .as("Scheduler Job Name should match expected value") - .isEqualTo("scheduler/abc"); - } - - @Test - void clearAll() { - tracingService.trace("aaa", "bbb"); - assertThat(MDC.get("aaa")).isEqualTo("bbb"); - tracingService.clearAll(); - assertThat(MDC.get("aaa")).isNull(); - } -} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/AuthenticatedResource.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/AuthenticatedResource.java deleted file mode 100644 index d18b967..0000000 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/AuthenticatedResource.java +++ /dev/null @@ -1,15 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.tracing.resource; - -import io.quarkus.security.Authenticated; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; - -@Authenticated -@Path("authenticated") -public class AuthenticatedResource { - - @GET - public String get() { - return "Hello user"; - } -} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/BlankResource.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/BlankResource.java deleted file mode 100644 index 04c5df9..0000000 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/BlankResource.java +++ /dev/null @@ -1,25 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.tracing.resource; - -import jakarta.annotation.security.PermitAll; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.POST; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.MediaType; - -@Path("") -@Produces(MediaType.TEXT_PLAIN) -public class BlankResource { - - @GET - @PermitAll - public String get() { - return "get"; - } - - @POST - @Path("") - public String post() { - return "post"; - } -} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/LeadingAndNoTrailingResource.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/LeadingAndNoTrailingResource.java deleted file mode 100644 index b03a7ae..0000000 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/LeadingAndNoTrailingResource.java +++ /dev/null @@ -1,29 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.tracing.resource; - -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.MediaType; - -@Path("/leading-and-no-trailing") -@Produces(MediaType.TEXT_PLAIN) -public class LeadingAndNoTrailingResource { - - @GET - @Path("") - public String root() { - return "root"; - } - - @GET - @Path("/{param}") - public String singleParam(String param) { - return param; - } - - @GET - @Path("/{param}/{param2}") - public String multiParam(String param, String param2) { - return param + "/" + param2; - } -} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/LeadingAndTrailingResource.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/LeadingAndTrailingResource.java deleted file mode 100644 index 1dbc175..0000000 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/LeadingAndTrailingResource.java +++ /dev/null @@ -1,29 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.tracing.resource; - -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.MediaType; - -@Path("/leading-and-trailing/") -@Produces(MediaType.TEXT_PLAIN) -public class LeadingAndTrailingResource { - - @GET - @Path("/") - public String root() { - return "root"; - } - - @GET - @Path("/{param}/") - public String singleParam(String param) { - return param; - } - - @GET - @Path("/{param}/{param2}/") - public String multiParam(String param, String param2) { - return param + "/" + param2; - } -} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/NoLeadingAndNoTrailingResource.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/NoLeadingAndNoTrailingResource.java deleted file mode 100644 index d75dade..0000000 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/NoLeadingAndNoTrailingResource.java +++ /dev/null @@ -1,29 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.tracing.resource; - -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.MediaType; - -@Path("no-leading-and-no-trailing") -@Produces(MediaType.TEXT_PLAIN) -public class NoLeadingAndNoTrailingResource { - - @GET - @Path("") - public String root() { - return "root"; - } - - @GET - @Path("{param}") - public String singleParam(String param) { - return param; - } - - @GET - @Path("{param}/{param2}") - public String multiParam(String param, String param2) { - return param + "/" + param2; - } -} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/NoLeadingAndTrailingResource.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/NoLeadingAndTrailingResource.java deleted file mode 100644 index 9c9805a..0000000 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/NoLeadingAndTrailingResource.java +++ /dev/null @@ -1,29 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.tracing.resource; - -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.MediaType; - -@Path("no-leading-and-trailing/") -@Produces(MediaType.TEXT_PLAIN) -public class NoLeadingAndTrailingResource { - - @GET - @Path("/") - public String root() { - return "root"; - } - - @GET - @Path("{param}/") - public String singleParam(String param) { - return param; - } - - @GET - @Path("{param}/{param2}/") - public String multiParam(String param, String param2) { - return param + "/" + param2; - } -} diff --git a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/SlashResource.java b/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/SlashResource.java deleted file mode 100644 index 8c8bdc7..0000000 --- a/quarkus-tracing-service/src/test/java/ch/phoenix/oss/quarkus/commons/tracing/resource/SlashResource.java +++ /dev/null @@ -1,23 +0,0 @@ -package ch.phoenix.oss.quarkus.commons.tracing.resource; - -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.MediaType; - -@Path("/") -@Produces(MediaType.TEXT_PLAIN) -public class SlashResource { - - @GET - @Path("/leading/{param}/{param2}") - public String doubleLeading(int param, int param2) { - return "leading/" + param + "/" + param2; - } - - @GET - @Path("{param}/{param2}/trailing/") - public String doubleTrailing(int param, int param2) { - return param + "/" + param2 + "/trailing"; - } -} diff --git a/quarkus-tracing-service/src/test/resources/application.yaml b/quarkus-tracing-service/src/test/resources/application.yaml deleted file mode 100644 index 3853f31..0000000 --- a/quarkus-tracing-service/src/test/resources/application.yaml +++ /dev/null @@ -1,38 +0,0 @@ -quarkus: - http: - test-port: 0 - log: - category: - "org.apache.http.wire": - level: DEBUG # set to DEBUG when RestAssured logs are necessary to understand test failures - otel: - traces: - exporter: none - security: - users: - embedded: - enabled: true - plain-text: true - users: - jon: doe - -"%test2": - quarkus: - log: - min-level: TRACE - category: - "ch.phoenix.oss.quarkus.commons.tracing": - level: TRACE - phoenix-oss: - tracing: - request-filter: - path: - include-raw: true - headers: - redact: - - AUTHORIZATION - - X-SOMETHING-ELSE - query: - include-raw: true - redact: - - ACCESS_TOKEN \ No newline at end of file diff --git a/quarkus-uuid-generator/pom.xml b/quarkus-uuid-generator/pom.xml index 059b254..4ab3542 100644 --- a/quarkus-uuid-generator/pom.xml +++ b/quarkus-uuid-generator/pom.xml @@ -1,11 +1,13 @@ - + 4.0.0 - ch.phoenix.oss + ch.phoenixtechnologies.quarkus quarkus-commons - 1.1.3-SNAPSHOT + 1.0.1-SNAPSHOT quarkus-uuid-generator diff --git a/quarkus-uuid-generator/src/main/java/ch/phoenix/oss/quarkus/commons/uuid/UUIDGenerator.java b/quarkus-uuid-generator/src/main/java/ch/phoenixtechnologies/quarkus/commons/uuid/UUIDGenerator.java similarity index 95% rename from quarkus-uuid-generator/src/main/java/ch/phoenix/oss/quarkus/commons/uuid/UUIDGenerator.java rename to quarkus-uuid-generator/src/main/java/ch/phoenixtechnologies/quarkus/commons/uuid/UUIDGenerator.java index d4df687..4310bc0 100644 --- a/quarkus-uuid-generator/src/main/java/ch/phoenix/oss/quarkus/commons/uuid/UUIDGenerator.java +++ b/quarkus-uuid-generator/src/main/java/ch/phoenixtechnologies/quarkus/commons/uuid/UUIDGenerator.java @@ -1,4 +1,4 @@ -package ch.phoenix.oss.quarkus.commons.uuid; +package ch.phoenixtechnologies.quarkus.commons.uuid; import java.util.Random; import java.util.UUID; diff --git a/quarkus-uuid-generator/src/main/java/ch/phoenix/oss/quarkus/commons/uuid/UUIDGeneratorImpl.java b/quarkus-uuid-generator/src/main/java/ch/phoenixtechnologies/quarkus/commons/uuid/UUIDGeneratorImpl.java similarity index 93% rename from quarkus-uuid-generator/src/main/java/ch/phoenix/oss/quarkus/commons/uuid/UUIDGeneratorImpl.java rename to quarkus-uuid-generator/src/main/java/ch/phoenixtechnologies/quarkus/commons/uuid/UUIDGeneratorImpl.java index 9f4a501..76b51b5 100644 --- a/quarkus-uuid-generator/src/main/java/ch/phoenix/oss/quarkus/commons/uuid/UUIDGeneratorImpl.java +++ b/quarkus-uuid-generator/src/main/java/ch/phoenixtechnologies/quarkus/commons/uuid/UUIDGeneratorImpl.java @@ -1,4 +1,4 @@ -package ch.phoenix.oss.quarkus.commons.uuid; +package ch.phoenixtechnologies.quarkus.commons.uuid; import com.fasterxml.uuid.Generators; import io.quarkus.arc.DefaultBean; diff --git a/quarkus-uuid-generator/src/test/java/ch/phoenix/oss/quarkus/commons/uuid/UUIDGeneratorImplTest.java b/quarkus-uuid-generator/src/test/java/ch/phoenixtechnologies/quarkus/commons/uuid/UUIDGeneratorImplTest.java similarity index 98% rename from quarkus-uuid-generator/src/test/java/ch/phoenix/oss/quarkus/commons/uuid/UUIDGeneratorImplTest.java rename to quarkus-uuid-generator/src/test/java/ch/phoenixtechnologies/quarkus/commons/uuid/UUIDGeneratorImplTest.java index 25f6b02..c652791 100644 --- a/quarkus-uuid-generator/src/test/java/ch/phoenix/oss/quarkus/commons/uuid/UUIDGeneratorImplTest.java +++ b/quarkus-uuid-generator/src/test/java/ch/phoenixtechnologies/quarkus/commons/uuid/UUIDGeneratorImplTest.java @@ -1,4 +1,4 @@ -package ch.phoenix.oss.quarkus.commons.uuid; +package ch.phoenixtechnologies.quarkus.commons.uuid; import static org.assertj.core.api.AssertionsForClassTypes.assertThat;