From baf7bd1f3d61e7bbfd1fec4e85616230dc7c09c6 Mon Sep 17 00:00:00 2001 From: Christopher Broderick Date: Mon, 4 Aug 2025 10:35:34 +0100 Subject: [PATCH 01/20] Remove retired test resources --- .../OpenAS2A/config/DB/openas2.mv.db | Bin 16384 -> 0 bytes .../OpenAS2A/config/as2_certs.p12 | Bin 3616 -> 0 bytes .../OpenAS2A/config/commands.xml | 28 --- .../OpenAS2A/config/config.xml | 138 ------------ .../OpenAS2A/config/db_ddl.sql | 29 --- .../OpenAS2A/config/partnerships.xml | 74 ------ .../OpenAS2A/config/ssl_certs.jks | Bin 2279 -> 0 bytes .../OpenAS2B/config/DB/openas2.mv.db | Bin 16384 -> 0 bytes .../OpenAS2B/config/as2_certs.p12 | Bin 3616 -> 0 bytes .../OpenAS2B/config/commands.xml | 28 --- .../OpenAS2B/config/config.xml | 121 ---------- .../OpenAS2B/config/db_ddl.sql | 29 --- .../OpenAS2B/config/partnerships.xml | 70 ------ .../OpenAS2B/config/ssl_certs.jks | Bin 2279 -> 0 bytes .../MyCompany/config/as2_certs.p12 | Bin 4979 -> 0 bytes .../MyCompany/config/commands.xml | 32 --- .../MyCompany/config/config.xml | 211 ------------------ .../MyCompany/config/partnerships.xml | 95 -------- .../MyCompany/config/ssl_certs.jks | Bin 2279 -> 0 bytes Server/src/test/resources/as2_certs.p12 | Bin 0 -> 7652 bytes .../config/content_type_mappings.properties | 0 Server/src/test/resources/config/db_ddl.sql | 39 ++++ 22 files changed, 39 insertions(+), 855 deletions(-) delete mode 100644 Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/DB/openas2.mv.db delete mode 100644 Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/as2_certs.p12 delete mode 100644 Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/commands.xml delete mode 100644 Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/config.xml delete mode 100644 Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/db_ddl.sql delete mode 100644 Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/partnerships.xml delete mode 100644 Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/ssl_certs.jks delete mode 100644 Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/DB/openas2.mv.db delete mode 100644 Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/as2_certs.p12 delete mode 100644 Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/commands.xml delete mode 100644 Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/config.xml delete mode 100644 Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/db_ddl.sql delete mode 100644 Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/partnerships.xml delete mode 100644 Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/ssl_certs.jks delete mode 100644 Server/src/test/resources/SingleServerTest/MyCompany/config/as2_certs.p12 delete mode 100644 Server/src/test/resources/SingleServerTest/MyCompany/config/commands.xml delete mode 100644 Server/src/test/resources/SingleServerTest/MyCompany/config/config.xml delete mode 100644 Server/src/test/resources/SingleServerTest/MyCompany/config/partnerships.xml delete mode 100644 Server/src/test/resources/SingleServerTest/MyCompany/config/ssl_certs.jks create mode 100644 Server/src/test/resources/as2_certs.p12 rename Server/src/test/resources/{OpenAS2ServerTest/OpenAS2A => }/config/content_type_mappings.properties (100%) create mode 100644 Server/src/test/resources/config/db_ddl.sql diff --git a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/DB/openas2.mv.db b/Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/DB/openas2.mv.db deleted file mode 100644 index c6610637a474ad22bfff1be0fff9e8d500659b16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeHOPjlNu6qlUl4=DkL844$6>!wXIV~iwAvZPaGOHKr~Y$UlfCn3qJG*idUI8I35 z(qR}lz=00{cRmPQIPh6Gz;I%QrqW@o;nyjG^uc9v$ru z2LO-zcpN>zBQ26*MU;4Dm7y19fHFWCpbSt3ClmW^BWq>k38K4YM1}FoR0m=YnfHFWCco7VwL4Ll}$4Q9)FxbOKnpiprPBoF| zAV1X9(r7pwYa$#8;J8>)GleB) zMU)hQ!xFzDDO@G2#86NJIpC`NiV_EcByi#i4noWcRdFR2#VRMN%B|sOulztLADkSG zha+6>g=PD=-@h01kFgPq1Mln*mu4{I)AGIaL<8;-U;h@EU$%TWD-eS=wq zsZkb4S|O=OQi-H8NvkAPNUAOkf&*OkUnLo6nsn=Wego=H%FuNp7dxXisyAY*)R2qZxD*U0_xpf_v|_sTqJP4kH$ZB`J$Y7^|8q^g$5Ej`3% zT0WIZCqZA!XWDH71I?kei>Q3AZKc8{dR;{36LumGI!sXcyd|yX6FpTf42}tK($?D zm<_!Pit8@24Ab^3Zx^}dM_tpdPs?<7UC(U!`5T{a$g;{Q6<^Xt$rmM4_iMFA!#5g+ zp>rlDhCUcYZ_ffdj@5SjOX0aV!=5iLdv92d zS@*2AJ*UM@LE6e-mg_sFYufV^+vIap3i0dhuI){z%p@e0O=rF?(2%q>+dt6DwC+7q z71z_ft~*q^^)}32+w;BM&Qn7j-F6$mGIXGAz%;v}pDmbAt+sKM_yh)h>$Gim9yFg5 z$xtLycuu1kB=fi$FrPfDWy0XKI@zmk2NtjCpL?~swT^DBon~u4Ux`!e{-3SUWZ`EU z18CrQ=wp}?h(|TE*|xV`-)sA1gSm}vt~Im9VSTn><)RPG-KqAor#?LOVez-^sdwl1 zq+~nVx`S@7eGYpjYy(f+!C>Pv5DdTTIXY-MCG_#bq`fJnHc11}FT=b)g+H(026U*O zb*O7wu;rm-uX2$Ad%9)Uy$kiz4arZzPwrs8ccl^=mg9O`@NIK){r3WUyC1^9oK{5PA0lQdqQiZ@hd zUtVZBNnyaN4w#4uZLrcsQa-hunOOyLu_hpX_{ ewtp~32 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 BoyPzG diff --git a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/commands.xml b/Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/commands.xml deleted file mode 100644 index 6f095991..00000000 --- a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/commands.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/config.xml b/Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/config.xml deleted file mode 100644 index dae30c2d..00000000 --- a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/config.xml +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/db_ddl.sql b/Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/db_ddl.sql deleted file mode 100644 index 80fab0a4..00000000 --- a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/db_ddl.sql +++ /dev/null @@ -1,29 +0,0 @@ -set IGNORECASE TRUE; -DROP TABLE msg_metadata IF EXISTS; -CREATE TABLE msg_metadata ( - ID INTEGER default 0 NOT NULL AUTO_INCREMENT, - MSG_ID LONGVARCHAR NOT NULL, - MDN_ID LONGVARCHAR, - DIRECTION VARCHAR(25) , - IS_RESEND VARCHAR(1) DEFAULT 'N', - RESEND_COUNT INTEGER DEFAULT 0, - SENDER_ID VARCHAR(255) NOT NULL, - RECEIVER_ID VARCHAR(255) NOT NULL, - STATUS VARCHAR(255), - STATE VARCHAR(255), - SIGNATURE_ALGORITHM VARCHAR(255), - ENCRYPTION_ALGORITHM VARCHAR(255), - COMPRESSION VARCHAR(255), - FILE_NAME VARCHAR(255), - CONTENT_TYPE VARCHAR(255), - CONTENT_TRANSFER_ENCODING VARCHAR(255), - MDN_MODE VARCHAR(255), - MDN_RESPONSE LONGVARCHAR, - STATE_MSG LONGVARCHAR, - CREATE_DT TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - UPDATE_DT TIMESTAMP, - - PRIMARY KEY (ID) ); - -ALTER TABLE msg_metadata ADD CONSTRAINT MSG_ID_UNIQUE UNIQUE (MSG_ID); - diff --git a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/partnerships.xml b/Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/partnerships.xml deleted file mode 100644 index a9e4cb72..00000000 --- a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/partnerships.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/ssl_certs.jks b/Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/ssl_certs.jks deleted file mode 100644 index 52b4e7bdb373c5fcf47dbaaa2e7e63963b2ca1a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2279 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 diff --git a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/as2_certs.p12 b/Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/as2_certs.p12 deleted file mode 100644 index 13346b6aa22d287807cb42648c8de89c1f3e253b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3616 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 BoyPzG diff --git a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/commands.xml b/Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/commands.xml deleted file mode 100644 index 6f095991..00000000 --- a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/commands.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/config.xml b/Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/config.xml deleted file mode 100644 index 05314093..00000000 --- a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/config.xml +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/db_ddl.sql b/Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/db_ddl.sql deleted file mode 100644 index 80fab0a4..00000000 --- a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/db_ddl.sql +++ /dev/null @@ -1,29 +0,0 @@ -set IGNORECASE TRUE; -DROP TABLE msg_metadata IF EXISTS; -CREATE TABLE msg_metadata ( - ID INTEGER default 0 NOT NULL AUTO_INCREMENT, - MSG_ID LONGVARCHAR NOT NULL, - MDN_ID LONGVARCHAR, - DIRECTION VARCHAR(25) , - IS_RESEND VARCHAR(1) DEFAULT 'N', - RESEND_COUNT INTEGER DEFAULT 0, - SENDER_ID VARCHAR(255) NOT NULL, - RECEIVER_ID VARCHAR(255) NOT NULL, - STATUS VARCHAR(255), - STATE VARCHAR(255), - SIGNATURE_ALGORITHM VARCHAR(255), - ENCRYPTION_ALGORITHM VARCHAR(255), - COMPRESSION VARCHAR(255), - FILE_NAME VARCHAR(255), - CONTENT_TYPE VARCHAR(255), - CONTENT_TRANSFER_ENCODING VARCHAR(255), - MDN_MODE VARCHAR(255), - MDN_RESPONSE LONGVARCHAR, - STATE_MSG LONGVARCHAR, - CREATE_DT TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - UPDATE_DT TIMESTAMP, - - PRIMARY KEY (ID) ); - -ALTER TABLE msg_metadata ADD CONSTRAINT MSG_ID_UNIQUE UNIQUE (MSG_ID); - diff --git a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/partnerships.xml b/Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/partnerships.xml deleted file mode 100644 index bda57a57..00000000 --- a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/partnerships.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/ssl_certs.jks b/Server/src/test/resources/OpenAS2ServerTest/OpenAS2B/config/ssl_certs.jks deleted file mode 100644 index 52b4e7bdb373c5fcf47dbaaa2e7e63963b2ca1a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2279 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 Mv0fX9jTM>uUsHTfYybcN diff --git a/Server/src/test/resources/SingleServerTest/MyCompany/config/commands.xml b/Server/src/test/resources/SingleServerTest/MyCompany/config/commands.xml deleted file mode 100644 index 0ae9bbb0..00000000 --- a/Server/src/test/resources/SingleServerTest/MyCompany/config/commands.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Server/src/test/resources/SingleServerTest/MyCompany/config/config.xml b/Server/src/test/resources/SingleServerTest/MyCompany/config/config.xml deleted file mode 100644 index 902d870d..00000000 --- a/Server/src/test/resources/SingleServerTest/MyCompany/config/config.xml +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Server/src/test/resources/SingleServerTest/MyCompany/config/partnerships.xml b/Server/src/test/resources/SingleServerTest/MyCompany/config/partnerships.xml deleted file mode 100644 index 80960e79..00000000 --- a/Server/src/test/resources/SingleServerTest/MyCompany/config/partnerships.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Server/src/test/resources/SingleServerTest/MyCompany/config/ssl_certs.jks b/Server/src/test/resources/SingleServerTest/MyCompany/config/ssl_certs.jks deleted file mode 100644 index 52b4e7bdb373c5fcf47dbaaa2e7e63963b2ca1a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2279 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 literal 0 HcmV?d00001 diff --git a/Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/content_type_mappings.properties b/Server/src/test/resources/config/content_type_mappings.properties similarity index 100% rename from Server/src/test/resources/OpenAS2ServerTest/OpenAS2A/config/content_type_mappings.properties rename to Server/src/test/resources/config/content_type_mappings.properties diff --git a/Server/src/test/resources/config/db_ddl.sql b/Server/src/test/resources/config/db_ddl.sql new file mode 100644 index 00000000..027dee73 --- /dev/null +++ b/Server/src/test/resources/config/db_ddl.sql @@ -0,0 +1,39 @@ +-- ----------------------------------------------------------------------- +-- msg_metadata +-- ----------------------------------------------------------------------- + +DROP TABLE msg_metadata IF EXISTS; + +-- ----------------------------------------------------------------------- +-- msg_metadata +-- ----------------------------------------------------------------------- + +CREATE TABLE msg_metadata +( + ID INTEGER NOT NULL AUTO_INCREMENT, + MSG_ID VARCHAR NOT NULL, + PRIOR_MSG_ID VARCHAR, + MDN_ID VARCHAR, + DIRECTION VARCHAR(25), + IS_RESEND VARCHAR(1), + RESEND_COUNT INTEGER, + SENDER_ID VARCHAR(255) NOT NULL, + RECEIVER_ID VARCHAR(255) NOT NULL, + STATUS VARCHAR(255), + STATE VARCHAR(255), + SIGNATURE_ALGORITHM VARCHAR(255), + ENCRYPTION_ALGORITHM VARCHAR(255), + COMPRESSION VARCHAR(255), + FILE_NAME VARCHAR(255), + CONTENT_TYPE VARCHAR(255), + CONTENT_TRANSFER_ENCODING VARCHAR(255), + MDN_MODE VARCHAR(255), + MDN_RESPONSE VARCHAR, + STATE_MSG VARCHAR, + CREATE_DT TIMESTAMP, + UPDATE_DT TIMESTAMP, + PRIMARY KEY (ID) +); + +CREATE UNIQUE INDEX MSG_ID_UNIQUE ON msg_metadata (MSG_ID); + From 4a30132a4e68d976c0d186bc63f9ea093d34017e Mon Sep 17 00:00:00 2001 From: Christopher Broderick Date: Mon, 4 Aug 2025 10:47:42 +0100 Subject: [PATCH 02/20] Update Maven files to lateast --- .mvn/wrapper/maven-wrapper.jar | Bin 49519 -> 62547 bytes .mvn/wrapper/maven-wrapper.properties | 19 +- mvnw | 290 ++++++++++++++++---------- mvnw.cmd | 94 +++++++-- 4 files changed, 275 insertions(+), 128 deletions(-) diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar index c6feb8bb6f76f2553e266ff8bf8867105154237e..cb28b0e37c7d206feb564310fdeec0927af4123a 100644 GIT binary patch literal 62547 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 A?*IS* literal 49519 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%0A$pwhjXzyA0ZzErH{1@M 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 diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index eb919476..d58ddb0c 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1 +1,18 @@ -distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.3/apache-maven-3.3.3-bin.zip \ No newline at end of file +# 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. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar diff --git a/mvnw b/mvnw index 006d61d4..8d937f4c 100755 --- a/mvnw +++ b/mvnw @@ -19,7 +19,7 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Maven2 Start Up Batch script +# Apache Maven Wrapper startup batch script, version 3.2.0 # # Required ENV vars: # ------------------ @@ -27,7 +27,6 @@ # # Optional ENV vars # ----------------- -# M2_HOME - location of maven2's installed home dir # MAVEN_OPTS - parameters passed to the Java VM when running Maven # e.g. to debug Maven itself, use # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 @@ -36,6 +35,10 @@ if [ -z "$MAVEN_SKIP_RC" ] ; then + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + if [ -f /etc/mavenrc ] ; then . /etc/mavenrc fi @@ -50,109 +53,56 @@ fi cygwin=false; darwin=false; mingw=false -case "`uname`" in +case "$(uname)" in CYGWIN*) cygwin=true ;; MINGW*) mingw=true;; Darwin*) darwin=true - # - # Look for the Apple JDKs first to preserve the existing behaviour, and then look - # for the new JDKs provided by Oracle. - # - if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then - # - # Apple JDKs - # - export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home - fi - - if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then - # - # Apple JDKs - # - export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home - fi - - if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then - # - # Oracle JDKs - # - export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home - fi - - if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then - # - # Apple JDKs - # - export JAVA_HOME=`/usr/libexec/java_home` - fi - ;; + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; esac if [ -z "$JAVA_HOME" ] ; then if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` + JAVA_HOME=$(java-config --jre-home) fi fi -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - # For Cygwin, ensure paths are in UNIX format before anything is touched if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + JAVA_HOME=$(cygpath --unix "$JAVA_HOME") [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` + CLASSPATH=$(cygpath --path --unix "$CLASSPATH") fi -# For Migwn, ensure paths are in UNIX format before anything is touched +# For Mingw, ensure paths are in UNIX format before anything is touched if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" - # TODO classpath? + [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && + JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" fi if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + readLink=$(which readlink) + if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + javaHome="$(dirname "\"$javaExecutable\"")" + javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" else - javaExecutable="`readlink -f \"$javaExecutable\"`" + javaExecutable="$(readlink -f "\"$javaExecutable\"")" fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` + javaHome="$(dirname "\"$javaExecutable\"")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') JAVA_HOME="$javaHome" export JAVA_HOME fi @@ -168,7 +118,7 @@ if [ -z "$JAVACMD" ] ; then JAVACMD="$JAVA_HOME/bin/java" fi else - JAVACMD="`which java`" + JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" fi fi @@ -182,57 +132,177 @@ if [ -z "$JAVA_HOME" ] ; then echo "Warning: JAVA_HOME environment variable is not set." fi -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` -fi - # traverses directory structure from process work directory to filesystem root # first directory with .mvn subdirectory is considered project base directory find_maven_basedir() { - local basedir=$(pwd) - local wdir=$(pwd) + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" while [ "$wdir" != '/' ] ; do if [ -d "$wdir"/.mvn ] ; then basedir=$wdir break fi - wdir=$(cd "$wdir/.."; pwd) + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=$(cd "$wdir/.." || exit 1; pwd) + fi + # end of workaround done - echo "${basedir}" + printf '%s' "$(cd "$basedir" || exit 1; pwd)" } # concatenates all lines of a file concat_lines() { if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" + # Remove \r in case we run on Windows within Git Bash + # and check out the repository with auto CRLF management + # enabled. Otherwise, we may read lines that are delimited with + # \r\n and produce $'-Xarg\r' rather than -Xarg due to word + # splitting rules. + tr -s '\r\n' ' ' < "$1" + fi +} + +log() { + if [ "$MVNW_VERBOSE" = true ]; then + printf '%s\n' "$1" fi } -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)} +BASE_DIR=$(find_maven_basedir "$(dirname "$0")") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +log "$MAVEN_PROJECTBASEDIR" + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" +if [ -r "$wrapperJarPath" ]; then + log "Found $wrapperJarPath" +else + log "Couldn't find $wrapperJarPath, downloading it ..." + + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + fi + while IFS="=" read -r key value; do + # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) + safeValue=$(echo "$value" | tr -d '\r') + case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; + esac + done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" + log "Downloading from: $wrapperUrl" + + if $cygwin; then + wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") + fi + + if command -v wget > /dev/null; then + log "Found wget ... using wget" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + log "Found curl ... using curl" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + fi + else + log "Falling back to using Java to download" + javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=$(cygpath --path --windows "$javaSource") + javaClass=$(cygpath --path --windows "$javaClass") + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + log " - Compiling MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + log " - Running MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +# If specified, validate the SHA-256 sum of the Maven wrapper jar file +wrapperSha256Sum="" +while IFS="=" read -r key value; do + case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; + esac +done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" +if [ -n "$wrapperSha256Sum" ]; then + wrapperSha256Result=false + if command -v sha256sum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + elif command -v shasum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." + echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." + exit 1 + fi + if [ $wrapperSha256Result = false ]; then + echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 + echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 + echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 + exit 1 + fi +fi + MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" -# Provide a "standardized" way to retrieve the CLI args that will +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --windows "$CLASSPATH") + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") +fi + +# Provide a "standardized" way to retrieve the CLI args that will # work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" export MAVEN_CMD_LINE_ARGS WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain -# "-Dcom.sun.security.enableAIAcaIssuers=true" \ -# "-Djavax.net.debug=ssl:handshake:verbose:keymanager:trustmanager" \ - -"$JAVACMD" \ +# shellcheck disable=SC2086 # safe args +exec "$JAVACMD" \ $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Djavax.net.debug=ssl:trustmanager" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CMD_LINE_ARGS -exit 0 + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd index 00104808..c4586b56 100644 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -18,15 +18,14 @@ @REM ---------------------------------------------------------------------------- @REM ---------------------------------------------------------------------------- -@REM Maven2 Start Up Batch script +@REM Apache Maven Wrapper startup batch script, version 3.2.0 @REM @REM Required ENV vars: @REM JAVA_HOME - location of a JDK home dir @REM @REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven @REM e.g. to debug Maven itself, use @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 @@ -35,7 +34,9 @@ @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' @echo off -@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% @REM set %HOME% to equivalent of $HOME @@ -44,8 +45,8 @@ if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") @REM Execute a user defined script before this one if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre @REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* :skipRcPre @setlocal @@ -80,8 +81,6 @@ goto error :init -set MAVEN_CMD_LINE_ARGS=%MAVEN_CONFIG% %* - @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". @REM Fallback to current working directory if not found. @@ -117,11 +116,72 @@ for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do s :endReadAdditionalConfig SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" - -set WRAPPER_JAR=""%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS% +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file +SET WRAPPER_SHA_256_SUM="" +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B +) +IF NOT %WRAPPER_SHA_256_SUM%=="" ( + powershell -Command "&{"^ + "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ + "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ + " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ + " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ + " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ + " exit 1;"^ + "}"^ + "}" + if ERRORLEVEL 1 goto error +) + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* if ERRORLEVEL 1 goto error goto end @@ -131,15 +191,15 @@ set ERROR_CODE=1 :end @endlocal & set ERROR_CODE=%ERROR_CODE% -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost @REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" :skipRcPost @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause +if "%MAVEN_BATCH_PAUSE%"=="on" pause -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% -exit /B %ERROR_CODE% +cmd /C exit /B %ERROR_CODE% From b17114632c8a43c86026985a506011b430154ce3 Mon Sep 17 00:00:00 2001 From: Christopher Broderick Date: Mon, 4 Aug 2025 10:48:57 +0100 Subject: [PATCH 03/20] Configuration overriding the default config and partnerships for test purposes. --- .../test/resources/custom/server1.properties | 11 ++++ .../resources/custom/server1_partnerships.xml | 43 ++++++++++++++ .../test/resources/custom/server2.properties | 11 ++++ .../resources/custom/server2_partnerships.xml | 57 +++++++++++++++++++ 4 files changed, 122 insertions(+) create mode 100644 Server/src/test/resources/custom/server1.properties create mode 100644 Server/src/test/resources/custom/server1_partnerships.xml create mode 100644 Server/src/test/resources/custom/server2.properties create mode 100644 Server/src/test/resources/custom/server2_partnerships.xml diff --git a/Server/src/test/resources/custom/server1.properties b/Server/src/test/resources/custom/server1.properties new file mode 100644 index 00000000..88a08f21 --- /dev/null +++ b/Server/src/test/resources/custom/server1.properties @@ -0,0 +1,11 @@ +storageBaseDir=src/test/resources/data1 +partnership_file=src/test/resources/custom/server1_partnerships.xml +config.dir=%home% +pollerConfigBase.interval=1 +module.AS2ReceiverModule.http.port=10080 +module.AS2MDNReceiverModule.http.port=10081 +module.AS2MDNReceiverModule.http.enabled=true +module.AS2ReceiverModule.https.port=1443 +module.AS2MDNReceiverModule.https.port=11443 +module.HealthCheckModule.port=10099 +msg_tracking.tcp_server_port=10092 diff --git a/Server/src/test/resources/custom/server1_partnerships.xml b/Server/src/test/resources/custom/server1_partnerships.xml new file mode 100644 index 00000000..7002a855 --- /dev/null +++ b/Server/src/test/resources/custom/server1_partnerships.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Server/src/test/resources/custom/server2.properties b/Server/src/test/resources/custom/server2.properties new file mode 100644 index 00000000..91ce0d63 --- /dev/null +++ b/Server/src/test/resources/custom/server2.properties @@ -0,0 +1,11 @@ +storageBaseDir=src/test/resources/data2 +partnership_file=src/test/resources/custom/server2_partnerships.xml +pollerConfigBase.interval=1 +module.AS2ReceiverModule.http.port=20080 +async_mdn_receiver_port=20081 +module.AS2MDNReceiverModule.http.port=$properties.async_mdn_receiver_port$ +as2_async_mdn_url=http://localhost:$properties.async_mdn_receiver_port$ +module.AS2ReceiverModule.https.port=2443 +module.AS2MDNReceiverModule.https.port=22443 +module.HealthCheckModule.port=20099 +msg_tracking.tcp_server_port=20092 diff --git a/Server/src/test/resources/custom/server2_partnerships.xml b/Server/src/test/resources/custom/server2_partnerships.xml new file mode 100644 index 00000000..ee60fcb9 --- /dev/null +++ b/Server/src/test/resources/custom/server2_partnerships.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 09b6575f654612288f9d7b43334f9ba5e3774421 Mon Sep 17 00:00:00 2001 From: Christopher Broderick Date: Mon, 4 Aug 2025 10:49:29 +0100 Subject: [PATCH 04/20] Add Java 24 to testing matrix --- .github/workflows/actions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index 3d9be7d9..03c8e20d 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -6,7 +6,7 @@ jobs: strategy: fail-fast: false matrix: - java_version: [11, 17, 21] + java_version: [11, 17, 21, 24] os: [windows-latest, ubuntu-latest] steps: - name: Checkout From 355cd65866234a465224889bb9030a9c700976c9 Mon Sep 17 00:00:00 2001 From: Christopher Broderick Date: Mon, 4 Aug 2025 10:49:52 +0100 Subject: [PATCH 05/20] Ignore the config created for testing --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 8dad7d3e..3b4f66b7 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,8 @@ pom.xml.versionsBackup /Bundle/target/ /lib/ /Server/src/logs/ +/Server/src/test/resources/config/ **/.DS_Store **/.settings **/*.class -.metadata/* \ No newline at end of file +.metadata/* From ec36ddad9b10b8ebbe483f58a7a98d0723466dac Mon Sep 17 00:00:00 2001 From: Christopher Broderick Date: Mon, 4 Aug 2025 11:57:35 +0100 Subject: [PATCH 06/20] Rework faulty file waiting algorithm --- .../src/test/java/org/openas2/TestUtils.java | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/Server/src/test/java/org/openas2/TestUtils.java b/Server/src/test/java/org/openas2/TestUtils.java index 7dfe61c0..97be03e0 100644 --- a/Server/src/test/java/org/openas2/TestUtils.java +++ b/Server/src/test/java/org/openas2/TestUtils.java @@ -1,12 +1,10 @@ package org.openas2; import org.apache.commons.io.FileUtils; -import org.apache.commons.io.filefilter.IOFileFilter; -import org.apache.commons.io.filefilter.TrueFileFilter; import java.io.File; import java.io.FileNotFoundException; -import java.util.Collection; +import java.io.FilenameFilter; import java.util.concurrent.TimeUnit; /** @@ -24,20 +22,20 @@ public class TestUtils { * @return a file * @throws FileNotFoundException */ - public static File waitForFile(File parent, IOFileFilter fileFilter, int timeout, TimeUnit unit) throws FileNotFoundException { + public static File waitForFile(File dir, String fileNameSubstr, int timeout, TimeUnit unit) throws FileNotFoundException { long finishAt = System.currentTimeMillis() + unit.toMillis(timeout); - waitForFile(parent, timeout, unit); + FilenameFilter subStringFilter = (d, s) -> { + return s.contains(fileNameSubstr); + }; while (finishAt - System.currentTimeMillis() > 0) { - Collection files = FileUtils.listFiles(parent, fileFilter, TrueFileFilter.INSTANCE); - if (!files.isEmpty()) { - if (files.size() > 1) { + String[] files = dir.list(subStringFilter); + if (files.length == 1) { + return new File(dir.getPath() + File.separator + files[0]); + } else if (files.length > 1) { throw new IllegalStateException("Result is not unique."); - } else { - return files.iterator().next(); - } } } - throw new FileNotFoundException(parent.getAbsolutePath() + ": " + fileFilter.toString()); + throw new FileNotFoundException("Directory: " + dir.getAbsolutePath() + " File Name Substring: " + fileNameSubstr); } /** @@ -47,8 +45,8 @@ public static File waitForFile(File parent, IOFileFilter fileFilter, int timeout * @param timeout an amount of time units to wait * @param unit a time unit */ - public static void waitForFile(File file, int timeout, TimeUnit unit) { - FileUtils.waitFor(file, Long.valueOf(unit.toSeconds(timeout)).intValue()); + public static boolean waitForFile(File file, int timeout, TimeUnit unit) { + return FileUtils.waitFor(file, Long.valueOf(unit.toSeconds(timeout)).intValue()); } public static boolean deleteDirectory(File directoryToBeDeleted) { From dbb4b8974b7e8d2e0547afebbacc09c1db8ace0c Mon Sep 17 00:00:00 2001 From: Christopher Broderick Date: Mon, 4 Aug 2025 11:58:15 +0100 Subject: [PATCH 07/20] Simplify test resource access. --- .../test/java/org/openas2/TestResource.java | 75 ++++++++++++------- 1 file changed, 46 insertions(+), 29 deletions(-) diff --git a/Server/src/test/java/org/openas2/TestResource.java b/Server/src/test/java/org/openas2/TestResource.java index 671be53c..ce5d5be0 100644 --- a/Server/src/test/java/org/openas2/TestResource.java +++ b/Server/src/test/java/org/openas2/TestResource.java @@ -4,49 +4,66 @@ import java.io.File; import java.io.FileNotFoundException; -import java.net.URISyntaxException; -import java.net.URL; +import java.nio.file.Paths; +import java.util.Map; /** - * A helper class for locating files and directories on the file systems. - * The main reason is to categorize static files used in tests. + * Retrieves resources used for test purposes from the file system + * */ public class TestResource { - - /** - * An absolute path to a test specific resource. + /* Set up a map of resource files that can be generically used by all tests + * and some test specific property files that override the default behaviour + * from the standard config.xml file such as for tests using 2 AS2 server instances. */ - private final String pathPrefix; - - private TestResource(String clazzSimpleName) { - try { - URL resource = Thread.currentThread().getContextClassLoader().getResource("."); - this.pathPrefix = new File(resource.toURI()).getAbsolutePath() + File.separator + clazzSimpleName; - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - } + public static final Map resources = Map.of( + "config", new String[]{"config", "config.xml"}, + "partnerships", new String[]{"config", "partnerships.xml"}, + "server1-props", new String[]{"custom", "server1.properties"}, + "server1-partnerships", new String[]{"custom", "server1_partnerships.xml"}, + "server2-props", new String[]{"custom", "server2.properties"}, + "server2-partnerships", new String[]{"custom", "server2_partnerships.xml"}, + "api-server-props", new String[]{"custom", "api-server.properties"} + ); + + static String pathPrefix = Paths.get("src","test","resources").toAbsolutePath().toString(); - public static TestResource forClass(Class clazz) { - return new TestResource(clazz.getSimpleName()); - } - public static TestResource forGroup(String group) { - return new TestResource(group); + public static String getResource(String resourceIdentifier) throws FileNotFoundException { + /** + * Get absolute path to a file identified by the resource identifier passed in. + * + * @param resourceIdentifier - an identifier matching one of the keys in this classes resources map + * @return a file + */ + String[] resourceAttributes = resources.get(resourceIdentifier); + String filePath = get(resourceAttributes); + + return filePath; } /** - * Get a file or directory within {@link #pathPrefix} + * Get the absolute path to a file or directory within {@link #resourceBaseFolder} * - * @param fileName a file or directory name - * @param child a children name + * @param foldersAndFile - a list of optional folders in path with the actual file name as the last in the list * @return a file */ - public File get(String fileName, String... child) throws FileNotFoundException { - File file = new File(pathPrefix + File.separator + fileName + File.separator + StringUtils.join(child, File.separator)); + public static String get(String... foldersAndFile) throws FileNotFoundException { + String filePath = pathPrefix + File.separator + StringUtils.join(foldersAndFile, File.separator); + File file = new File(filePath); if (!file.exists()) { - throw new FileNotFoundException(file.getAbsolutePath()); + throw new FileNotFoundException(filePath); } - return file; + return filePath; + } + + /** + * Get a File object for a file or directory within {@link #resourceBaseFolder} + * + * @param foldersAndFile - a list of optional folders in path with the actual file name as the last in the list + * @return a File object + */ + public static File getFile(String... foldersAndFile) throws FileNotFoundException { + return new File(get(foldersAndFile)); } } From f17bf4e297f50a2b281bcc4c5a03d6971faf5d69 Mon Sep 17 00:00:00 2001 From: Christopher Broderick Date: Mon, 4 Aug 2025 12:00:07 +0100 Subject: [PATCH 08/20] Use new resource access method --- .../java/org/openas2/app/BaseServerSetup.java | 3 +-- .../java/org/openas2/app/HealthCheckTest.java | 6 +++--- .../test/java/org/openas2/app/RestApiTest.java | 3 +-- Server/src/test/resources/as2_certs.p12 | Bin 7652 -> 0 bytes 4 files changed, 5 insertions(+), 7 deletions(-) delete mode 100644 Server/src/test/resources/as2_certs.p12 diff --git a/Server/src/test/java/org/openas2/app/BaseServerSetup.java b/Server/src/test/java/org/openas2/app/BaseServerSetup.java index 8a57fc48..cb284336 100644 --- a/Server/src/test/java/org/openas2/app/BaseServerSetup.java +++ b/Server/src/test/java/org/openas2/app/BaseServerSetup.java @@ -19,7 +19,6 @@ public class BaseServerSetup { - private static final TestResource RESOURCE = TestResource.forGroup("SingleServerTest"); static String myCompanyOid = "MyCompany_OID"; static String myPartnerOid = "PartnerA_OID"; private boolean startActiveModules = false; @@ -72,7 +71,7 @@ public void setup() throws Exception { if (openAS2PropertiesFile.exists()) { System.setProperty(Properties.OPENAS2_PROPERTIES_FILE_PROP, openAS2PropertiesFile.getAbsolutePath()); } - session = new XMLSession(RESOURCE.get("MyCompany", "config", "config.xml").getAbsolutePath()); + session = new XMLSession(TestResource.getResource("config")); simpleTestMsg = getSimpleTestMsg(); if (startActiveModules) { session.start(); diff --git a/Server/src/test/java/org/openas2/app/HealthCheckTest.java b/Server/src/test/java/org/openas2/app/HealthCheckTest.java index c0315180..df663cdb 100644 --- a/Server/src/test/java/org/openas2/app/HealthCheckTest.java +++ b/Server/src/test/java/org/openas2/app/HealthCheckTest.java @@ -11,6 +11,7 @@ import org.openas2.TestUtils; import org.openas2.processor.ActiveModule; import org.openas2.processor.receiver.NetModule; +import org.openas2.util.Properties; import java.io.File; import java.io.FileOutputStream; @@ -27,7 +28,6 @@ @ExtendWith(MockitoExtension.class) public class HealthCheckTest { - private static final TestResource RESOURCE = TestResource.forGroup("SingleServerTest"); // private static File openAS2AHome; private static OpenAS2Server serverInstance; private static ExecutorService executorService; @@ -40,7 +40,7 @@ public static void startServer() throws Exception { // to make sure the release package is fully tested scratchpad = Files.createTempDirectory("testResources"); File customPropsFile = Files.createFile(Paths.get(scratchpad.toString(), "openas2.properties")).toFile(); - System.setProperty("openas2.properties.file", customPropsFile.getAbsolutePath()); + System.setProperty(Properties.OPENAS2_PROPERTIES_FILE_PROP, customPropsFile.getAbsolutePath()); FileOutputStream fos = new FileOutputStream(customPropsFile); fos.write("module.HealthCheckModule.enabled=true\n".getBytes()); fos.close(); @@ -49,7 +49,7 @@ public static void startServer() throws Exception { // System.setProperty("OPENAS@_LOG_LEVEL", "TRACE"); executorService = Executors.newFixedThreadPool(20); - HealthCheckTest.serverInstance = new OpenAS2Server.Builder().run(RESOURCE.get("MyCompany", "config", "config.xml").getAbsolutePath()); + HealthCheckTest.serverInstance = new OpenAS2Server.Builder().run(TestResource.getResource("config")); } catch (Throwable e) { // aid for debugging JUnit tests System.err.println("ERROR occurred: " + ExceptionUtils.getStackTrace(e)); diff --git a/Server/src/test/java/org/openas2/app/RestApiTest.java b/Server/src/test/java/org/openas2/app/RestApiTest.java index 56de6068..78fa5c49 100644 --- a/Server/src/test/java/org/openas2/app/RestApiTest.java +++ b/Server/src/test/java/org/openas2/app/RestApiTest.java @@ -47,7 +47,6 @@ @ExtendWith(MockitoExtension.class) @TestMethodOrder(MethodOrderer.MethodName.class) public class RestApiTest { - private static final TestResource RESOURCE = TestResource.forGroup("SingleServerTest"); // private static File openAS2AHome; private static OpenAS2Server serverInstance; private static String TEST_PARTNER_NAME = "partnerX"; @@ -78,7 +77,7 @@ public static void start_A_Server() throws Exception { //System.setProperty(OPENAS2_LOG_LEVEL", "TRACE"); //executorService = Executors.newFixedThreadPool(20); - RestApiTest.serverInstance = new OpenAS2Server.Builder().run(RESOURCE.get("MyCompany", "config", "config.xml").getAbsolutePath()); + RestApiTest.serverInstance = new OpenAS2Server.Builder().run(TestResource.getResource("config")); } catch (Throwable e) { // aid for debugging JUnit tests System.err.println("ERROR occurred: " + ExceptionUtils.getStackTrace(e)); diff --git a/Server/src/test/resources/as2_certs.p12 b/Server/src/test/resources/as2_certs.p12 deleted file mode 100644 index 266e03f758556de5f132dc8b5085630ccba2a5cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7652 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 From 04dcf3c6de5ae93573c7e4e5bd8983ac9d1dd523 Mon Sep 17 00:00:00 2001 From: Christopher Broderick Date: Mon, 4 Aug 2025 12:01:59 +0100 Subject: [PATCH 09/20] Log message to indicate parallel processing of files (threaded) is enabled. --- .../org/openas2/processor/receiver/DirectoryPollingModule.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Server/src/main/java/org/openas2/processor/receiver/DirectoryPollingModule.java b/Server/src/main/java/org/openas2/processor/receiver/DirectoryPollingModule.java index 20761927..03b2059a 100644 --- a/Server/src/main/java/org/openas2/processor/receiver/DirectoryPollingModule.java +++ b/Server/src/main/java/org/openas2/processor/receiver/DirectoryPollingModule.java @@ -245,6 +245,9 @@ private void updateTracking() { // if the file length has stayed the same, process the file // and then stop tracking it if (processFilesAsThreads) { + if (logger.isDebugEnabled()) { + logger.debug("Parallel processing mode handling file: " + file.getName()); + } executorService.execute(new Runnable() { @Override public void run() { From 258c9b37f426e4c232407c683106fda6c844c859 Mon Sep 17 00:00:00 2001 From: Christopher Broderick Date: Mon, 4 Aug 2025 12:02:16 +0100 Subject: [PATCH 10/20] Refreshed certificates --- Server/src/config/as2_certs.p12 | Bin 5241 -> 7668 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Server/src/config/as2_certs.p12 b/Server/src/config/as2_certs.p12 index 45732c0f959724a8245cd95c0f938690adb48d53..47d0232a47a7bde32c6ffcacbafb9274df9980dd 100644 GIT binary patch delta 7288 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 cqAq576!6|D Date: Mon, 4 Aug 2025 12:02:41 +0100 Subject: [PATCH 11/20] Script to refresh test certificates --- Server/src/bin/create_test_certificates.sh | 51 ++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100755 Server/src/bin/create_test_certificates.sh diff --git a/Server/src/bin/create_test_certificates.sh b/Server/src/bin/create_test_certificates.sh new file mode 100755 index 00000000..f22bd889 --- /dev/null +++ b/Server/src/bin/create_test_certificates.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +x=`basename $0` +relBinDir=`dirname $0` +binDir=`realpath $relBinDir` +srcBaseDir=`realpath $binDir/../..` +configDir=${srcBaseDir}/src/config + +cd $configDir +if [ "$?" != 0 ]; then + echo "****** Failed to find the "config" directory. See errors above to correct the problem." + exit 1 +fi +export IS_AUTOMATED_EXEC=1 +export KEYSTORE_PASSWORD=testas2 +echo "************" +echo "Deleting existing keystores..." +alias1=mycompany +alias2=partnera +alias3=partnerb +ks1=as2_certs.p12 +ks2=${alias2}_certs.p12 +ks3=${alias2}_certs.p12 +rm -f $ks1 $ks2 $ks3 +$binDir/gen_p12_key_par.sh ${ks1%.*} ${alias1} SHA256 'CN=as2.${alias1}.com, OU=QA, O=MyCompany, L=Cape Town, S=Western Cape, C=ZA' +if [ "$?" != 0 ]; then + echo "****** Failed to create as2_certs.p12 keystore. See errors above to correct the problem." + exit 1 +fi +$binDir/gen_p12_key_par.sh ${ks2%.*} ${alias2} SHA256 'CN=as2.${alias2}.com, OU=QA, O=PartnerA, L=New York, S=New York, C=US' +if [ "$?" != 0 ]; then + echo "****** Failed to create ${ks2} keystore. See errors above to correct the problem." + exit 1 +fi +$binDir/gen_p12_key_par.sh ${ks3%.*} ${alias3} SHA256 'CN=as2.${alias3}.com, OU=QA, O=PartnerB, L=London, S=London, C=US' +if [ "$?" != 0 ]; then + echo "****** Failed to create ${ks3} keystore. See errors above to correct the problem." + exit 1 +fi +$binDir/import_alias_from_keystore.sh $ks2 ${alias2} $ks1 ${alias2} +if [ "$?" != 0 ]; then + echo "****** Failed to import ${ks2} keystorei into main keystore. See errors above to correct the problem." + exit 1 +fi +$binDir/import_alias_from_keystore.sh $ks3 ${alias3} $ks1 ${alias3} +if [ "$?" != 0 ]; then + echo "****** Failed to import ${ks3} keystorei into main keystore. See errors above to correct the problem." + exit 1 +fi +rm -f ${alias1}* ${alias2}* ${alias3}* +exit 0 From 7f678f044bc28ee3eeb0cb696f2854f3a74d897f Mon Sep 17 00:00:00 2001 From: Christopher Broderick Date: Mon, 4 Aug 2025 12:03:27 +0100 Subject: [PATCH 12/20] Added to usage message --- Server/src/bin/gen_p12_key_par.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/Server/src/bin/gen_p12_key_par.sh b/Server/src/bin/gen_p12_key_par.sh index aab6c19d..7c428214 100755 --- a/Server/src/bin/gen_p12_key_par.sh +++ b/Server/src/bin/gen_p12_key_par.sh @@ -3,6 +3,7 @@ x=`basename $0` if test $# -ne 4; then + echo "Invalid parameter list. Expected 4 got $#: $@" echo "Generate a certificate to a PKCS12 key store." echo "You must supply a target key store without the extension (extension will be added as .p12) and an alias for the generated certificate." echo "usage: ${x} " From caaf442ead1e48dcc68c0078dcc630dffa1e0ec6 Mon Sep 17 00:00:00 2001 From: Christopher Broderick Date: Mon, 4 Aug 2025 12:05:32 +0100 Subject: [PATCH 13/20] Fixed HealthCheckModule SSL keystore property reference. --- Server/src/config/config.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Server/src/config/config.xml b/Server/src/config/config.xml index e4a3db99..a242e8d6 100644 --- a/Server/src/config/config.xml +++ b/Server/src/config/config.xml @@ -195,8 +195,8 @@ protocol="$properties.module.HealthCheckModule.protocol" address="$properties.module.HealthCheckModule.address$" port="$properties.module.HealthCheckModule.port$" - ssl_keystore="$properties.module.HealthCheckModule.ssl_keystore$" - ssl_keystore_password="$properties.module.HealthCheckModule.ssl_keystore_password$"/> + ssl_keystore="$properties.ssl_keystore$" + ssl_keystore_password="$properties.ssl_keystore_password$"/> Date: Mon, 4 Aug 2025 12:10:18 +0100 Subject: [PATCH 14/20] Remove redundant method causing import confusion --- Server/src/test/java/org/openas2/TestUtils.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/Server/src/test/java/org/openas2/TestUtils.java b/Server/src/test/java/org/openas2/TestUtils.java index 97be03e0..7526622b 100644 --- a/Server/src/test/java/org/openas2/TestUtils.java +++ b/Server/src/test/java/org/openas2/TestUtils.java @@ -1,7 +1,5 @@ package org.openas2; -import org.apache.commons.io.FileUtils; - import java.io.File; import java.io.FileNotFoundException; import java.io.FilenameFilter; @@ -38,17 +36,6 @@ public static File waitForFile(File dir, String fileNameSubstr, int timeout, Tim throw new FileNotFoundException("Directory: " + dir.getAbsolutePath() + " File Name Substring: " + fileNameSubstr); } - /** - * Wait till file will occur on the file system. - * - * @param file a file - * @param timeout an amount of time units to wait - * @param unit a time unit - */ - public static boolean waitForFile(File file, int timeout, TimeUnit unit) { - return FileUtils.waitFor(file, Long.valueOf(unit.toSeconds(timeout)).intValue()); - } - public static boolean deleteDirectory(File directoryToBeDeleted) { File[] allContents = directoryToBeDeleted.listFiles(); if (allContents != null) { From 58684751c05a05f2ec756e8176dbce8163e9e71c Mon Sep 17 00:00:00 2001 From: Christopher Broderick Date: Mon, 4 Aug 2025 12:12:03 +0100 Subject: [PATCH 15/20] Fix spelling mistakes --- Server/src/main/java/org/openas2/XMLSession.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Server/src/main/java/org/openas2/XMLSession.java b/Server/src/main/java/org/openas2/XMLSession.java index 5229594b..8ccacf44 100644 --- a/Server/src/main/java/org/openas2/XMLSession.java +++ b/Server/src/main/java/org/openas2/XMLSession.java @@ -153,7 +153,7 @@ private void loadProperties(Node propNode) throws IOException, OpenAS2Exception if (appPropsFile != null && appPropsFile.length() > 1) { LOGGER.info("Processing OpenAS2 configuration properties file: {}", appPropsFile); java.util.Properties appProps = new java.util.Properties(); - // Support $ENV{some_env_var} reploacement in properties + // Support $ENV{some_env_var} replacement in properties StringEnvVarReplacer envVarReplacer = new StringEnvVarReplacer(); envVarReplacer.setAppHomeDir(getBaseDirectory()); FileInputStream fis = null; @@ -283,7 +283,7 @@ private void loadPartnerships(Node rootNode) throws OpenAS2Exception { PartnershipFactory partnerFx = (PartnershipFactory) XMLUtil.getComponent(rootNode, this); if (partnerFx == null) { - // Must be disable so do nothing + // Must be disabled so do nothing return; } setComponent(PartnershipFactory.COMPID_PARTNERSHIP_FACTORY, partnerFx); From 63702ee582cfa42dc924f404ae9065391ae64e8f Mon Sep 17 00:00:00 2001 From: Christopher Broderick Date: Mon, 4 Aug 2025 12:19:23 +0100 Subject: [PATCH 16/20] Updated to use standard config with property based overrides and new resource retrieval --- .../org/openas2/app/OpenAS2ServerTest.java | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/Server/src/test/java/org/openas2/app/OpenAS2ServerTest.java b/Server/src/test/java/org/openas2/app/OpenAS2ServerTest.java index 133b00d5..8331ef07 100644 --- a/Server/src/test/java/org/openas2/app/OpenAS2ServerTest.java +++ b/Server/src/test/java/org/openas2/app/OpenAS2ServerTest.java @@ -37,14 +37,13 @@ public class OpenAS2ServerTest { - private static final TestResource RESOURCE = TestResource.forClass(OpenAS2ServerTest.class); - - private static TestPartner serverAPartnerSender; - private static TestPartner serverBPartnerReceiver; - private static TestPartner serverBPartnerSender; - private static TestPartner serverAPartnerReceiver; - private static OpenAS2Server serverA; - private static OpenAS2Server serverB; + + private static TestPartner server1PartnerSender; + private static TestPartner server2PartnerReceiver; + private static TestPartner server2PartnerSender; + private static TestPartner server1PartnerReceiver; + private static OpenAS2Server server1; + private static OpenAS2Server server2; private static String[] dataFolders = new String[2]; private final int msgCnt = 2; @@ -57,19 +56,27 @@ public static void startServers() throws Exception { tmp = Files.createTempDirectory("testResources").toFile(); //System.setProperty("OPENAS2_LOG_LEVEL", "TRACE"); try { - serverA = new OpenAS2Server.Builder().run(RESOURCE.get("OpenAS2A", "config", "config.xml").getAbsolutePath()); + String configFile = TestResource.getResource("config"); + System.setProperty("SERVER1_PARTNERSHIP_FILE", TestResource.getResource("server1-partnerships")); + String props1File = TestResource.getResource("server1-props"); + System.setProperty(Properties.OPENAS2_PROPERTIES_FILE_PROP, props1File); + server1 = new OpenAS2Server.Builder().run(configFile); // Get the data folder from Properties before starting the other server as it overwrites the Properties dataFolders[0] = Properties.getProperty("storageBaseDir", null); // Iterate over the partnerships picking the first one that has a directory poller - serverAPartnerSender = getFromFirstSendingPartnership(serverA); + server1PartnerSender = getFromFirstSendingPartnership(server1); // Use the 2 partners in the initial partnership to get other parnerships to test both way transfer // Get a receiver partnership for the matching partners in the sender partnership for server A - serverAPartnerReceiver = getFromPartnerIds(serverA, serverAPartnerSender.getPartnerAS2Id(), serverAPartnerSender.getAs2Id()); - serverB = new OpenAS2Server.Builder().run(RESOURCE.get("OpenAS2B", "config", "config.xml").getAbsolutePath()); + server1PartnerReceiver = getFromPartnerIds(server1, server1PartnerSender.getPartnerAS2Id(), server1PartnerSender.getAs2Id()); + + System.setProperty("SERVER2_PARTNERSHIP_FILE", TestResource.getResource("server2-partnerships")); + String props2File = TestResource.getResource("server2-props"); + System.setProperty(Properties.OPENAS2_PROPERTIES_FILE_PROP, props2File); + server2 = new OpenAS2Server.Builder().run(configFile); // Set up the receiver fin server B for the sender from server A - serverBPartnerReceiver = getFromPartnerIds(serverB, serverAPartnerSender.getAs2Id(), serverAPartnerSender.getPartnerAS2Id()); + server2PartnerReceiver = getFromPartnerIds(server2, server1PartnerSender.getAs2Id(), server1PartnerSender.getPartnerAS2Id()); // Get a sender partnership for the matching partners in the receiver partnership for server B - serverBPartnerSender = getFromPartnerIds(serverB, serverAPartnerSender.getPartnerAS2Id(), serverAPartnerSender.getAs2Id()); + server2PartnerSender = getFromPartnerIds(server2, server1PartnerSender.getPartnerAS2Id(), server1PartnerSender.getAs2Id()); dataFolders[1] = Properties.getProperty("storageBaseDir", null); executorService = Executors.newFixedThreadPool(20); } catch (FileNotFoundException e) { @@ -86,7 +93,7 @@ public static void startServers() throws Exception { @Test public void shouldSendMessagesSyncMdn() throws Exception { try { - sendMessages(serverAPartnerSender, serverBPartnerReceiver); + sendMessages(server1PartnerSender, server2PartnerReceiver); } catch (Throwable e) { // Aid debugging JUnit test failures System.out.println("shouldSendMessagesSyncMdn ERROR OCCURRED: " + ExceptionUtils.getStackTrace(e)); @@ -97,7 +104,7 @@ public void shouldSendMessagesSyncMdn() throws Exception { @Test public void shouldSendMessagesAsyncMdn() throws Exception { try { - sendMessages(serverBPartnerSender, serverAPartnerReceiver); + sendMessages(server2PartnerSender, server1PartnerReceiver); } catch (Throwable e) { // Aid debugging JUnit test failures System.out.println("shouldSendMessagesAsyncMdn ERROR OCCURRED: " + ExceptionUtils.getStackTrace(e)); @@ -128,8 +135,8 @@ public TestMessage call() throws Exception { public static void tearDown() throws Exception { //executorService.awaitTermination(15, TimeUnit.SECONDS); executorService.shutdown(); - serverAPartnerSender.getServer().shutdown(); - serverBPartnerReceiver.getServer().shutdown(); + server1PartnerSender.getServer().shutdown(); + server2PartnerReceiver.getServer().shutdown(); // Cleanup the folders created so the test does not fail next time round from leftover data // NOTE: For debugging "missing" files it is best to comment this out for (int i = 0; i < dataFolders.length; i++) { @@ -147,7 +154,7 @@ private TestMessage sendMessage(TestPartner fromPartner, TestPartner toPartner) String outgoingMsgBody = RandomStringUtils.secure().nextAlphanumeric(1024); File outgoingMsg = Files.createFile(Paths.get(tmp.toString(), outgoingMsgFileName)).toFile(); FileUtils.write(outgoingMsg, outgoingMsgBody, "UTF-8"); - System.out.println("Copying a file to send to:" + fromPartner.getOutbox()); + System.out.println("Copying " + outgoingMsg.getName() + " file for sending to:" + fromPartner.getOutbox()); FileUtils.copyFileToDirectory(outgoingMsg, fromPartner.getOutbox()); //System.out.println("**** **** FILE COPIED: " + fromPartner.getOutbox() + "/" + outgoingMsg.getName()); @@ -157,7 +164,8 @@ private TestMessage sendMessage(TestPartner fromPartner, TestPartner toPartner) private TestMessage getDeliveredMessage(TestMessage testMessage) throws IOException { // Wait a while - will depend on the sender poller interval how long it takes to arrive - testMessage.deliveredMsg = waitForFile(testMessage.toPartner.getInbox(), new PrefixFileFilter(testMessage.fileName), 20, TimeUnit.SECONDS); + // System.out.println("**** **** INBOX AWAITING FILE: " + testMessage.toPartner.getInbox().getAbsolutePath() + "/***-" + testMessage.fileName); + testMessage.deliveredMsg = waitForFile(testMessage.toPartner.getInbox(), testMessage.fileName, 20, TimeUnit.SECONDS); return testMessage; } @@ -166,10 +174,10 @@ private void verifyMessageDelivery(TestMessage testMessage) throws IOException { String deliveredMsgBody = FileUtils.readFileToString(testMessage.deliveredMsg, "UTF-8"); assertThat("Verify content of delivered message", deliveredMsgBody, is(testMessage.body)); - File rxdMDN = waitForFile(testMessage.toPartner.getRxdMDNs(), new PrefixFileFilter(testMessage.fileName), 10, TimeUnit.SECONDS); + File rxdMDN = waitForFile(testMessage.toPartner.getRxdMDNs(), testMessage.fileName, 10, TimeUnit.SECONDS); assertThat("Verify MDN was received by " + testMessage.toPartner.getName(), rxdMDN.exists(), is(true)); - File sentMDN = waitForFile(testMessage.fromPartner.getSentMDNs(), new PrefixFileFilter(testMessage.fileName), 10, TimeUnit.SECONDS); + File sentMDN = waitForFile(testMessage.fromPartner.getSentMDNs(), testMessage.fileName, 10, TimeUnit.SECONDS); assertThat("Verify sent MDN was stored by " + testMessage.fromPartner.getName(), sentMDN.exists(), is(true)); } From d55f88c2901531da64b3fe7db6a854db4e574a33 Mon Sep 17 00:00:00 2001 From: Christopher Broderick Date: Mon, 4 Aug 2025 12:20:20 +0100 Subject: [PATCH 17/20] Add generation of new certificates as part of test resource generation --- Server/pom.xml | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/Server/pom.xml b/Server/pom.xml index 8a294998..abaa24bd 100644 --- a/Server/pom.xml +++ b/Server/pom.xml @@ -43,20 +43,54 @@ org.apache.maven.plugins maven-dependency-plugin + + + + properties + + + org.apache.maven.plugins maven-surefire-plugin - + logs - + + org.apache.maven.plugins maven-antrun-plugin + + test-resource-creation + + run + + generate-resources + + + + + + + + + + + + + + default-cli From 3a991a69fcca0079ba1e54275c43e7b492bdea33 Mon Sep 17 00:00:00 2001 From: Christopher Broderick Date: Mon, 4 Aug 2025 12:21:20 +0100 Subject: [PATCH 18/20] Added stuff about Maven update and Java version supported. --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0c47278d..59bd47c8 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ # As2Server The OpenAS2 application enables you to transmit and receive AS2 messages with EDI-X12, EDIFACT, XML, or binary payloads between trading partners. +The application supports Java 11 and up. ## Development @@ -12,6 +13,9 @@ More detailed information is available in the DeveloperGuide.odt in the docs fol ## Test, Build and Package The following commands can be used in the build process. +Updating Maven to a different version: +`./mvnw wrapper:wrapper -Dmaven=3.9.9 + Checking dependency tree: `./mvnw dependency:tree` @@ -38,7 +42,7 @@ To deploy the released artifacts requires user ID and password for Sonatype. See `./mvnw nexus-staging:release -Ddescription="Some release comment here"` ## Web UI for configuration -IMPORTANT: The WebUI will NOT work with Java 8 - you need Java 11 or newer +IMPORTANT: You need Java 11 or newer Follow the instructions in the WebUI/README.md file for configuring and using it. From 9a6d563c1c18529a72341af76bb10863bded8ed4 Mon Sep 17 00:00:00 2001 From: Christopher Broderick Date: Mon, 4 Aug 2025 12:36:13 +0100 Subject: [PATCH 19/20] Updated packages to latest versions Update version of OpenAS2 --- Server/pom.xml | 2 +- pom.xml | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Server/pom.xml b/Server/pom.xml index abaa24bd..86febd97 100644 --- a/Server/pom.xml +++ b/Server/pom.xml @@ -7,7 +7,7 @@ net.sf.openas2 OpenAS2 - 4.5.2 + 4.6.0 ../pom.xml diff --git a/pom.xml b/pom.xml index ba35ab7b..85cc5298 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 net.sf.openas2 OpenAS2 - 4.5.2 + 4.6.0 OpenAS2 pom @@ -46,7 +46,7 @@ org.dom4j dom4j - 2.1.4 + 2.2.0 org.bouncycastle @@ -81,12 +81,12 @@ commons-cli commons-cli - 1.9.0 + 1.10.0 com.sun.mail jakarta.mail - 2.0.1 + 2.0.2 com.h2database @@ -108,7 +108,7 @@ org.junit.jupiter junit-jupiter - 5.13.1 + 5.13.4 test @@ -136,7 +136,7 @@ commons-io commons-io - 2.19.0 + 2.20.0 org.slf4j @@ -167,13 +167,13 @@ com.fasterxml.jackson.core jackson-databind - 2.19.0 + 2.19.2 jar com.fasterxml.jackson.module jackson-module-jaxb-annotations - 2.19.0 + 2.19.2 org.glassfish.jersey.media @@ -204,7 +204,7 @@ com.zaxxer HikariCP - 6.3.0 + 7.0.0 From 03cbbad4b9151cd292e503a2b28b5ab366e2e925 Mon Sep 17 00:00:00 2001 From: Christopher Broderick Date: Mon, 4 Aug 2025 12:36:27 +0100 Subject: [PATCH 20/20] Add release notes --- RELEASE-NOTES.md | 22 +++++++++++++++------- changes.txt | 12 ++++++++++++ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index a36dcecd..6a56a991 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -1,20 +1,28 @@ # OpenAS2 Server -# Version 4.5.2 +# Version 4.6.0 # RELEASE NOTES ----- -The OpenAS2 project is pleased to announce the release of OpenAS2 4.5.2 +The OpenAS2 project is pleased to announce the release of OpenAS2 4.6.0 -The release download file is: OpenAS2Server-4.5.2.zip +The release download file is: OpenAS2Server-4.6.0.zip The zip file contains a PDF document (OpenAS2HowTo.pdf) providing information on installing and using the application. ## NOTE: Testing covers Java 11 to 21. ## Java 8 is NO LONGER SUPPORTED. -Version 4.5.2 - 2025-06-12 +Version 4.6.0 - 2025-08-04 + +This is a testing enhancement release. + +1. Reworked the resource access class +2. changed tests to use the same config that is provided in the installer package +3. Optimised method to wait for files to appear on file system as part of end-to-end tests +4. Created script to generate test certificates keystore with updated certificates +5. Added maven phase to regenerate test certificates keystore prior to running tests +6. Updated Maven wrapper for project +7. Added Java 24 to test matrix -This is a bugfix release. -1. Fix database connection setup for healthcheck module. ##Upgrade Notes See the openAS2HowTo appendix for the general process on upgrading OpenAS2. @@ -24,7 +32,7 @@ This is a bugfix release. **You must review all notes for the relevant intermediate versions from your version to this release version.** ### Upgrading to 4.0 or newer from any older version: - 1. Ensure you implement all logging that you had configured for ealrier versions using the logback configuration or replace with another framework that works with SLF4J facade. See the OpenAS2HowTo.pdf logging section for more details. + 1. Ensure you implement all logging that you had configured for earlier versions using the logback configuration or replace with another framework that works with SLF4J facade. See the OpenAS2HowTo.pdf logging section for more details. 2. The property for email configuration in the config.xml changed: Change ALL occurrences of javax.mail.properties to jakarta.mail.properties in config.xml and the .properties file if you implemented it. 3. If using an external database for message state tracking, make sure that your configuration will work with the new Hikari JDBC pool that improves performance. See the OpenAS2HowTo.pdf message state tracking section for more details. diff --git a/changes.txt b/changes.txt index 57aab4b3..118b6e5c 100644 --- a/changes.txt +++ b/changes.txt @@ -1,5 +1,17 @@ **IMPORTANT NOTE**: Please review upgrade notes in the RELEASE-NOTES.md if you are upgrading +Version 4.6.0 - 2025-08-04 + +This is a testing enhancement release. + +1. Reworked the resource access class +2. changed tests to use the same config that is provided in the installer package +3. Optimised method to wait for files to appear on file system as part of end-to-end tests +4. Created script to generate test certificates keystore with updated certificates +5. Added maven phase to regenerate test certificates keystore prior to running tests +6. Updated Maven wrapper for project +7. Added Java 24 to test matrix + Version 4.5.2 - 2025-06-12 This is a bugfix release.