From bbb97952f0ab9a80562f87346ecadbfdc8df9108 Mon Sep 17 00:00:00 2001 From: Andreas Isler Date: Thu, 9 Jan 2025 20:45:16 +0100 Subject: [PATCH] initial commit --- .gitignore | 33 +++ .idea/.gitignore | 8 + .idea/misc.xml | 79 ++++++ .mvn/wrapper/maven-wrapper.properties | 19 ++ HELP.md | 18 ++ mvnw | 259 ++++++++++++++++++ mvnw.cmd | 149 ++++++++++ pom.xml | 81 ++++++ .../example/parser/FlowableExcelParser.java | 52 ++++ .../example/parser/FlowableJsonParser.java | 107 ++++++++ .../java/com/example/parser/ParserApp.java | 37 +++ src/main/resources/application.properties | 1 + .../flowableExcelParserExampleData.xlsx | Bin 0 -> 10251 bytes .../flowableJsonParserExampleData.json | 163 +++++++++++ .../parser/FlowableExcelParserTest.java | 117 ++++++++ .../parser/FlowableJsonParserTest.java | 54 ++++ .../flowableExcelParserTestData1.xlsx | Bin 0 -> 10167 bytes .../flowableExcelParserTestData2.xlsx | Bin 0 -> 10251 bytes .../flowableExcelParserTestData3.xlsx | Bin 0 -> 10219 bytes .../resources/flowableJsonParserTestData.json | 163 +++++++++++ target/classes/application.properties | 1 + .../parser/FlowableExcelParser$1.class | Bin 0 -> 825 bytes .../example/parser/FlowableExcelParser.class | Bin 0 -> 4562 bytes .../example/parser/FlowableJsonParser.class | Bin 0 -> 5635 bytes .../com/example/parser/ParserApp.class | Bin 0 -> 3186 bytes .../flowableExcelParserExampleData.xlsx | Bin 0 -> 10251 bytes .../flowableJsonParserExampleData.json | 163 +++++++++++ .../parser/FlowableExcelParserTest.class | Bin 0 -> 8675 bytes .../parser/FlowableJsonParserTest.class | Bin 0 -> 3266 bytes .../flowableExcelParserTestData1.xlsx | Bin 0 -> 10167 bytes .../flowableExcelParserTestData2.xlsx | Bin 0 -> 10251 bytes .../flowableExcelParserTestData3.xlsx | Bin 0 -> 10219 bytes .../flowableJsonParserTestData.json | 163 +++++++++++ 33 files changed, 1667 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/misc.xml create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100644 HELP.md create mode 100755 mvnw create mode 100644 mvnw.cmd create mode 100644 pom.xml create mode 100644 src/main/java/com/example/parser/FlowableExcelParser.java create mode 100644 src/main/java/com/example/parser/FlowableJsonParser.java create mode 100644 src/main/java/com/example/parser/ParserApp.java create mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/flowableExcelParserExampleData.xlsx create mode 100644 src/main/resources/flowableJsonParserExampleData.json create mode 100644 src/test/java/com/example/parser/FlowableExcelParserTest.java create mode 100644 src/test/java/com/example/parser/FlowableJsonParserTest.java create mode 100644 src/test/resources/flowableExcelParserTestData1.xlsx create mode 100644 src/test/resources/flowableExcelParserTestData2.xlsx create mode 100644 src/test/resources/flowableExcelParserTestData3.xlsx create mode 100644 src/test/resources/flowableJsonParserTestData.json create mode 100644 target/classes/application.properties create mode 100644 target/classes/com/example/parser/FlowableExcelParser$1.class create mode 100644 target/classes/com/example/parser/FlowableExcelParser.class create mode 100644 target/classes/com/example/parser/FlowableJsonParser.class create mode 100644 target/classes/com/example/parser/ParserApp.class create mode 100644 target/classes/flowableExcelParserExampleData.xlsx create mode 100644 target/classes/flowableJsonParserExampleData.json create mode 100644 target/test-classes/com/example/parser/FlowableExcelParserTest.class create mode 100644 target/test-classes/com/example/parser/FlowableJsonParserTest.class create mode 100644 target/test-classes/flowableExcelParserTestData1.xlsx create mode 100644 target/test-classes/flowableExcelParserTestData2.xlsx create mode 100644 target/test-classes/flowableExcelParserTestData3.xlsx create mode 100644 target/test-classes/flowableJsonParserTestData.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..b268cf8 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + Android + + + CorrectnessLintAndroid + + + Groovy + + + InitializationJava + + + J2ME issuesJava + + + Java + + + JavaScript + + + Kotlin + + + LintAndroid + + + MemoryJava + + + PerformanceJava + + + PerformanceLintAndroid + + + Plugin DevKit + + + Potentially confusing code constructsJavaScript + + + Probable bugsJava + + + Redundant constructsKotlin + + + RegExp + + + Threading issuesGroovy + + + Threading issuesJava + + + + + + + + + \ No newline at end of file diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..d58dfb7 --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip diff --git a/HELP.md b/HELP.md new file mode 100644 index 0000000..63bad94 --- /dev/null +++ b/HELP.md @@ -0,0 +1,18 @@ +# Getting Started + +### Reference Documentation + +For further reference, please consider the following sections: + +* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html) +* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/3.3.4/maven-plugin) +* [Create an OCI image](https://docs.spring.io/spring-boot/3.3.4/maven-plugin/build-image.html) + +### Maven Parent overrides + +Due to Maven's design, elements are inherited from the parent POM to the project POM. +While most of the inheritance is fine, it also inherits unwanted elements like `` and `` from the +parent. +To prevent this, the project POM contains empty overrides for these elements. +If you manually switch to a different parent and actually want the inheritance, you need to remove those overrides. + diff --git a/mvnw b/mvnw new file mode 100755 index 0000000..19529dd --- /dev/null +++ b/mvnw @@ -0,0 +1,259 @@ +#!/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.2 +# +# 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:]' +} + +# 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 <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + 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${0##*/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 +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..249bdf3 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,149 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..c85fa9d --- /dev/null +++ b/pom.xml @@ -0,0 +1,81 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.3.4 + + + com.example + Parser + 0.0.1-SNAPSHOT + ParseJson + ParseJson + + + + + + + + + + + + + + + 17 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + com.fasterxml.jackson.core + jackson-databind + 2.17.1 + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.17.1 + + + org.apache.poi + poi + 5.2.5 + + + org.apache.poi + poi-ooxml + 5.2.5 + + + org.jetbrains + annotations + 17.0.0 + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/src/main/java/com/example/parser/FlowableExcelParser.java b/src/main/java/com/example/parser/FlowableExcelParser.java new file mode 100644 index 0000000..1efdc27 --- /dev/null +++ b/src/main/java/com/example/parser/FlowableExcelParser.java @@ -0,0 +1,52 @@ +package com.example.parser; + +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import org.springframework.stereotype.Component; + +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + +@Component +public class FlowableExcelParser { + public ArrayList> parseExcel(String resourcePath, List colNumberList) { + ArrayList> rowList = new ArrayList<>(); + try (FileInputStream fileInputStream = new FileInputStream(resourcePath)) { + Workbook workbook = new XSSFWorkbook(fileInputStream); + Sheet sheet = workbook.getSheetAt(0); + ArrayList colHeaders = new ArrayList<>(); + for (Row row : sheet) { + if (row.getRowNum() == 0) { + // Header row + for (Integer colNumber : colNumberList) { + colHeaders.add(row.getCell(colNumber).getStringCellValue()); + } + continue; + } + LinkedHashMap rowMap = new LinkedHashMap<>(); + for (int i = 0; i < colNumberList.size(); i++) { + Integer colNumber = colNumberList.get(i); + Object content = null; + Cell cell = row.getCell(colNumber); + CellValue cellValue = workbook.getCreationHelper().createFormulaEvaluator().evaluate(cell); + if (cellValue != null) { + switch (cellValue.getCellType()) { + case STRING : content = cellValue.getStringValue(); break; + case BOOLEAN : content = cellValue.getBooleanValue(); break; + case NUMERIC : content = cellValue.getNumberValue(); break; + } + } + rowMap.put(colHeaders.get(i), content); + } + rowList.add(rowMap); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + return rowList; + } +} diff --git a/src/main/java/com/example/parser/FlowableJsonParser.java b/src/main/java/com/example/parser/FlowableJsonParser.java new file mode 100644 index 0000000..6db4196 --- /dev/null +++ b/src/main/java/com/example/parser/FlowableJsonParser.java @@ -0,0 +1,107 @@ +package com.example.parser; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.springframework.stereotype.Component; + +import java.time.Instant; +import java.util.*; + +@Component +public class FlowableJsonParser { + + private static final ObjectMapper objectMapper = new ObjectMapper(); + private static final JavaTimeModule javaTimeModule = new JavaTimeModule(); + + public static final String BOOLEAN = "Boolean"; + public static final String STRING = "String"; + public static final String INTEGER = "Integer"; + public static final String DOUBLE = "Double"; + public static final String LONG = "Long"; + public static final String INSTANT = "Instant"; + public static final String JSON_OBJECT_NODE = "JsonObjectNode"; + public static final String JSON_ARRAY_NODE = "JsonArrayNode"; + public static final String MAP = "Map"; + public static final String ARRAY_LIST = "ArrayList"; + + + public FlowableJsonParser() { + objectMapper.registerModule(javaTimeModule); + objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + } + + public Map parseMap(Object map) throws JsonProcessingException, ClassCastException { + return (Map) parseObject(map); + } + + public Object parseObject(Object object) throws JsonProcessingException, ClassCastException { + if (object instanceof Map) { + Map resultMap = new LinkedHashMap<>(Map.of()); + for (Map.Entry mapEntry : ((Map) object).entrySet()) { + String key = mapEntry.getKey(); + resultMap.put(key, parseMapEntry(key, mapEntry.getValue())); + } + return resultMap; + } + if (object instanceof ArrayList) { + ArrayList resultList = new ArrayList<>(); + for (Object arrayEntry : (ArrayList) object) { + resultList.add(parseArrayEntry(arrayEntry)); + } + return resultList; + } + return null; + } + + private Object parseMapEntry(String key, Object value) throws JsonProcessingException { + if (value instanceof Map) { + Map valueMap = (Map) value; + if (valueMap.containsKey("__TYPE") && valueMap.containsKey("__VALUE") && valueMap.size() == 2) { + // if Map in Map, check if inner Map has explicit type (__TYPE and __VALUE) + return convertObjectExplicit(valueMap.get("__VALUE"), (String) valueMap.get("__TYPE")); + } + if (Arrays.asList("__IN", "__OUT").contains(key)) { + // convert __IN and __OUT maps as Map + return parseObject(value); + } + // convert Map to JsonObjectNode (default in models) + return convertObjectExplicit(value, JSON_OBJECT_NODE); + } + if (value instanceof ArrayList) { + // convert ArrayList to JsonArrayNode (default in models) + return convertObjectExplicit(value, JSON_ARRAY_NODE); + } + // take json supported type (Boolean, String, Integer, Double) + return value; + } + + private Object parseArrayEntry(Object value) throws JsonProcessingException { + if (value instanceof Map) { + // convert Map to JsonObjectNode (default in models) + return convertObjectExplicit(value, JSON_OBJECT_NODE); + } + if (value instanceof ArrayList) { + // convert ArrayList to JsonArrayNode (default in models) + return convertObjectExplicit(value, JSON_ARRAY_NODE); + } + // take json supported type (Boolean, String, Integer, Double) + return value; + } + + private Object convertObjectExplicit(Object value, String explicitType) throws JsonProcessingException { + switch (explicitType) { + case BOOLEAN: return Boolean.parseBoolean(value.toString()); + case STRING: return value.toString(); + case INTEGER: return Integer.parseInt(value.toString()); + case DOUBLE: return Double.parseDouble(value.toString()); + case LONG: return Long.parseLong(value.toString()); + case INSTANT: return Instant.parse(value.toString()); + case MAP: case ARRAY_LIST: return parseObject(value); + case JSON_OBJECT_NODE: case JSON_ARRAY_NODE: return objectMapper.convertValue(parseObject(value), JsonNode.class); + default: return value; + } + } +} diff --git a/src/main/java/com/example/parser/ParserApp.java b/src/main/java/com/example/parser/ParserApp.java new file mode 100644 index 0000000..2dc04e3 --- /dev/null +++ b/src/main/java/com/example/parser/ParserApp.java @@ -0,0 +1,37 @@ +package com.example.parser; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.List; +import java.util.Map; + +@SpringBootApplication +public class ParserApp { + + private static final Logger logger = LoggerFactory.getLogger(ParserApp.class); + private static final ObjectMapper objectMapper = new ObjectMapper(); + private static final FlowableJsonParser flowableJsonParser = new FlowableJsonParser(); + private static final FlowableExcelParser flowableExcelParser = new FlowableExcelParser(); + + public static void main(String[] args) { + SpringApplication.run(ParserApp.class, args); + + try (InputStream varStream = ClassLoader.getSystemClassLoader().getResourceAsStream("flowableJsonParserExampleData.json")) { + logger.info("parsed json={}", flowableJsonParser.parseMap(objectMapper.readValue(varStream, Map.class))); + } catch (IOException e) { + throw new RuntimeException(e); + } + + ClassLoader classLoader = ParserApp.class.getClassLoader(); + URL resourceUrl = classLoader.getResource("flowableExcelParserExampleData.xlsx"); + assert resourceUrl != null; + logger.info("parsed excel={}", flowableExcelParser.parseExcel(resourceUrl.getPath(), List.of(0,1,2,4,5,6))); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..c72dd73 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=ParseJson diff --git a/src/main/resources/flowableExcelParserExampleData.xlsx b/src/main/resources/flowableExcelParserExampleData.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..99b5d78b41b6f354bbd27fa70bd152bef8ed83cc GIT binary patch literal 10251 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 G>3;x-*x1Sd literal 0 HcmV?d00001 diff --git a/src/main/resources/flowableJsonParserExampleData.json b/src/main/resources/flowableJsonParserExampleData.json new file mode 100644 index 0000000..4c1c59b --- /dev/null +++ b/src/main/resources/flowableJsonParserExampleData.json @@ -0,0 +1,163 @@ +{ + "myBool": true, + "myString": "Hello", + "myInteger": 1234, + "myDouble": 1234.0, + "myMap": { + "myMapBool": true, + "myMapString": "Hello", + "myMapInteger": 1234, + "myMapDouble": 1234.0, + "myMapMap": { + "myMapMapBool" : true, + "myMapMapString": "Hello", + "myMapMapInteger": 1234, + "myMapMapDouble": 1234.0 + }, + "myMapArray": [ + true, + "myMapArrayString", + 1234, + 1234.0 + ] + }, + "myArray": [ + true, + "myArrayString", + 1234, + 1234.0, + { + "myArrayMapBool" : true, + "myArrayMapString": "Hello", + "myArrayMapInteger": 1234, + "myArrayMapDouble": 1234.0 + }, + [ + true, + "myArrayArrayString", + 1234, + 1234.0 + ] + ], + "myTypedBoolean": { + "__TYPE": "Boolean", + "__VALUE": true + }, + "myTypedString": { + "__TYPE": "String", + "__VALUE": "Hello" + }, + "myTypedInteger": { + "__TYPE": "Integer", + "__VALUE": 1234 + }, + "myTypedDouble": { + "__TYPE": "Double", + "__VALUE": 1234.0 + }, + "myTypedLong": { + "__TYPE": "Long", + "__VALUE": "9876543210" + }, + "myTypedInstant": { + "__TYPE": "Instant", + "__VALUE": "2024-12-01T12:34:56Z" + }, + "myTypedMap": { + "__TYPE": "Map", + "__VALUE": { + "myTypedMapBool": true, + "myTypedMapString": "Hello", + "myTypedMapInteger": 1234, + "myTypedMapDouble": 1234.0 + } + }, + "myTypedArray": { + "__TYPE": "ArrayList", + "__VALUE": [ + true, + "Hello", + 1234, + 1234.0 + ] + }, + "myTypedJsonObject": { + "__TYPE": "JsonObjectNode", + "__VALUE": { + "myTypedJsonObjectBool": { + "__TYPE": "Boolean", + "__VALUE": true + }, + "myTypedJsonObjectString": { + "__TYPE": "String", + "__VALUE": "Hello" + }, + "myTypedJsonObjectInteger": { + "__TYPE": "Integer", + "__VALUE": 1234 + }, + "myTypedJsonObjectDouble": { + "__TYPE": "Double", + "__VALUE": 1234.0 + }, + "myTypedJsonObjectLong": { + "__TYPE": "Long", + "__VALUE": "9876543210" + }, + "myTypedJsonObjectInstant": { + "__TYPE": "Instant", + "__VALUE": "2024-12-01T12:34:56Z" + }, + "myTypedJsonObjectMap": { + "__TYPE": "Map", + "__VALUE": { + "myTypedJsonObjectMapBool" : true, + "myTypedJsonObjectMapString": "Hello", + "myTypedJsonObjectMapInteger": 1234, + "myTypedJsonObjectMapDouble": 1234.0 + } + }, + "myTypedJsonObjectArrayList": { + "__TYPE": "ArrayList", + "__VALUE": [ + true, + "myTypedJsonObjectArrayListString", + 1234, + 1234.0 + ] + } + } + }, + "myTypedJsonArray": { + "__TYPE": "JsonArrayNode", + "__VALUE": [ + true, + "Hello", + 1234, + 1234.0, + { + "myTypedJsonArrayBool" : true, + "myTypedJsonArrayString": "Hello", + "myTypedJsonArrayInteger": 1234, + "myTypedJsonArrayDouble": 1234.0 + }, + [ + true, + "myArrayArrayString", + 1234, + 1234.0 + ] + ] + }, + "__IN": { + "getClassParam": { + "__TYPE": "ArrayList", + "__VALUE": [ + "Hello" + ] + } + }, + "__OUT": { + "getClassResult": "getClassResult" + } +} \ No newline at end of file diff --git a/src/test/java/com/example/parser/FlowableExcelParserTest.java b/src/test/java/com/example/parser/FlowableExcelParserTest.java new file mode 100644 index 0000000..d16e72c --- /dev/null +++ b/src/test/java/com/example/parser/FlowableExcelParserTest.java @@ -0,0 +1,117 @@ +package com.example.parser; + +import org.assertj.core.api.Assertions; +import org.jetbrains.annotations.NotNull; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.net.URL; +import java.util.*; +import java.util.stream.Stream; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@SpringBootTest +class FlowableExcelParserTest { + + @Autowired + private FlowableExcelParser flowableExcelParser; + + private Stream GetArgumentsFromExcel(String path, List colNumberList) { + ArrayList argumentList = new ArrayList<>(); + ClassLoader classLoader = FlowableExcelParserTest.class.getClassLoader(); + URL resourceUrl = classLoader.getResource(path); + Assertions.assertThat(resourceUrl).isNotNull(); + ArrayList> rowList = flowableExcelParser.parseExcel(resourceUrl.getPath(), colNumberList); + Assertions.assertThat(rowList).isNotNull(); + for (LinkedHashMap row : rowList) { + LinkedHashMap inputMap = new LinkedHashMap<>(); + LinkedHashMap outputMap = new LinkedHashMap<>(); + for (Map.Entry entry : row.entrySet()) { + String key = entry.getKey(); + if (List.of("input1", "input2", "input3").contains(key)) { + inputMap.put(key, entry.getValue()); + } + if (List.of("output1", "output2").contains(key)) { + outputMap.put(key, entry.getValue()); + } + } + argumentList.add(Arguments.of(inputMap, outputMap)); + } + return argumentList.stream(); + } + + @NotNull + private Stream booleanExcelParserTestDataProvider() { + return GetArgumentsFromExcel("flowableExcelParserTestData1.xlsx", List.of(0,1,2,4,5)); + } + + @ParameterizedTest + @MethodSource("booleanExcelParserTestDataProvider") + void booleanExcelParserTest(LinkedHashMap inputMap, LinkedHashMap outputMap) { + for (Map.Entry entry : outputMap.entrySet()) { + String key = entry.getKey(); + if (key.equals("output1")) { + Boolean val = (Boolean)inputMap.get("input1") || (Boolean)inputMap.get("input2") || (Boolean)inputMap.get("input3"); + Assertions.assertThat(entry.getValue()).isEqualTo(val); + } + if (key.equals("output2")) { + Boolean val = (Boolean)inputMap.get("input1") && (Boolean)inputMap.get("input2") && (Boolean)inputMap.get("input3"); + Assertions.assertThat(entry.getValue()).isEqualTo(val); + } + } + } + + @NotNull + private Stream stringExcelParserTestDataProvider() { + return GetArgumentsFromExcel("flowableExcelParserTestData2.xlsx", List.of(0,1,2,4,5,6)); + } + + @ParameterizedTest + @MethodSource("stringExcelParserTestDataProvider") + void stringExcelParserTest(LinkedHashMap inputMap, LinkedHashMap outputMap) { + for (Map.Entry entry : outputMap.entrySet()) { + String key = entry.getKey(); + if (key.equals("output1")) { + String val = inputMap.get("input1").toString() + inputMap.get("input2").toString(); + Assertions.assertThat(entry.getValue()).isEqualTo(val); + } + if (key.equals("output2")) { + String val = inputMap.get("input2").toString() + inputMap.get("input3").toString(); + Assertions.assertThat(entry.getValue()).isEqualTo(val); + } + if (key.equals("output3")) { + String val = inputMap.get("input1").toString() + inputMap.get("input2").toString() + inputMap.get("input3").toString(); + Assertions.assertThat(entry.getValue()).isEqualTo(val); + } + } + } + + @NotNull + private Stream numberExcelParserTestDataProvider() { + return GetArgumentsFromExcel("flowableExcelParserTestData3.xlsx", List.of(0,1,2,4,5,6)); + } + + @ParameterizedTest + @MethodSource("numberExcelParserTestDataProvider") + void numberExcelParserTest(LinkedHashMap inputMap, LinkedHashMap outputMap) { + for (Map.Entry entry : outputMap.entrySet()) { + String key = entry.getKey(); + if (key.equals("output1")) { + Double val = (Double)inputMap.get("input1") + (Double)inputMap.get("input2"); + Assertions.assertThat(entry.getValue()).isEqualTo(val); + } + if (key.equals("output2")) { + Double val = (Double)inputMap.get("input2") + (Double)inputMap.get("input3"); + Assertions.assertThat(entry.getValue()).isEqualTo(val); + } + if (key.equals("output3")) { + Double val = (Double)inputMap.get("input1") + (Double)inputMap.get("input2") + (Double)inputMap.get("input3"); + Assertions.assertThat(entry.getValue()).isEqualTo(val); + } + } + } +} diff --git a/src/test/java/com/example/parser/FlowableJsonParserTest.java b/src/test/java/com/example/parser/FlowableJsonParserTest.java new file mode 100644 index 0000000..67dbdd8 --- /dev/null +++ b/src/test/java/com/example/parser/FlowableJsonParserTest.java @@ -0,0 +1,54 @@ +package com.example.parser; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.util.Assert; + +import java.io.IOException; +import java.io.InputStream; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Map; + +@SpringBootTest +class FlowableJsonParserTest { + + private static final ObjectMapper objectMapper = new ObjectMapper(); + private static final Logger logger = LoggerFactory.getLogger(FlowableJsonParser.class); + + @Test + void flowableJsonParserTest() throws IOException { + FlowableJsonParser parser = new FlowableJsonParser(); + Map result = parser.parseMap(Map.of()); + logger.info("parseObject={}", result); + Assert.isTrue(result.isEmpty(), "Map must be empty"); + + try (InputStream varStream = this.getClass().getClassLoader().getResourceAsStream("flowableJsonParserTestData.json")) { + result = parser.parseMap(objectMapper.readValue(varStream, Map.class)); + logger.info("parseObject={}", result); + Assert.isInstanceOf(Boolean.class, result.get("myBool")); + Assert.isInstanceOf(String.class, result.get("myString")); + Assert.isInstanceOf(Integer.class, result.get("myInteger")); + Assert.isInstanceOf(Double.class, result.get("myDouble")); + Assert.isInstanceOf(ObjectNode.class, result.get("myMap")); + Assert.isInstanceOf(ArrayNode.class, result.get("myArray")); + Assert.isInstanceOf(Boolean.class, result.get("myTypedBoolean")); + Assert.isInstanceOf(String.class, result.get("myTypedString")); + Assert.isInstanceOf(Integer.class, result.get("myTypedInteger")); + Assert.isInstanceOf(Double.class, result.get("myTypedDouble")); + Assert.isInstanceOf(Long.class, result.get("myTypedLong")); + Assert.isInstanceOf(Instant.class, result.get("myTypedInstant")); + Assert.isInstanceOf(Map.class, result.get("myTypedMap")); + Assert.isInstanceOf(ArrayList.class, result.get("myTypedArray")); + Assert.isInstanceOf(ObjectNode.class, result.get("myTypedJsonObject")); + Assert.isInstanceOf(ArrayNode.class, result.get("myTypedJsonArray")); + Assert.isInstanceOf(Map.class, result.get("__IN")); + Assert.isInstanceOf(Map.class, result.get("__OUT")); + } + } +} diff --git a/src/test/resources/flowableExcelParserTestData1.xlsx b/src/test/resources/flowableExcelParserTestData1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c1739f9d631d60e873964d87d54d997cc7251ce1 GIT binary patch literal 10167 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 G>3;x-*x1Sd literal 0 HcmV?d00001 diff --git a/src/test/resources/flowableExcelParserTestData3.xlsx b/src/test/resources/flowableExcelParserTestData3.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3209621287ace2a46e54d53c06e7ca0193687eb1 GIT binary patch literal 10219 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 XtSE~B4F>=K4f;cXdg%nsuYdmoX0*ln literal 0 HcmV?d00001 diff --git a/src/test/resources/flowableJsonParserTestData.json b/src/test/resources/flowableJsonParserTestData.json new file mode 100644 index 0000000..4c1c59b --- /dev/null +++ b/src/test/resources/flowableJsonParserTestData.json @@ -0,0 +1,163 @@ +{ + "myBool": true, + "myString": "Hello", + "myInteger": 1234, + "myDouble": 1234.0, + "myMap": { + "myMapBool": true, + "myMapString": "Hello", + "myMapInteger": 1234, + "myMapDouble": 1234.0, + "myMapMap": { + "myMapMapBool" : true, + "myMapMapString": "Hello", + "myMapMapInteger": 1234, + "myMapMapDouble": 1234.0 + }, + "myMapArray": [ + true, + "myMapArrayString", + 1234, + 1234.0 + ] + }, + "myArray": [ + true, + "myArrayString", + 1234, + 1234.0, + { + "myArrayMapBool" : true, + "myArrayMapString": "Hello", + "myArrayMapInteger": 1234, + "myArrayMapDouble": 1234.0 + }, + [ + true, + "myArrayArrayString", + 1234, + 1234.0 + ] + ], + "myTypedBoolean": { + "__TYPE": "Boolean", + "__VALUE": true + }, + "myTypedString": { + "__TYPE": "String", + "__VALUE": "Hello" + }, + "myTypedInteger": { + "__TYPE": "Integer", + "__VALUE": 1234 + }, + "myTypedDouble": { + "__TYPE": "Double", + "__VALUE": 1234.0 + }, + "myTypedLong": { + "__TYPE": "Long", + "__VALUE": "9876543210" + }, + "myTypedInstant": { + "__TYPE": "Instant", + "__VALUE": "2024-12-01T12:34:56Z" + }, + "myTypedMap": { + "__TYPE": "Map", + "__VALUE": { + "myTypedMapBool": true, + "myTypedMapString": "Hello", + "myTypedMapInteger": 1234, + "myTypedMapDouble": 1234.0 + } + }, + "myTypedArray": { + "__TYPE": "ArrayList", + "__VALUE": [ + true, + "Hello", + 1234, + 1234.0 + ] + }, + "myTypedJsonObject": { + "__TYPE": "JsonObjectNode", + "__VALUE": { + "myTypedJsonObjectBool": { + "__TYPE": "Boolean", + "__VALUE": true + }, + "myTypedJsonObjectString": { + "__TYPE": "String", + "__VALUE": "Hello" + }, + "myTypedJsonObjectInteger": { + "__TYPE": "Integer", + "__VALUE": 1234 + }, + "myTypedJsonObjectDouble": { + "__TYPE": "Double", + "__VALUE": 1234.0 + }, + "myTypedJsonObjectLong": { + "__TYPE": "Long", + "__VALUE": "9876543210" + }, + "myTypedJsonObjectInstant": { + "__TYPE": "Instant", + "__VALUE": "2024-12-01T12:34:56Z" + }, + "myTypedJsonObjectMap": { + "__TYPE": "Map", + "__VALUE": { + "myTypedJsonObjectMapBool" : true, + "myTypedJsonObjectMapString": "Hello", + "myTypedJsonObjectMapInteger": 1234, + "myTypedJsonObjectMapDouble": 1234.0 + } + }, + "myTypedJsonObjectArrayList": { + "__TYPE": "ArrayList", + "__VALUE": [ + true, + "myTypedJsonObjectArrayListString", + 1234, + 1234.0 + ] + } + } + }, + "myTypedJsonArray": { + "__TYPE": "JsonArrayNode", + "__VALUE": [ + true, + "Hello", + 1234, + 1234.0, + { + "myTypedJsonArrayBool" : true, + "myTypedJsonArrayString": "Hello", + "myTypedJsonArrayInteger": 1234, + "myTypedJsonArrayDouble": 1234.0 + }, + [ + true, + "myArrayArrayString", + 1234, + 1234.0 + ] + ] + }, + "__IN": { + "getClassParam": { + "__TYPE": "ArrayList", + "__VALUE": [ + "Hello" + ] + } + }, + "__OUT": { + "getClassResult": "getClassResult" + } +} \ No newline at end of file diff --git a/target/classes/application.properties b/target/classes/application.properties new file mode 100644 index 0000000..c72dd73 --- /dev/null +++ b/target/classes/application.properties @@ -0,0 +1 @@ +spring.application.name=ParseJson diff --git a/target/classes/com/example/parser/FlowableExcelParser$1.class b/target/classes/com/example/parser/FlowableExcelParser$1.class new file mode 100644 index 0000000000000000000000000000000000000000..c7cab7ae1eea08c90f876dfd9fbb750569322ba5 GIT binary patch literal 825 zcma)4U2hUW6g^WY3%IqkR*Utk>J~wb8%>N4ek4k$lEPvN)`va~!vwYtJ7i~R>mTs1 z_^c+z7}Fo%k22m_oATlV$?n`aXXoB~_T2gX=jRE4=eS?Q0x}M=E*6nv@N_)%`Gkv+ z^d~y>jq#^O#$!E@%CAeMdLJi}A$Q2tR2qg_wYJ}yC+BGac@!KJU7Ul1pHjafU-4+@2f8~IqwP?t zK_iZJY`d0ST((`ESDj9)@iMU76&F`iE_l~&>^AETt}~Qobvpe6DH4YKGoivLOkSkz z_878ta-Lzi6-F|cj{7q1S%(-_TUv0n$K%lAQ*x=BaPfhBI>p7Vp2k9Mhc=`9AA28I z2~@rj38hUK4cjsq>4Ae9nKj>pNOT}g@3`I#&yMwk*2gsBfm!1jFrlE=ypfU z4Qx`pN$3+Yv;&^}06Y0r{08T%eU`psCENLo>`n^T2`}!`Gz7q-cLllk4xMP9Ey!XkJy4-^5USF8H)X20N3oddrcEjT E7dnu|UH||9 literal 0 HcmV?d00001 diff --git a/target/classes/com/example/parser/FlowableExcelParser.class b/target/classes/com/example/parser/FlowableExcelParser.class new file mode 100644 index 0000000000000000000000000000000000000000..0a6af2ae91ff328f1745b231f3dcb55ff3fdd42b GIT binary patch literal 4562 zcmbtX>vt4q8UMYxy}PrM3xPlfO1XvRQpiHlS~fuCmJ$gBSqg=UI@t`#z-DKinI!>l zwXN1`OV!r47Pa+~TC28I11VbSt!lj=Klsfr9{&J8)^pnUduL{o*?^m#V{&%poq3=8 z^Lw7>o!8%b`4s@$@mCEssFkSGQI7_Jmeb~0Go3dJBk94R(^k$GXxL^KY=4J9ZD-d} ziG;x7fT-l#`SecLHO~#$p07bFIVpi zB5vD-kzOUdMWEYpN781|%#B*G4cW1MG#~k;}kmH=u(2Q0k zak0P+kwof^>7>vU+OSk&nT{J^2(-@=?|CudWx)d4h~;NTEz94@2;AJ+-!)K;FQDvA zVFhlKSgGSCtP)tWAcsK0_AS@+9ams!XIB`LAg=ws;u|Bm#2O z^bT4Rw3I12p*T8pbfQb3t`NLlQkES{Y_G&E0;{SSdDt0Gp&J`@^dK#eWK8(#U}-E+ z)Stp;sxDX1Gg^0nC3Z~5-8g=2omCXV zd{s+xN|x2>{gn}mrWiJXpMP;_U`8B1Fe=2$V$9%Q;~KIy)^Gj0y$t-TXDD}N|>*S=XG z-JTt{{hUg+>MZSH<7#K)YWKYM*|ycL;CAF(k-}^4>DMrVQ3+eeX`CV0tHmIO(^OO* zp`6YIB45_nt6>ZU2}eg!L9l8AEHkkd9e3C+n0aNZtHVgFEw*( zm*eCuvk>h~;GD#H9UsO=Dw;t=MGY#I*5E1C`cA~*A5qZo5qwO?$8m3{nvG}3as%-} z1KOkEKHM+yfKu|wirKZtDKS^7u=d0yhp#DE;()}bD_Fw1R~7qN9iPMJse+?R;P&{a ziYoKkT8(Roh}67$NXNr!tk&o9j%P_cQXZZ`BR(?fhM>}L0bkPbWjrd-$Yzr*6^pLr zc^2DFd9YP-1k>^>Woc^Y4Ju?7Rez9pLSXq^J2_k``1V+U++bhB>*;7}THawfZ}YpdtzWt~52d#t5_wF7^SS- zMg%$*WC+kp1BA_AKMz+#0DFgk5%Z;DhLE_HL_AMa70$s-%EWkdG-6t-l9x|9i$<0}Z zOn6vL#1&y`zFFHpI7u8$tb505N`;+Cf{d z3&-nlE86uH+B`o_R)(pfI~t>#jc`PK?Rg_ErHZLaaAVdtb7u&>$o-ZBmOttYbF!IZ z77w4yZZd0+6imP5GCvP5T#j+&b1qa1%KznnmJM*BJ~G%OuQQ%|RC6HmqV{*x_H1^i zorQwq2gfLS*d0LLE2{60Q_68wK538cTaHg?q<1@GMW?_aPZ@C^Yc;H9nGSX<6 z#&Us7!bnVGwct2NsnyK_ucAAXG?LTUAn+u1Y?#I-(rJbk(xFSO0=g}klp&3zk($Cg zr*V4?rm;<63cHR?&irk1=GiOgqfPrVTJ3GAwiE@inLUFiHngRtF;GKATQa)HG*W_I zmXK*O>Zfr?P}C9TrD+-`Xm+#F{2KaS!Uv7!DV&-@zUMi{Arr)cLEzosZykS|6vc-! zjgwfeR{mv-tA|GQ@X^co1hr{~Y@@}WdKC{EjZ^r{u?JFOa%O0wp#_$|^>3qY3SXFn z!MKGhJ=0*+8x2$VqEUZ!63r^Mj|Z`R^6JJHsJ~V07g<~ocZn0?B>kVMM$8P|BJB_OVGh{`z9>KAeP}ctslp7Jj8FqM{pxY{7txsRrntHE)zCauol0g zcmLq$-9LGdN-+AZ=n$*WDZ2Q9*2^!+o!BV$p+~4Mh%D`~v6&X6MS;niz^ws_o~I4t z)c0+C2PsOvKUnFMe=jESEE=iB#dq->nyBj}^*slMub?6aI988!z&8gTwNs| zY8W{eKPPW3e!-Y^lRnh?OY(%n!#2iC7zOaP-3%$l+YyF zBvu6LHNczbkm#0J^B<&Z-b6~GPt5Qb*;0ioVCWMPTO?{EwoB3@sV8R`P73&++Cn~H zhM}sTM+e*~aY5}g%-i8>P}haT8>rbO@mLDKrE|#|MhlD+m?zalUT1WEAFTd>Kk}|R W#-DiqGk1LX2yV(i5 zn_f~8s0yN7)5#-pp<%G!V$|H#_fp^S$r* zf5&?-kG^#Og8){DKmZwUGnp4CU7pIM@+$?rwRL@E z@S{vaKu0-rftsW>6gGDlL&Iq^JZxlhW;VP!ZEZI;rOl3z57 zDc5Z_a(OemV<;WoVkEbcJKS&NjZLXczoXk`ZZm}az)WdhJT+u?S^XnvQ=sW} zMCEr5o8c|F?4pIIhdU;%YYrfYV>QguF&lFP8s3CGG$Lybq@?WyBl>Dz#|q_;&DmTx z9iI()(ebySO2ctFj>icCi>5I$W@b}HIx9s)5wox2~gF#-blPX(bf`gk0n}S ziFl-|Jr-~2>WK-QIh{FEiB#Cl({UoI1opVM=iu-W(_aX2X0PC*u@> za+Pw0L_M{(^VQi)z>k{JaH_xzH9e9~rNabUL#@EvBU7EJ%vQ7i93wZ#kL9RAy^aPn z3V5u|0>{)kQVYw8$O4=uD<~`wbgU?Ttm~5!7V0AldtkH3f6i_-~=Fc^EYUr5MNn-hI zDl;G%J9TtPMn4(*jP!^pquH&a2XCjlDw-6mQ*bDnR7N<@_vn9oxgG)o=Ro9_E#tQ`+TJ01>=T#}yJeKTBb-Rq?%_*sijy zv}t4{#|LzLP^v36FB&n@IX|x9*oMN7>&P3)&J)qq0JiMhUdqJiASfE8Svu< z#gfY#nYQNG!*7TSD)n$oj2Ddm2t z=%6&E&8^5@NIehWK@DHl@em#^B$Co2L&nG`U+nReIy$6;uSy+XV^65{#w)Y`)(SSTN1@FSFcE z@F2dY|$X-TdWgiHF3;1s1=y5wCsP3g9t#Wqoyb zceb}gxi7i0%}EuOX{%+UI3-K#pBM`8sIwLWz^U3NbFL!)1Ix@7$%*N%} zRhnoejdY*EBNb_9(w84hv4bs8$EInIz0HOCVC@T>JO%bn1{IGA>=Q$h*Nu-8CfeP; zBWVuHvt3TZp9RjCIuuDOYlhX?J8LD)T#h?$aiNCi1x`3p=_=r@JcbuJh-8= zjI1$a@?1fG%VMd4jB}ifOz+0>qoeDZar{|Hbi7;5oy3SPJ3Ibto3DU}eZU}NS=P*r zr1J{Lipf0u8ZhLh?1%{1to9D$mRIb%Tv2K{cbhqrqs;q)6KUskFxiqf?AV!;ZG6M) z-1$(n*S*>W-i%nDwrk$%?AZCqZljiD_O!c`( z-`Gx*Il{X`??^^AqP|ov#VTmYWURcpT`(!?JFVbltQhXjf zhri&j9G3`w0RG0ugBQran-uM*CULRy3E0>0FlzSWyn|SL?_Ve#k$*Hezb9vvitU9 z@j>*hKY;V3;Jz`eFG{SkB`)(d)>rw)uwe`raNX05qe8mvQ*JLKazGuUP)|G?cxh@x z3qn|j)35o_T$?MiuEW#cv#x>-)9!=QGYn6oR9Ik93V1H*!OZaU*{(*l|b`Tx- z7yeCL_Anp+L->4@QHTHHe+t}vMR51wkOKGrlvYjjY#A>WWgI5Iz49fFURGSChjEgI z8V${du=EhbVa(Ccr^tCErwY^|F7(LDkrSYqR3Ou5ccTi>U?Zav4F!z}Bt4AA>7n3e zXIMiR2brU{;P`qqoAy94^34d1!5S@j0Fm|HU@o@a7aWO=V|&8{c1tm3^^Hul(fY>V zWs;A&7_f4ZdlY#j4)qAonB_!s1@m_$qi{Cwc&l(BfBUfpX&$6=IF~npsKULT#_RG_ zO^m(LjUt}ARV-vO?-qi{dLWUNHDU7~Cci{+27E7~jVPXY2--{qnU74*smw0(PztzS zg2wBZ4H_>)UeZ9doz>;_4Ypr)B1%&E)gb-ys{ES6tN?oHSDgK*kC}2F=3%3&%&Lo) zS1Wskvd#xj#jA}f5spE;gV_doG`^`oT;3S_2Jq5^3eB_IApigX literal 0 HcmV?d00001 diff --git a/target/classes/com/example/parser/ParserApp.class b/target/classes/com/example/parser/ParserApp.class new file mode 100644 index 0000000000000000000000000000000000000000..1e71c4baecbd911d7e2fcb92b285b9579fe55466 GIT binary patch literal 3186 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 G>3;x-*x1Sd literal 0 HcmV?d00001 diff --git a/target/classes/flowableJsonParserExampleData.json b/target/classes/flowableJsonParserExampleData.json new file mode 100644 index 0000000..4c1c59b --- /dev/null +++ b/target/classes/flowableJsonParserExampleData.json @@ -0,0 +1,163 @@ +{ + "myBool": true, + "myString": "Hello", + "myInteger": 1234, + "myDouble": 1234.0, + "myMap": { + "myMapBool": true, + "myMapString": "Hello", + "myMapInteger": 1234, + "myMapDouble": 1234.0, + "myMapMap": { + "myMapMapBool" : true, + "myMapMapString": "Hello", + "myMapMapInteger": 1234, + "myMapMapDouble": 1234.0 + }, + "myMapArray": [ + true, + "myMapArrayString", + 1234, + 1234.0 + ] + }, + "myArray": [ + true, + "myArrayString", + 1234, + 1234.0, + { + "myArrayMapBool" : true, + "myArrayMapString": "Hello", + "myArrayMapInteger": 1234, + "myArrayMapDouble": 1234.0 + }, + [ + true, + "myArrayArrayString", + 1234, + 1234.0 + ] + ], + "myTypedBoolean": { + "__TYPE": "Boolean", + "__VALUE": true + }, + "myTypedString": { + "__TYPE": "String", + "__VALUE": "Hello" + }, + "myTypedInteger": { + "__TYPE": "Integer", + "__VALUE": 1234 + }, + "myTypedDouble": { + "__TYPE": "Double", + "__VALUE": 1234.0 + }, + "myTypedLong": { + "__TYPE": "Long", + "__VALUE": "9876543210" + }, + "myTypedInstant": { + "__TYPE": "Instant", + "__VALUE": "2024-12-01T12:34:56Z" + }, + "myTypedMap": { + "__TYPE": "Map", + "__VALUE": { + "myTypedMapBool": true, + "myTypedMapString": "Hello", + "myTypedMapInteger": 1234, + "myTypedMapDouble": 1234.0 + } + }, + "myTypedArray": { + "__TYPE": "ArrayList", + "__VALUE": [ + true, + "Hello", + 1234, + 1234.0 + ] + }, + "myTypedJsonObject": { + "__TYPE": "JsonObjectNode", + "__VALUE": { + "myTypedJsonObjectBool": { + "__TYPE": "Boolean", + "__VALUE": true + }, + "myTypedJsonObjectString": { + "__TYPE": "String", + "__VALUE": "Hello" + }, + "myTypedJsonObjectInteger": { + "__TYPE": "Integer", + "__VALUE": 1234 + }, + "myTypedJsonObjectDouble": { + "__TYPE": "Double", + "__VALUE": 1234.0 + }, + "myTypedJsonObjectLong": { + "__TYPE": "Long", + "__VALUE": "9876543210" + }, + "myTypedJsonObjectInstant": { + "__TYPE": "Instant", + "__VALUE": "2024-12-01T12:34:56Z" + }, + "myTypedJsonObjectMap": { + "__TYPE": "Map", + "__VALUE": { + "myTypedJsonObjectMapBool" : true, + "myTypedJsonObjectMapString": "Hello", + "myTypedJsonObjectMapInteger": 1234, + "myTypedJsonObjectMapDouble": 1234.0 + } + }, + "myTypedJsonObjectArrayList": { + "__TYPE": "ArrayList", + "__VALUE": [ + true, + "myTypedJsonObjectArrayListString", + 1234, + 1234.0 + ] + } + } + }, + "myTypedJsonArray": { + "__TYPE": "JsonArrayNode", + "__VALUE": [ + true, + "Hello", + 1234, + 1234.0, + { + "myTypedJsonArrayBool" : true, + "myTypedJsonArrayString": "Hello", + "myTypedJsonArrayInteger": 1234, + "myTypedJsonArrayDouble": 1234.0 + }, + [ + true, + "myArrayArrayString", + 1234, + 1234.0 + ] + ] + }, + "__IN": { + "getClassParam": { + "__TYPE": "ArrayList", + "__VALUE": [ + "Hello" + ] + } + }, + "__OUT": { + "getClassResult": "getClassResult" + } +} \ No newline at end of file diff --git a/target/test-classes/com/example/parser/FlowableExcelParserTest.class b/target/test-classes/com/example/parser/FlowableExcelParserTest.class new file mode 100644 index 0000000000000000000000000000000000000000..d54342b1241d5c142441fdb5ea7be1c3b4338eff GIT binary patch literal 8675 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 literal 0 HcmV?d00001 diff --git a/target/test-classes/com/example/parser/FlowableJsonParserTest.class b/target/test-classes/com/example/parser/FlowableJsonParserTest.class new file mode 100644 index 0000000000000000000000000000000000000000..0edff27d4d32eb127c3410ec2e9ba297318a2b37 GIT binary patch literal 3266 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 G>3;x-*x1Sd literal 0 HcmV?d00001 diff --git a/target/test-classes/flowableExcelParserTestData3.xlsx b/target/test-classes/flowableExcelParserTestData3.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3209621287ace2a46e54d53c06e7ca0193687eb1 GIT binary patch literal 10219 zcmeHN1y@{KvTiJBaF^f&0>L#n1cEj$f#5XmG%mp{xO?#6?(PKF;2r`bxLcrKCo}Wz zz07^@56qli>+IF*och+PI#s*As@jUOaPYW*CjcY>06+;yFiAX!h5-Ql5C8xi01~XW zxUCHsWCPYyb+ZFG>M*-nTT$e|!_sE~V4?5-_xcaEKxzCq@GC23{}JN>|LgXg-oPG| z>;lqjYRUsx?0q=2%e<-|^NFTDmj@}0KA1o1OLuA24acwU1yWMJe|I?kf@9*qR{Nte zr4YqGbT-hfBn9$|H`k2^-x@d6B&SUQK#PWZbHUwc6En+M$%RbA=T) zf-b(9@Mh6v@xw0j&NKE!{;??{55()jHvb+U9@Dn?&zW(@;B&W{tu4Y zKdD|CJ1GOlhAFXz0HNG!<6lyHoww8;qNs>jM9wO2(vU4pN29dV!Bd8>Qz$VpV0^fo z-V`@z^|jPBKN;;#J+ed#gR*4BWc4R?8-~G!^Pg6yukjttWf*Z{ z>6wM<91JGxr2xY#;a z8rs@g{>qD`YC5*LytrO^<_~b28H;ox*s8Bk^cKq(l@d%AS3V6Ps3gOhSWo8_Z+DDy zA)E8REvwFm2#Gk@`|5ZkIG66d%2{{P8&K*>lDq|<_QaASQ{zBf-&-etc7!u8#~Nt4 zTHWbsGWFB*@_WNH7eUljx-c;J+$JU> z75NCOaKV|0Vy*_HcHSrc1QH2V$);XCT6G9mr3EOv!__~wLS~HzI=NH@E;ABN3gANS zipyut02ajZ+aHB%-%Z>RFRxd`qx79P3Zl_;mn_$c={@I$c)kM?)s z+P(G(Nz-EPh*X(`tpr0ieW1bTx&4)Z-ImG<3r*VIeifXIgKwU+;pup_6<<&S1iBFm zA`X!I7qJ7X3h{7WsxfVr!IB;Ryj2^0I*Wi&3S3|f%+X4 zry9g8u2(f+hzdu!*BtuZ-BE#|pST_)y|F`H9xZ9r+O*fspG@w2$EUikb-$-=w>-Xtt?Yt#o)O|TJ`}6M|TXYKB>4+ z1g=&RGi&SfoJ;cKey(fxL0wje{KU}MR>Xd|#+zc2eK8|5 zv5(cRBdZ>u>Q_*Y4zt!^EbfB8iL3}#j@3d>F=7nR*Rn|mE;EGY_R8xGT3mg=(ADJN z+&59ZP;_pN46dqJ0`s(dWU9w$5olu+eowU5c;pO8+u(B5tD%mVPNROB%aT+wOl{2) z`(?%2z4T<0J)B@*i6wEkPp@Qa`~>Md3PwV_+ll`(ZUj5u9W?d*ds2)=jNgZcJ`sjS zF);uM1{%Tt$culD&Z z*v0e886s+XZ5>%EzZ&d}wy9>5>b`mw+OqWCrRew zhqwZasc|j};c47pWnba=28yuks4<9TOR)u~ApiYj%r{hg_T!0ugx9|9bn3_2&ttH* zKzF05m!#ujad(jk)m%jF>B3LMdvOMe@V0p01~lp6NE(%VMB{e$jUc+V!>H1tVzatF&^#ATdGCm9}+VB7X{Zjyd5c);oC?Yi)3R)_7`R>YMue zDMt{*C{qlNm8`N_U<&sDXE?=7Jr@gHG8imjZKp44`AnD%h8`8Ln5EYl!>_y`+}$c*(40yH(bqpnRi< z2dV}d5C1UQ8IOz>vSoUaCz7$lxu^C+yc{wC!IbsAi-DO~>2k3*Tt(rvb>i-BcUT4M zrR4lI?B4sNQSRcA6LR&uzFnht@Juph(R9+pa;V%WbWFr}s4~w#uz7Tyy)DuYzAKJS zP>U3v*q?@vyRq8+_)+F?xrFW1^G2Rq*%g@>H@96dslW8D(=<8EXE(?v^K+nvc2l%` z+}Ag(JKh+?QTutK%v5I!PM-Ll#O}8rBxDb_x;Z;kzgsE>)~F1H*%Cv(>k=G-3pF z81lVh2o9_;ikauNJzv-qZo=f*on(`(xZ%8wq9fXWfL6>9$Zwa4PZYKBXT_AL@N2aQ zRQ0niG{&NlV=E~yeg?o&Y?fvWnYz5J3k^*Xtr}w9grpp~&C@No?l+&wI@+9CUH?Q6 z5)74Q_2&Ad1i>Dsxej%k4(mCR<*8r!-uk@dxy)%P*KD`zCzN~783mRb<`2wn_;s_C zbCHCvhU)yq-qbm>?kZX$21mLdNZCY6DR`57v>{w`9lbWO<4lAn&QTV_DoRkfYt71@ z5x8Z51r_EiO;v&=XR38yt*z>jqr8y0b=}(|hQqglL;afZHj9AXH|VVhR*jtnd9u8- zRnVb`U-sTro?*@uKltZFTI?1AYW^w#4nvrFmZvo?&QSeig>rQz*qZf?-pAC?#mmX( z#yKOe2Tg{+RrDe$wpmuK93U_f%>*lm-f#$r5MNQ0_`m5{q6(k8J zqK@`S4VjPbb-O!d;yB0C46kN`#4qRmoCwmF^GeYD_pCj$Ucm= zxM1!A%&vKdtJl(7zqVGL#I_wztH}~uNX<pW>@weJL{akIS{(wJ zREWG-5AALH+oX1>Un|;(2moMF{c73#-jKj%AZrlI@B8n)XkTkIilhOr1MxFNWJG6n zWY@!hZ{icr<)QmVg3gwdbbOHRn4O4n3nMNJ%Fc|eFRb~btnaEjeb^H-pC?UQQEd9u z@{kY#2g%fpu&}lVkyt|)7LJ)C!H4a(fdQT<$E&!K`7)KH*NX=>EeD`uV`Wkh(35OSxOcAZH1#{>gqx@a8?u999_&2i5Sa@%3 zJ1irF2E(@*sGi8~M(R(!I^IUG$qU4<6V3=}G3|zDg{psFS)wOrYm|?lf#aYXtFQ1iug_TJ6*c*$yub{}FBrizELtb@^6((pIf zv$Kg2hQ#TEya#%#IsYQdx zdtOI<58p25ox#eKtw_ql?IA}bf387KH;H19?f$xl_x#ZeQ!5PUdK39aENh2fuCvJM~qxW zj8M{qQ^L}u<*4LdB9r>s1pkN$V_F|1<{&6nu)-0-iw3>xyel!qpR187#dR9_$r|=@ zoo%OdJa8I-aq*58RY84lO0Y>Y!9I$u-ELH{GxXc~&V#%QXJJ)=>ePzBbHb#=4NF|>oPOV;=fR?3R9G}OsMoKzT<;!lz`0Tvo zyQd85-3H&WX%BEK)4Lx|xdrgCPzV3?#N6O@aww2i?e~5$PWhVc)wdx8;q6P5$*Xn5 z^nIr*6&WU%4k0W7UwDlIRrrtx5G`qYt3qSjvpFl@P{!f&*H)mp%&f89-HJqYGjgo% zW71tcIi2;7KYOh8Ajvr&#^}vj;-y9 zuCu(MRr8;2;9G414^=x2!HTZECOe>YtbZnW@#cSey^@bx>Sm3QKRt>VLKNTId6jNR;b>8%MSWm?p_?^ok509a^Obb9dkHC&X>6`F=;Q6qBQzPn>^yy$OP zgB!S`B7~ZzW4V-v)D2!*v zbK&&Ku1G>5&9H_Tg}Cf8__z*8HRk{)JCx!_yNf;Riu7SjoFm=24dFaugB?ien&*Ah zZG{}n!a-Y&2jMQF#Z!J-70&)4tu*fDc|jObui5g&`I&8xFD+fD@z$$K@cW`Iv9@(@ z^R3Rk`lLZaQIq2RtErHBurn%ykSzX~Uc~j1e;tjUZ_9Yj4Q*<5f@?TsFL9ZOhYOIF zlpH>#WCwSwr#_`Lq{EV5CG);ayqt>MC{dDkO?hZRz(4INNOoY^+FG%B_#+Wovt{>p z<)g}@)`NEMirGZQ%K>1Oxt6(vZQ7yL?S}IWc8MWDohGR1&VB5_DwYhs*fGuZs;%R7 zS@K9u0nyR6K}PMFQre|Z-*)hT8&@Z` zNLng^`n>wY+k*u^_nKje8iW?Sv7vd(i{h893G<{iHi7b%lM>oG*1#F3G8>aw^x@3K zJOd+!#>G0S+ChY%DL(#@Q3sZ-6vhONMY}+CKj*f!+X!7ROztOm9V>)tKkAzG%z51F zWGW^L5ppHhG43{YL=+_KCqB1(684y5YVWKGC!b{4Qf!X;&Selql`MOHRpeUbSrdWZ zc(A4Dj1gfZMYyOWK!4$HFi|?wV^A|?^Tj*~(4X4dsAVbaKfh{`Ea zK>6Vnae{6KcOmCet~W2bqEf^rSfM%Ovi61cUFicZt+H8R0Y++5~RLMzVNYY~l zx~F82A`McZV$f)Oqxtz%PlSdms)dfe&Z_XMC3EAFizeZqgME$C;zS*w*qSq&)*`nk zRLK%O3B0OtC8bMj?Q}2(NZM`QruC3_0d5B*KBp1!CQ*)$X7!Houv`t{qzn?YXCWV( z)?zeODsma}O%|C+(myFYuX*t^(dAOf&7vds`HM~*qu5XR_=^;XQ=;Ffj+9iZg*L10 z7jyV6!o4r~xf0&(-?bguJ-@+Z;zL@`4SCMt$way-Mq1RDiNJe`%LyJSgvB?jB)@!W zr#N9FC`WLWv>TCqM-P-llyWi1EUzodYEzKlYdlr0T!c~T;n9XTHT$mBIiqV)C@=zf zw3IefzKcda$x~scJiN!bR`2MvvCMO>jy^0HVilm%3-Ct{MKg(-V-a{DEE{;%b!&Jp z%w(}g{lE{TUgR`<-w?g4ou9X~BQ6>pp1Bh1(kT(*?ik?86@c+a3U;IwX_Q)1fr)d{ zG2xBRZPSG*Lvy@i-A)I)?FZpC5X;a}BHAdhnIO^deDtC~2>Z?7k1tyDOu}lQKK>j^ zd2#>g>t+THAY&D2$MpEF4~BTcx2v%12YJ$c(BeC2s+j@sbqduI~x%hflLtp%dL?L>4?BiA|?jU1y&fa%Y>P9%(uuLhl@1%xnN#;eNC_hAlKbyrKDBHin z&)?HUWbYfqls~x{?mZN&{@&@LjA6JVlmKGYdTsPtA*vZl&;O>CAlAK{*bRL$1XU9A zA4(b-SQ&|%8JOGris^TgvcDAc+4zTo7cZw~0(;+yU|>#Fz1&iYrEvG4F8pi-dlU2? zDNjf!9pn;jj-=aZs0$-*E5?5f?7VQuJn+pg^(wJGre6<5jvNImlUR=y&H0;x{1sqt z(+A*o2G4iFslixYDa&HuS4o!puEf+oxGzE$-nN$(zjOh?aMl?p`7FYa43YROTn!3) zKAaNJAk^IlbOiY2WpQ(6Q!o^A$EjR?=#wpJmq)b7(apt~29<@;-$vAF;HT(yldU!g>uhCZl zi{K$NMQ?V&^&Gn1uVhULS#0rvfD#FNc7P|v+>dku{QTWhCer@4qcdsOiFE zb!2;32?LK1AmW2wX|-*4>Ce?Nb3Y6&Zp94-8*1#qe}g{KX0>3J#mEflBD(G!10aI z&t`YmA09Z*F%pZDO&wcnzIwlWl!K0V8oeppTf&|>Nt2J9 zf*IvQ)$@EU_ZsS9|L%X?x^Izwodh9)_R2B;?0*J!cK>xhsNenbN{^Mdg%YozBe+{~ zv=tIQYb7+_QbQ??^GZXQSZ7mUfl+ofO-O0X{+vSneO=oq-wIdd`M z^-uafdvWTlq?>f3XUat@T&@Lyvf_VuF%0ZWC};Tl6HWj6YX4gQ=6sW)>|X)?dXnN_ zg1^>5XlVTDT*YI-$MfPpL`k81;L-H>vG892fxlETk3}C-!9PSpNdF=Fm>51rc+9i@ zK(HqJjqn%N^;r5bYxzT3=h^?mVIIT$HJ|?h0sw@O|AzT%c7H7X*X{Vv;wV&q694Ds XtSE~B4F>=K4f;cXdg%nsuYdmoX0*ln literal 0 HcmV?d00001 diff --git a/target/test-classes/flowableJsonParserTestData.json b/target/test-classes/flowableJsonParserTestData.json new file mode 100644 index 0000000..4c1c59b --- /dev/null +++ b/target/test-classes/flowableJsonParserTestData.json @@ -0,0 +1,163 @@ +{ + "myBool": true, + "myString": "Hello", + "myInteger": 1234, + "myDouble": 1234.0, + "myMap": { + "myMapBool": true, + "myMapString": "Hello", + "myMapInteger": 1234, + "myMapDouble": 1234.0, + "myMapMap": { + "myMapMapBool" : true, + "myMapMapString": "Hello", + "myMapMapInteger": 1234, + "myMapMapDouble": 1234.0 + }, + "myMapArray": [ + true, + "myMapArrayString", + 1234, + 1234.0 + ] + }, + "myArray": [ + true, + "myArrayString", + 1234, + 1234.0, + { + "myArrayMapBool" : true, + "myArrayMapString": "Hello", + "myArrayMapInteger": 1234, + "myArrayMapDouble": 1234.0 + }, + [ + true, + "myArrayArrayString", + 1234, + 1234.0 + ] + ], + "myTypedBoolean": { + "__TYPE": "Boolean", + "__VALUE": true + }, + "myTypedString": { + "__TYPE": "String", + "__VALUE": "Hello" + }, + "myTypedInteger": { + "__TYPE": "Integer", + "__VALUE": 1234 + }, + "myTypedDouble": { + "__TYPE": "Double", + "__VALUE": 1234.0 + }, + "myTypedLong": { + "__TYPE": "Long", + "__VALUE": "9876543210" + }, + "myTypedInstant": { + "__TYPE": "Instant", + "__VALUE": "2024-12-01T12:34:56Z" + }, + "myTypedMap": { + "__TYPE": "Map", + "__VALUE": { + "myTypedMapBool": true, + "myTypedMapString": "Hello", + "myTypedMapInteger": 1234, + "myTypedMapDouble": 1234.0 + } + }, + "myTypedArray": { + "__TYPE": "ArrayList", + "__VALUE": [ + true, + "Hello", + 1234, + 1234.0 + ] + }, + "myTypedJsonObject": { + "__TYPE": "JsonObjectNode", + "__VALUE": { + "myTypedJsonObjectBool": { + "__TYPE": "Boolean", + "__VALUE": true + }, + "myTypedJsonObjectString": { + "__TYPE": "String", + "__VALUE": "Hello" + }, + "myTypedJsonObjectInteger": { + "__TYPE": "Integer", + "__VALUE": 1234 + }, + "myTypedJsonObjectDouble": { + "__TYPE": "Double", + "__VALUE": 1234.0 + }, + "myTypedJsonObjectLong": { + "__TYPE": "Long", + "__VALUE": "9876543210" + }, + "myTypedJsonObjectInstant": { + "__TYPE": "Instant", + "__VALUE": "2024-12-01T12:34:56Z" + }, + "myTypedJsonObjectMap": { + "__TYPE": "Map", + "__VALUE": { + "myTypedJsonObjectMapBool" : true, + "myTypedJsonObjectMapString": "Hello", + "myTypedJsonObjectMapInteger": 1234, + "myTypedJsonObjectMapDouble": 1234.0 + } + }, + "myTypedJsonObjectArrayList": { + "__TYPE": "ArrayList", + "__VALUE": [ + true, + "myTypedJsonObjectArrayListString", + 1234, + 1234.0 + ] + } + } + }, + "myTypedJsonArray": { + "__TYPE": "JsonArrayNode", + "__VALUE": [ + true, + "Hello", + 1234, + 1234.0, + { + "myTypedJsonArrayBool" : true, + "myTypedJsonArrayString": "Hello", + "myTypedJsonArrayInteger": 1234, + "myTypedJsonArrayDouble": 1234.0 + }, + [ + true, + "myArrayArrayString", + 1234, + 1234.0 + ] + ] + }, + "__IN": { + "getClassParam": { + "__TYPE": "ArrayList", + "__VALUE": [ + "Hello" + ] + } + }, + "__OUT": { + "getClassResult": "getClassResult" + } +} \ No newline at end of file