From d6201f2b363198dcab88a48c6e1196b793c06f8c Mon Sep 17 00:00:00 2001 From: Ramon Ramirez Date: Tue, 20 Jan 2026 17:47:24 -0400 Subject: [PATCH] first commit --- .dockerignore | 5 + .gitignore | 45 ++ .mvn/wrapper/maven-wrapper.properties | 3 + README.md | 54 ++ mvnw | 295 +++++++++++ mvnw.cmd | 189 +++++++ pom.xml | 156 ++++++ scripts/native/Dockerfile | 31 ++ ...on-request-1.0-native-quarkus-jdk17-runner | Bin 0 -> 65478592 bytes src/main/docker/Dockerfile.jvm | 98 ++++ src/main/docker/Dockerfile.legacy-jar | 94 ++++ src/main/docker/Dockerfile.native | 29 ++ src/main/docker/Dockerfile.native-micro | 32 ++ .../application/helper/MessageHelper.java | 234 +++++++++ .../service/HttpClientService.java | 466 ++++++++++++++++++ .../usecase/HttpClientUseCase.java | 18 + .../domain/exception/BaseApiException.java | 21 + .../domain/exception/BusinessException.java | 11 + .../exception/HttpApiResponseException.java | 20 + .../domain/exception/HttpClientException.java | 11 + .../exception/HttpStatusCodeException.java | 320 ++++++++++++ .../common/domain/model/ApiPrivateError.java | 16 + .../domain/model/ApiPrivateResponse.java | 17 + .../common/domain/model/ApiResponse.java | 18 + .../common/domain/model/BankService.java | 16 + .../banesco/common/domain/model/Device.java | 17 + .../common/domain/model/DomainConfig.java | 13 + .../banesco/common/domain/model/Either.java | 33 ++ .../common/domain/model/ErrorMapping.java | 22 + .../common/domain/model/HttpRequest.java | 223 +++++++++ .../common/domain/model/Identifier.java | 14 + .../banesco/common/domain/model/Location.java | 14 + .../domain/model/PartyIdentification.java | 14 + .../banesco/common/domain/model/Payee.java | 16 + .../banesco/common/domain/model/Payer.java | 16 + .../common/domain/model/StatusResponse.java | 15 + .../common/domain/model/TimeoutConfig.java | 13 + .../common/domain/model/TypeBuilder.java | 67 +++ .../infrastructure/config/MessagesConfig.java | 32 ++ .../config/RestClientConfig.java | 81 +++ .../context/RequestContext.java | 24 + .../filter/RequestIdFilter.java | 104 ++++ .../instruction/domain/model/Instruction.java | 16 + .../domain/model/InstructionPurposeType.java | 5 + .../PaymentInitiationRequestService.java | 144 ++++++ .../application/usecase/DomainUseCase.java | 11 + .../PaymentInitiationRequestUseCase.java | 10 + .../PaymentInitiationRequestRequest.java | 109 ++++ .../PaymentInitiationRequestResponse.java | 18 + .../domain/model/DocumentService.java | 15 + .../model/PaymentInitiationTransaction.java | 15 + ...ntInitiationTransactionInstanceRecord.java | 23 + .../domain/model/PaymentTransactionType.java | 5 + .../DomPaymentInitiationRequestClient.java | 85 ++++ .../PaymentInitiationRequestResource.java | 274 ++++++++++ .../usecase/SecurityTraceUseCase.java | 14 + .../dto/request/SecurityTraceRequest.java | 134 +++++ .../dto/response/SecurityTraceResponse.java | 14 + .../domain/model/SecurityTraceConfig.java | 16 + .../domain/model/SecurityTraceObject.java | 20 + .../client/SecurityTraceClient.java | 165 +++++++ .../usecase/ServiceStatusUseCase.java | 10 + .../dto/request/ServiceStatusRequest.java | 19 + .../dto/response/ServiceStatusResponse.java | 14 + .../domain/model/ServiceStatusConfig.java | 16 + .../client/ServiceStatusClient.java | 75 +++ .../transaction/domain/model/Transaction.java | 18 + .../domain/model/TransactionDateTime.java | 15 + .../domain/model/TransactionDateTimeType.java | 14 + src/main/resources/application-dev.yml | 22 + src/main/resources/application.yml | 41 ++ src/main/resources/configmap.yaml | 81 +++ 72 files changed, 4335 insertions(+) create mode 100644 .dockerignore create mode 100644 .gitignore create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100644 README.md create mode 100644 mvnw create mode 100644 mvnw.cmd create mode 100644 pom.xml create mode 100644 scripts/native/Dockerfile create mode 100644 scripts/native/file/bus-payment-initiation-request-1.0-native-quarkus-jdk17-runner create mode 100644 src/main/docker/Dockerfile.jvm create mode 100644 src/main/docker/Dockerfile.legacy-jar create mode 100644 src/main/docker/Dockerfile.native create mode 100644 src/main/docker/Dockerfile.native-micro create mode 100644 src/main/java/com/banesco/common/application/helper/MessageHelper.java create mode 100644 src/main/java/com/banesco/common/application/service/HttpClientService.java create mode 100644 src/main/java/com/banesco/common/application/usecase/HttpClientUseCase.java create mode 100644 src/main/java/com/banesco/common/domain/exception/BaseApiException.java create mode 100644 src/main/java/com/banesco/common/domain/exception/BusinessException.java create mode 100644 src/main/java/com/banesco/common/domain/exception/HttpApiResponseException.java create mode 100644 src/main/java/com/banesco/common/domain/exception/HttpClientException.java create mode 100644 src/main/java/com/banesco/common/domain/exception/HttpStatusCodeException.java create mode 100644 src/main/java/com/banesco/common/domain/model/ApiPrivateError.java create mode 100644 src/main/java/com/banesco/common/domain/model/ApiPrivateResponse.java create mode 100644 src/main/java/com/banesco/common/domain/model/ApiResponse.java create mode 100644 src/main/java/com/banesco/common/domain/model/BankService.java create mode 100644 src/main/java/com/banesco/common/domain/model/Device.java create mode 100644 src/main/java/com/banesco/common/domain/model/DomainConfig.java create mode 100644 src/main/java/com/banesco/common/domain/model/Either.java create mode 100644 src/main/java/com/banesco/common/domain/model/ErrorMapping.java create mode 100644 src/main/java/com/banesco/common/domain/model/HttpRequest.java create mode 100644 src/main/java/com/banesco/common/domain/model/Identifier.java create mode 100644 src/main/java/com/banesco/common/domain/model/Location.java create mode 100644 src/main/java/com/banesco/common/domain/model/PartyIdentification.java create mode 100644 src/main/java/com/banesco/common/domain/model/Payee.java create mode 100644 src/main/java/com/banesco/common/domain/model/Payer.java create mode 100644 src/main/java/com/banesco/common/domain/model/StatusResponse.java create mode 100644 src/main/java/com/banesco/common/domain/model/TimeoutConfig.java create mode 100644 src/main/java/com/banesco/common/domain/model/TypeBuilder.java create mode 100644 src/main/java/com/banesco/common/infrastructure/config/MessagesConfig.java create mode 100644 src/main/java/com/banesco/common/infrastructure/config/RestClientConfig.java create mode 100644 src/main/java/com/banesco/common/infrastructure/context/RequestContext.java create mode 100644 src/main/java/com/banesco/common/infrastructure/filter/RequestIdFilter.java create mode 100644 src/main/java/com/banesco/module/instruction/domain/model/Instruction.java create mode 100644 src/main/java/com/banesco/module/instruction/domain/model/InstructionPurposeType.java create mode 100644 src/main/java/com/banesco/module/payment_initiation_request/application/service/PaymentInitiationRequestService.java create mode 100644 src/main/java/com/banesco/module/payment_initiation_request/application/usecase/DomainUseCase.java create mode 100644 src/main/java/com/banesco/module/payment_initiation_request/application/usecase/PaymentInitiationRequestUseCase.java create mode 100644 src/main/java/com/banesco/module/payment_initiation_request/domain/dto/request/PaymentInitiationRequestRequest.java create mode 100644 src/main/java/com/banesco/module/payment_initiation_request/domain/dto/response/PaymentInitiationRequestResponse.java create mode 100644 src/main/java/com/banesco/module/payment_initiation_request/domain/model/DocumentService.java create mode 100644 src/main/java/com/banesco/module/payment_initiation_request/domain/model/PaymentInitiationTransaction.java create mode 100644 src/main/java/com/banesco/module/payment_initiation_request/domain/model/PaymentInitiationTransactionInstanceRecord.java create mode 100644 src/main/java/com/banesco/module/payment_initiation_request/domain/model/PaymentTransactionType.java create mode 100644 src/main/java/com/banesco/module/payment_initiation_request/infrastructure/client/DomPaymentInitiationRequestClient.java create mode 100644 src/main/java/com/banesco/module/payment_initiation_request/infrastructure/resource/PaymentInitiationRequestResource.java create mode 100644 src/main/java/com/banesco/module/security_trace/application/usecase/SecurityTraceUseCase.java create mode 100644 src/main/java/com/banesco/module/security_trace/domain/dto/request/SecurityTraceRequest.java create mode 100644 src/main/java/com/banesco/module/security_trace/domain/dto/response/SecurityTraceResponse.java create mode 100644 src/main/java/com/banesco/module/security_trace/domain/model/SecurityTraceConfig.java create mode 100644 src/main/java/com/banesco/module/security_trace/domain/model/SecurityTraceObject.java create mode 100644 src/main/java/com/banesco/module/security_trace/infrastructure/client/SecurityTraceClient.java create mode 100644 src/main/java/com/banesco/module/service_status/application/usecase/ServiceStatusUseCase.java create mode 100644 src/main/java/com/banesco/module/service_status/domain/dto/request/ServiceStatusRequest.java create mode 100644 src/main/java/com/banesco/module/service_status/domain/dto/response/ServiceStatusResponse.java create mode 100644 src/main/java/com/banesco/module/service_status/domain/model/ServiceStatusConfig.java create mode 100644 src/main/java/com/banesco/module/service_status/infrastructure/client/ServiceStatusClient.java create mode 100644 src/main/java/com/banesco/module/transaction/domain/model/Transaction.java create mode 100644 src/main/java/com/banesco/module/transaction/domain/model/TransactionDateTime.java create mode 100644 src/main/java/com/banesco/module/transaction/domain/model/TransactionDateTimeType.java create mode 100644 src/main/resources/application-dev.yml create mode 100644 src/main/resources/application.yml create mode 100644 src/main/resources/configmap.yaml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..94810d0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +* +!target/*-runner +!target/*-runner.jar +!target/lib/* +!target/quarkus-app/* \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..91a800a --- /dev/null +++ b/.gitignore @@ -0,0 +1,45 @@ +#Maven +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +release.properties +.flattened-pom.xml + +# Eclipse +.project +.classpath +.settings/ +bin/ + +# IntelliJ +.idea +*.ipr +*.iml +*.iws + +# NetBeans +nb-configuration.xml + +# Visual Studio Code +.vscode +.factorypath + +# OSX +.DS_Store + +# Vim +*.swp +*.swo + +# patch +*.orig +*.rej + +# Local environment +.env + +# Plugin directory +/.quarkus/cli/plugins/ +# TLS Certificates +.certs/ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..8dea6c2 --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,3 @@ +wrapperVersion=3.3.4 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.12/apache-maven-3.9.12-bin.zip diff --git a/README.md b/README.md new file mode 100644 index 0000000..7b4a42b --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +# bus-payment-initiation-request + +This project uses Quarkus, the Supersonic Subatomic Java Framework. + +If you want to learn more about Quarkus, please visit its website: . + +## Running the application in dev mode + +You can run your application in dev mode that enables live coding using: + +```shell script +./mvnw quarkus:dev +``` + +> **_NOTE:_** Quarkus now ships with a Dev UI, which is available in dev mode only at . + +## Packaging and running the application + +The application can be packaged using: + +```shell script +./mvnw package +``` + +It produces the `quarkus-run.jar` file in the `target/quarkus-app/` directory. +Be aware that it’s not an _über-jar_ as the dependencies are copied into the `target/quarkus-app/lib/` directory. + +The application is now runnable using `java -jar target/quarkus-app/quarkus-run.jar`. + +If you want to build an _über-jar_, execute the following command: + +```shell script +./mvnw package -Dquarkus.package.jar.type=uber-jar +``` + +The application, packaged as an _über-jar_, is now runnable using `java -jar target/*-runner.jar`. + +## Creating a native executable + +You can create a native executable using: + +```shell script +./mvnw package -Dnative +``` + +Or, if you don't have GraalVM installed, you can run the native executable build in a container using: + +```shell script +./mvnw package -Dnative -Dquarkus.native.container-build=true +``` + +You can then execute your native executable with: `./target/bus-payment-initiation-request-1.0-native-quarkus-jdk17-runner` + +If you want to learn more about building native executables, please consult . diff --git a/mvnw b/mvnw new file mode 100644 index 0000000..bd8896b --- /dev/null +++ b/mvnw @@ -0,0 +1,295 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# 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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.4 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + 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" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + 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/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + 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 + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +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" + +clean || : +exec_maven "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..92450f9 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,189 @@ +<# : 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.4 +@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" diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..ed84ffc --- /dev/null +++ b/pom.xml @@ -0,0 +1,156 @@ + + + 4.0.0 + com.banesco + bus-payment-initiation-request + 1.0-native-quarkus-jdk17 + bus-payment-initiation-request + API Business - Read payment statuses of the file by ID + + + 17 + 17 + 17 + 3.14.1 + 1.18.2 + UTF-8 + UTF-8 + quarkus-bom + io.quarkus.platform + 3.22.3 + 1.18.42 + + + + + + ${quarkus.platform.group-id} + ${quarkus.platform.artifact-id} + ${quarkus.platform.version} + pom + import + + + ${quarkus.platform.group-id} + quarkus-camel-bom + ${quarkus.platform.version} + pom + import + + + + + + + io.quarkus + quarkus-rest + + + io.quarkus + quarkus-rest-jackson + + + io.quarkus + quarkus-hibernate-validator + + + io.quarkus + quarkus-smallrye-openapi + + + io.quarkus + quarkus-arc + + + io.quarkus + quarkus-config-yaml + + + io.quarkus + quarkus-rest-client + + + io.quarkus + quarkus-rest-client-jackson + + + io.quarkus + quarkus-smallrye-health + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + + + + org.eclipse.jkube + openshift-maven-plugin + ${compiler-plugin-openshift.version} + + + + + maven-volumen + /root/.m2 + + + + + + + ${quarkus.platform.group-id} + quarkus-maven-plugin + ${quarkus.platform.version} + true + + + + build + generate-code + native-image-agent + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${compiler-plugin.version} + + true + + + + + + + + native + + + native + + + + native + true + + + + + src/main/resources + + application-dev.yaml + application-local.yaml + + + + + + + \ No newline at end of file diff --git a/scripts/native/Dockerfile b/scripts/native/Dockerfile new file mode 100644 index 0000000..c3b34be --- /dev/null +++ b/scripts/native/Dockerfile @@ -0,0 +1,31 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode. +# It uses a micro base image, tuned for Quarkus native executables. +# It reduces the size of the resulting container image. +# Check https://quarkus.io/guides/quarkus-runtime-base-image for further information about this image. +# +# Before building the container image run: +# +# ./mvnw package -Dnative +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.native-micro -t quarkus/rec-legal-customer-product-directory . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/rec-legal-customer-product-directory +# +### +FROM quay.io/quarkus/quarkus-micro-image:2.0 +RUN mkdir -p /work +ENV TZ="America/Caracas" +ENV LANGUAGE='en_US:en' +VOLUME /tmp +COPY /file/*-runner /work/app +RUN chmod -R 775 /work +RUN ls -ltra /work/ +EXPOSE 8080 +WORKDIR /work/ + +ENTRYPOINT ["./app", "-Dquarkus.http.host=0.0.0.0"] \ No newline at end of file diff --git a/scripts/native/file/bus-payment-initiation-request-1.0-native-quarkus-jdk17-runner b/scripts/native/file/bus-payment-initiation-request-1.0-native-quarkus-jdk17-runner new file mode 100644 index 0000000000000000000000000000000000000000..b20ce90cd2ab836ef5ab8ad852cbadafbf48edbe GIT binary patch literal 65478592 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