From 50aa3878d2877c1e3ed4dc73d2bf6556cc213e7e Mon Sep 17 00:00:00 2001 From: asia Date: Wed, 18 Aug 2021 12:18:17 +0200 Subject: [PATCH 01/16] Init --- hexagonal/mvnw | 310 ++++++++++++++++++ hexagonal/mvnw.cmd | 182 ++++++++++ hexagonal/pom.xml | 70 ++++ .../com/baeldung/hexagonal/Application.java | 12 + .../adapter/in/ItemTransportObject.java | 10 + .../adapter/in/ShoppingCartController.java | 22 ++ .../adapter/in/ShoppingCartFacade.java | 21 ++ .../hexagonal/adapter/out/Product.java | 26 ++ .../adapter/out/ProductCrudRepository.java | 12 + .../baeldung/hexagonal/domain/CartItem.java | 13 + .../hexagonal/domain/ShoppingCart.java | 22 ++ .../hexagonal/domain/ShoppingCartService.java | 31 ++ .../domain/ports/ProductRepository.java | 8 + .../src/main/resources/application.properties | 5 + .../hexagonal/domain/ShoppingCartTest.java | 29 ++ 15 files changed, 773 insertions(+) create mode 100755 hexagonal/mvnw create mode 100644 hexagonal/mvnw.cmd create mode 100644 hexagonal/pom.xml create mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/Application.java create mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ItemTransportObject.java create mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartController.java create mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartFacade.java create mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/Product.java create mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/ProductCrudRepository.java create mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/domain/CartItem.java create mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCart.java create mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCartService.java create mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/domain/ports/ProductRepository.java create mode 100644 hexagonal/src/main/resources/application.properties create mode 100644 hexagonal/src/test/java/com/baeldung/hexagonal/domain/ShoppingCartTest.java diff --git a/hexagonal/mvnw b/hexagonal/mvnw new file mode 100755 index 0000000000..a16b5431b4 --- /dev/null +++ b/hexagonal/mvnw @@ -0,0 +1,310 @@ +#!/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 +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# 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 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # 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 + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + 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"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# 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)`" +fi + +if [ -z "$JAVA_HOME" ]; 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 + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + 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 + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# 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. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# 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"` + [ -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 $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/hexagonal/mvnw.cmd b/hexagonal/mvnw.cmd new file mode 100644 index 0000000000..c8d43372c9 --- /dev/null +++ b/hexagonal/mvnw.cmd @@ -0,0 +1,182 @@ +@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 https://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 Maven Start Up Batch script +@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 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 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@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 +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" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_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 DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_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('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@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 + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +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" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/hexagonal/pom.xml b/hexagonal/pom.xml new file mode 100644 index 0000000000..020a48ce58 --- /dev/null +++ b/hexagonal/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.5.3 + + + com.example + demo + 0.0.1-SNAPSHOT + demo + Demo project for Spring Boot + + 11 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + runtime + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + true + + + javax.xml.bind + jaxb-api + 2.3.0 + + + org.junit.jupiter + junit-jupiter-engine + 5.7.2 + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/Application.java b/hexagonal/src/main/java/com/baeldung/hexagonal/Application.java new file mode 100644 index 0000000000..d9dcc1d8b0 --- /dev/null +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/Application.java @@ -0,0 +1,12 @@ +package com.baeldung.hexagonal; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ItemTransportObject.java b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ItemTransportObject.java new file mode 100644 index 0000000000..4c2eded0ec --- /dev/null +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ItemTransportObject.java @@ -0,0 +1,10 @@ +package com.baeldung.hexagonal.adapter.in; + +import lombok.Data; + +@Data +class ItemTransportObject { + private String name; + private Integer quantity; + private String category; +} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartController.java b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartController.java new file mode 100644 index 0000000000..b1c0fabe2e --- /dev/null +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartController.java @@ -0,0 +1,22 @@ +package com.baeldung.hexagonal.adapter.in; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/shopping-cart") +public class ShoppingCartController { + + @Autowired + ShoppingCartFacade apiAdapter; + + @GetMapping + public Float getTotalCartValue() { + return apiAdapter.getTotalCartValue(); + } + + @PostMapping() + public void addItem(@RequestBody ItemTransportObject item) { + apiAdapter.addItem(item); + } +} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartFacade.java b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartFacade.java new file mode 100644 index 0000000000..a162368135 --- /dev/null +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartFacade.java @@ -0,0 +1,21 @@ +package com.baeldung.hexagonal.adapter.in; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.baeldung.hexagonal.domain.ShoppingCartService; + +@Component +class ShoppingCartFacade { + + @Autowired + ShoppingCartService shoppingCartService; + + void addItem(ItemTransportObject item) { + shoppingCartService.addItem(item.getName(), item.getQuantity()); + } + + Float getTotalCartValue() { + return shoppingCartService.getTotalCartValue(); + } +} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/Product.java b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/Product.java new file mode 100644 index 0000000000..8be0944af8 --- /dev/null +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/Product.java @@ -0,0 +1,26 @@ +package com.baeldung.hexagonal.adapter.out; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; + +import com.baeldung.hexagonal.domain.CartItem; + +import lombok.Data; + +@Entity +@Data +public class Product { + + @Id + public final Integer id; + @Column + public final String name; + @Column + public final Float price; + + public CartItem toItem() { + return new CartItem(name, price); + } + +} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/ProductCrudRepository.java b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/ProductCrudRepository.java new file mode 100644 index 0000000000..eae7edf722 --- /dev/null +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/ProductCrudRepository.java @@ -0,0 +1,12 @@ +package com.baeldung.hexagonal.adapter.out; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +import com.baeldung.hexagonal.domain.ports.ProductRepository; + +@Repository +public interface ProductCrudRepository extends CrudRepository, ProductRepository { + + Product findByName(String name); +} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/CartItem.java b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/CartItem.java new file mode 100644 index 0000000000..43100ae3ef --- /dev/null +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/CartItem.java @@ -0,0 +1,13 @@ +package com.baeldung.hexagonal.domain; + +import lombok.Data; +import lombok.NonNull; + +@Data +public class CartItem { + + @NonNull + private final String name; + private final Float price; + +} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCart.java b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCart.java new file mode 100644 index 0000000000..7eecf94021 --- /dev/null +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCart.java @@ -0,0 +1,22 @@ +package com.baeldung.hexagonal.domain; + +import java.util.Map; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +class ShoppingCart { + + private final Map itemToQuantity; + + Float getTotalCartValue() { + return itemToQuantity.entrySet().stream() + .map(item -> item.getKey().getPrice() * item.getValue()).reduce(0f, Float::sum); + } + + void addItem(CartItem cartItem, Integer quantity) { + if (quantity < 0) + throw new IllegalArgumentException("Quantity should not be negative."); + itemToQuantity.put(cartItem, itemToQuantity.getOrDefault(cartItem, 0) + quantity); + } +} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCartService.java b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCartService.java new file mode 100644 index 0000000000..bc2cbab66a --- /dev/null +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCartService.java @@ -0,0 +1,31 @@ +package com.baeldung.hexagonal.domain; + +import java.util.HashMap; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baeldung.hexagonal.adapter.out.Product; +import com.baeldung.hexagonal.domain.ports.ProductRepository; + +@Service +public class ShoppingCartService { + + private final ShoppingCart shoppingCart; + + @Autowired + ProductRepository productRepository; + + public ShoppingCartService() { + this.shoppingCart = new ShoppingCart(new HashMap<>()); + } + + public Float getTotalCartValue() { + return shoppingCart.getTotalCartValue(); + } + + public void addItem(String name, Integer quantity) { + Product product = productRepository.findByName(name); + shoppingCart.addItem(product.toItem(), quantity); + } +} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ports/ProductRepository.java b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ports/ProductRepository.java new file mode 100644 index 0000000000..21ad050bc1 --- /dev/null +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ports/ProductRepository.java @@ -0,0 +1,8 @@ +package com.baeldung.hexagonal.domain.ports; + +import com.baeldung.hexagonal.adapter.out.Product; + +public interface ProductRepository { + + Product findByName(String name); +} diff --git a/hexagonal/src/main/resources/application.properties b/hexagonal/src/main/resources/application.properties new file mode 100644 index 0000000000..730dded1b7 --- /dev/null +++ b/hexagonal/src/main/resources/application.properties @@ -0,0 +1,5 @@ +spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password=password +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/hexagonal/src/test/java/com/baeldung/hexagonal/domain/ShoppingCartTest.java b/hexagonal/src/test/java/com/baeldung/hexagonal/domain/ShoppingCartTest.java new file mode 100644 index 0000000000..c3af6f0e29 --- /dev/null +++ b/hexagonal/src/test/java/com/baeldung/hexagonal/domain/ShoppingCartTest.java @@ -0,0 +1,29 @@ +package com.baeldung.hexagonal.domain; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.api.Test; + + +class ShoppingCartTest { + + @Test + void givenNonemptyShoppingCart_whenGetTotalCartValueCalled_thenShouldCalculateCorrectly() { + + // given + Map items = new HashMap<>(); + items.put(new CartItem("Cheese", 1.5f), 2); + items.put(new CartItem("Lemon", 2f), 5); + + ShoppingCart cart = new ShoppingCart(items); + + // when + Float totalCartValue = cart.getTotalCartValue(); + + // then + assertEquals(totalCartValue, 13f, 0); + } +} From 48d18665ed104f878b0ccca9880e72333279b0a4 Mon Sep 17 00:00:00 2001 From: asia Date: Sat, 21 Aug 2021 15:17:14 +0200 Subject: [PATCH 02/16] Removing mvnw files --- hexagonal/mvnw | 310 --------------------------------------------- hexagonal/mvnw.cmd | 182 -------------------------- 2 files changed, 492 deletions(-) delete mode 100755 hexagonal/mvnw delete mode 100644 hexagonal/mvnw.cmd diff --git a/hexagonal/mvnw b/hexagonal/mvnw deleted file mode 100755 index a16b5431b4..0000000000 --- a/hexagonal/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/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 -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# 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 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # 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 - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - 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"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# 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)`" -fi - -if [ -z "$JAVA_HOME" ]; 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 - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - 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 - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -########################################################################################## -# 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. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi -else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - else - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` - fi - - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f - else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f - fi - - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` - fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# 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"` - [ -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 $@" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/hexagonal/mvnw.cmd b/hexagonal/mvnw.cmd deleted file mode 100644 index c8d43372c9..0000000000 --- a/hexagonal/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@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 https://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 Maven Start Up Batch script -@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 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 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@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 -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" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - -FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_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 DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_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('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@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 - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -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" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% From c1b36b3bb0d8434793e12382b5d296e81198872b Mon Sep 17 00:00:00 2001 From: asia Date: Sat, 21 Aug 2021 15:41:56 +0200 Subject: [PATCH 03/16] Apply eclipse code format --- .../com/baeldung/hexagonal/Application.java | 6 ++--- .../adapter/in/ItemTransportObject.java | 6 ++--- .../hexagonal/adapter/out/Product.java | 18 ++++++------- .../adapter/out/ProductCrudRepository.java | 2 +- .../baeldung/hexagonal/domain/CartItem.java | 6 ++--- .../hexagonal/domain/ShoppingCart.java | 23 +++++++++-------- .../domain/ports/ProductRepository.java | 2 +- .../hexagonal/domain/ShoppingCartTest.java | 25 +++++++++---------- 8 files changed, 45 insertions(+), 43 deletions(-) diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/Application.java b/hexagonal/src/main/java/com/baeldung/hexagonal/Application.java index d9dcc1d8b0..eb762f615d 100644 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/Application.java +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/Application.java @@ -6,7 +6,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } } diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ItemTransportObject.java b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ItemTransportObject.java index 4c2eded0ec..bcf38e99a0 100644 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ItemTransportObject.java +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ItemTransportObject.java @@ -4,7 +4,7 @@ import lombok.Data; @Data class ItemTransportObject { - private String name; - private Integer quantity; - private String category; + private String name; + private Integer quantity; + private String category; } diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/Product.java b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/Product.java index 8be0944af8..00a330b50a 100644 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/Product.java +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/Product.java @@ -12,15 +12,15 @@ import lombok.Data; @Data public class Product { - @Id - public final Integer id; - @Column - public final String name; - @Column - public final Float price; + @Id + public final Integer id; + @Column + public final String name; + @Column + public final Float price; - public CartItem toItem() { - return new CartItem(name, price); - } + public CartItem toItem() { + return new CartItem(name, price); + } } diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/ProductCrudRepository.java b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/ProductCrudRepository.java index eae7edf722..3708a1a19d 100644 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/ProductCrudRepository.java +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/ProductCrudRepository.java @@ -8,5 +8,5 @@ import com.baeldung.hexagonal.domain.ports.ProductRepository; @Repository public interface ProductCrudRepository extends CrudRepository, ProductRepository { - Product findByName(String name); + Product findByName(String name); } diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/CartItem.java b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/CartItem.java index 43100ae3ef..1e0fcfb50e 100644 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/CartItem.java +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/CartItem.java @@ -6,8 +6,8 @@ import lombok.NonNull; @Data public class CartItem { - @NonNull - private final String name; - private final Float price; + @NonNull + private final String name; + private final Float price; } diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCart.java b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCart.java index 7eecf94021..949090eb80 100644 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCart.java +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCart.java @@ -7,16 +7,19 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor class ShoppingCart { - private final Map itemToQuantity; + private final Map itemToQuantity; - Float getTotalCartValue() { - return itemToQuantity.entrySet().stream() - .map(item -> item.getKey().getPrice() * item.getValue()).reduce(0f, Float::sum); - } + Float getTotalCartValue() { + return itemToQuantity.entrySet() + .stream() + .map(item -> item.getKey() + .getPrice() * item.getValue()) + .reduce(0f, Float::sum); + } - void addItem(CartItem cartItem, Integer quantity) { - if (quantity < 0) - throw new IllegalArgumentException("Quantity should not be negative."); - itemToQuantity.put(cartItem, itemToQuantity.getOrDefault(cartItem, 0) + quantity); - } + void addItem(CartItem cartItem, Integer quantity) { + if (quantity < 0) + throw new IllegalArgumentException("Quantity should not be negative."); + itemToQuantity.put(cartItem, itemToQuantity.getOrDefault(cartItem, 0) + quantity); + } } diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ports/ProductRepository.java b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ports/ProductRepository.java index 21ad050bc1..b4f53beb1e 100644 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ports/ProductRepository.java +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ports/ProductRepository.java @@ -4,5 +4,5 @@ import com.baeldung.hexagonal.adapter.out.Product; public interface ProductRepository { - Product findByName(String name); + Product findByName(String name); } diff --git a/hexagonal/src/test/java/com/baeldung/hexagonal/domain/ShoppingCartTest.java b/hexagonal/src/test/java/com/baeldung/hexagonal/domain/ShoppingCartTest.java index c3af6f0e29..c39892a8fa 100644 --- a/hexagonal/src/test/java/com/baeldung/hexagonal/domain/ShoppingCartTest.java +++ b/hexagonal/src/test/java/com/baeldung/hexagonal/domain/ShoppingCartTest.java @@ -7,23 +7,22 @@ import java.util.Map; import org.junit.jupiter.api.Test; - class ShoppingCartTest { - @Test - void givenNonemptyShoppingCart_whenGetTotalCartValueCalled_thenShouldCalculateCorrectly() { + @Test + void givenNonemptyShoppingCart_whenGetTotalCartValueCalled_thenShouldCalculateCorrectly() { - // given - Map items = new HashMap<>(); - items.put(new CartItem("Cheese", 1.5f), 2); - items.put(new CartItem("Lemon", 2f), 5); + // given + Map items = new HashMap<>(); + items.put(new CartItem("Cheese", 1.5f), 2); + items.put(new CartItem("Lemon", 2f), 5); - ShoppingCart cart = new ShoppingCart(items); + ShoppingCart cart = new ShoppingCart(items); - // when - Float totalCartValue = cart.getTotalCartValue(); + // when + Float totalCartValue = cart.getTotalCartValue(); - // then - assertEquals(totalCartValue, 13f, 0); - } + // then + assertEquals(totalCartValue, 13f, 0); + } } From 154b23203e37aae250a193f3d0aabd0106ca1844 Mon Sep 17 00:00:00 2001 From: asia Date: Sat, 21 Aug 2021 15:42:18 +0200 Subject: [PATCH 04/16] Refactoring --- .../hexagonal/ShoppingCartService.java | 8 +++++ .../adapter/in/ShoppingCartController.java | 22 +++++++------ .../adapter/in/ShoppingCartFacade.java | 21 ------------ .../hexagonal/domain/ShoppingCartService.java | 31 ------------------ .../domain/SimpleShoppingCartService.java | 32 +++++++++++++++++++ 5 files changed, 52 insertions(+), 62 deletions(-) create mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/ShoppingCartService.java delete mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartFacade.java delete mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCartService.java create mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/domain/SimpleShoppingCartService.java diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/ShoppingCartService.java b/hexagonal/src/main/java/com/baeldung/hexagonal/ShoppingCartService.java new file mode 100644 index 0000000000..25613ed556 --- /dev/null +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/ShoppingCartService.java @@ -0,0 +1,8 @@ +package com.baeldung.hexagonal; + +public interface ShoppingCartService { + + Float getTotalCartValue(); + + void addItem(String name, Integer quantity); +} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartController.java b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartController.java index b1c0fabe2e..d92f186c84 100644 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartController.java +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartController.java @@ -3,20 +3,22 @@ package com.baeldung.hexagonal.adapter.in; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import com.baeldung.hexagonal.ShoppingCartService; + @RestController @RequestMapping("/shopping-cart") public class ShoppingCartController { - @Autowired - ShoppingCartFacade apiAdapter; + @Autowired + ShoppingCartService shoppingCartService; - @GetMapping - public Float getTotalCartValue() { - return apiAdapter.getTotalCartValue(); - } + @GetMapping + public Float getTotalCartValue() { + return shoppingCartService.getTotalCartValue(); + } - @PostMapping() - public void addItem(@RequestBody ItemTransportObject item) { - apiAdapter.addItem(item); - } + @PostMapping() + public void addItem(@RequestBody ItemTransportObject item) { + shoppingCartService.addItem(item.getName(), item.getQuantity()); + } } diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartFacade.java b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartFacade.java deleted file mode 100644 index a162368135..0000000000 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartFacade.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.hexagonal.adapter.in; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.baeldung.hexagonal.domain.ShoppingCartService; - -@Component -class ShoppingCartFacade { - - @Autowired - ShoppingCartService shoppingCartService; - - void addItem(ItemTransportObject item) { - shoppingCartService.addItem(item.getName(), item.getQuantity()); - } - - Float getTotalCartValue() { - return shoppingCartService.getTotalCartValue(); - } -} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCartService.java b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCartService.java deleted file mode 100644 index bc2cbab66a..0000000000 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCartService.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.baeldung.hexagonal.domain; - -import java.util.HashMap; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.baeldung.hexagonal.adapter.out.Product; -import com.baeldung.hexagonal.domain.ports.ProductRepository; - -@Service -public class ShoppingCartService { - - private final ShoppingCart shoppingCart; - - @Autowired - ProductRepository productRepository; - - public ShoppingCartService() { - this.shoppingCart = new ShoppingCart(new HashMap<>()); - } - - public Float getTotalCartValue() { - return shoppingCart.getTotalCartValue(); - } - - public void addItem(String name, Integer quantity) { - Product product = productRepository.findByName(name); - shoppingCart.addItem(product.toItem(), quantity); - } -} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/SimpleShoppingCartService.java b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/SimpleShoppingCartService.java new file mode 100644 index 0000000000..471ab37941 --- /dev/null +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/SimpleShoppingCartService.java @@ -0,0 +1,32 @@ +package com.baeldung.hexagonal.domain; + +import java.util.HashMap; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baeldung.hexagonal.ShoppingCartService; +import com.baeldung.hexagonal.adapter.out.Product; +import com.baeldung.hexagonal.domain.ports.ProductRepository; + +@Service +public class SimpleShoppingCartService implements ShoppingCartService { + + private final ShoppingCart shoppingCart; + + @Autowired + ProductRepository productRepository; + + public SimpleShoppingCartService() { + this.shoppingCart = new ShoppingCart(new HashMap<>()); + } + + public Float getTotalCartValue() { + return shoppingCart.getTotalCartValue(); + } + + public void addItem(String name, Integer quantity) { + Product product = productRepository.findByName(name); + shoppingCart.addItem(product.toItem(), quantity); + } +} From 8ffc0d36a20363a9730f69217c3f99a2eceb3815 Mon Sep 17 00:00:00 2001 From: asia Date: Sat, 21 Aug 2021 15:42:18 +0200 Subject: [PATCH 05/16] Refactoring --- .../baeldung/hexagonal/adapter/in/ShoppingCartController.java | 2 +- .../baeldung/hexagonal/{ => domain}/ShoppingCartService.java | 2 +- .../baeldung/hexagonal/domain/SimpleShoppingCartService.java | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) rename hexagonal/src/main/java/com/baeldung/hexagonal/{ => domain}/ShoppingCartService.java (76%) diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartController.java b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartController.java index d92f186c84..ffaa1a1a08 100644 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartController.java +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartController.java @@ -3,7 +3,7 @@ package com.baeldung.hexagonal.adapter.in; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import com.baeldung.hexagonal.ShoppingCartService; +import com.baeldung.hexagonal.domain.ShoppingCartService; @RestController @RequestMapping("/shopping-cart") diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/ShoppingCartService.java b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCartService.java similarity index 76% rename from hexagonal/src/main/java/com/baeldung/hexagonal/ShoppingCartService.java rename to hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCartService.java index 25613ed556..022020e298 100644 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/ShoppingCartService.java +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCartService.java @@ -1,4 +1,4 @@ -package com.baeldung.hexagonal; +package com.baeldung.hexagonal.domain; public interface ShoppingCartService { diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/SimpleShoppingCartService.java b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/SimpleShoppingCartService.java index 471ab37941..9bced883a5 100644 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/SimpleShoppingCartService.java +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/SimpleShoppingCartService.java @@ -5,7 +5,6 @@ import java.util.HashMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.baeldung.hexagonal.ShoppingCartService; import com.baeldung.hexagonal.adapter.out.Product; import com.baeldung.hexagonal.domain.ports.ProductRepository; From bdef2f248df6d03c45530683a4efcae700f4126b Mon Sep 17 00:00:00 2001 From: asia Date: Thu, 2 Sep 2021 14:26:36 +0200 Subject: [PATCH 06/16] BAEL-4211 Add benchmarks --- .../pom.xml | 112 +++++++++++++----- .../com/baeldung/jmh/BenchmarkRunner.java | 10 ++ .../baeldung/jmh/ObjectsCopyBenchmark.java | 42 +++++++ .../baeldung/jmh/PrimitivesCopyBenchmark.java | 42 +++++++ 4 files changed, 179 insertions(+), 27 deletions(-) create mode 100644 core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/BenchmarkRunner.java create mode 100644 core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/ObjectsCopyBenchmark.java create mode 100644 core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/PrimitivesCopyBenchmark.java diff --git a/core-java-modules/core-java-arrays-operations-advanced/pom.xml b/core-java-modules/core-java-arrays-operations-advanced/pom.xml index 5663a7d1ca..57574de4a3 100644 --- a/core-java-modules/core-java-arrays-operations-advanced/pom.xml +++ b/core-java-modules/core-java-arrays-operations-advanced/pom.xml @@ -1,35 +1,93 @@ - 4.0.0 - core-java-arrays-operations-advanced - core-java-arrays-operations-advanced - jar + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + core-java-arrays-operations-advanced + core-java-arrays-operations-advanced + jar - - core-java-modules - com.baeldung.core-java-modules - 0.0.1-SNAPSHOT - + + core-java-modules + com.baeldung.core-java-modules + 0.0.1-SNAPSHOT + - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + - - org.assertj - assertj-core - ${assertj-core.version} - test - - + + org.assertj + assertj-core + ${assertj-core.version} + test + - - 3.10.0 - + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + + + + + 3.10.0 + 1.22 + UTF-8 + 1.33 + 3.0.2 + 0.10 + 3.2.0 + + + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + + com.baeldung.BenchmarkRunner + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven-assembly-plugin.version} + + + jar-with-dependencies + + + + com.baeldung.jmh.BenchmarkRunner + + + + + + make-assembly + package + + single + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/BenchmarkRunner.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/BenchmarkRunner.java new file mode 100644 index 0000000000..96e2a8833e --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/BenchmarkRunner.java @@ -0,0 +1,10 @@ +package com.baeldung.jmh; + +public class BenchmarkRunner { + + public static void main(String[] args) throws Exception { + org.openjdk.jmh.Main.main(args); + + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/ObjectsCopyBenchmark.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/ObjectsCopyBenchmark.java new file mode 100644 index 0000000000..2cfa00b0e8 --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/ObjectsCopyBenchmark.java @@ -0,0 +1,42 @@ +package com.baeldung.jmh; + +import org.openjdk.jmh.annotations.*; + +import java.util.Arrays; +import java.util.Random; +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.AverageTime) +@State(Scope.Thread) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@Warmup(iterations = 10) +@Fork(1) +@Measurement(iterations = 100) +public class ObjectsCopyBenchmark { + + @Param({ "10", "1000000" }) + public int SIZE; + Integer[] src; + + @Setup + public void setup() { + Random r = new Random(); + src = new Integer[SIZE]; + + for (int i = 0; i < SIZE; i++) { + src[i] = r.nextInt(); + } + } + + @Benchmark + public Integer[] systemArrayCopyBenchmark() { + Integer[] target = new Integer[SIZE]; + System.arraycopy(src, 0, target, 0, SIZE); + return target; + } + + @Benchmark + public Integer[] arraysCopyOfBenchmark() { + return Arrays.copyOf(src, SIZE); + } +} diff --git a/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/PrimitivesCopyBenchmark.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/PrimitivesCopyBenchmark.java new file mode 100644 index 0000000000..f51ceadf2a --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/PrimitivesCopyBenchmark.java @@ -0,0 +1,42 @@ +package com.baeldung.jmh; + +import org.openjdk.jmh.annotations.*; + +import java.util.Arrays; +import java.util.Random; +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.AverageTime) +@State(Scope.Thread) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@Warmup(iterations = 10) +@Fork(1) +@Measurement(iterations = 100) +public class PrimitivesCopyBenchmark { + + @Param({ "10", "1000000" }) + public int SIZE; + int[] src; + + @Setup + public void setup() { + Random r = new Random(); + src = new int[SIZE]; + + for (int i = 0; i < SIZE; i++) { + src[i] = r.nextInt(); + } + } + + @Benchmark + public int[] systemArrayCopyBenchmark() { + int[] target = new int[SIZE]; + System.arraycopy(src, 0, target, 0, SIZE); + return target; + } + + @Benchmark + public int[] arraysCopyOfBenchmark() { + return Arrays.copyOf(src, SIZE); + } +} From 5afba3476d85767a1dc22ce5979006ed9ccaf893 Mon Sep 17 00:00:00 2001 From: JoannaaKL <67866556+JoannaaKL@users.noreply.github.com> Date: Thu, 2 Sep 2021 15:57:03 +0200 Subject: [PATCH 07/16] Delete hexagonal directory --- hexagonal/pom.xml | 70 ------------------- .../com/baeldung/hexagonal/Application.java | 12 ---- .../adapter/in/ItemTransportObject.java | 10 --- .../adapter/in/ShoppingCartController.java | 24 ------- .../hexagonal/adapter/out/Product.java | 26 ------- .../adapter/out/ProductCrudRepository.java | 12 ---- .../baeldung/hexagonal/domain/CartItem.java | 13 ---- .../hexagonal/domain/ShoppingCart.java | 25 ------- .../hexagonal/domain/ShoppingCartService.java | 8 --- .../domain/SimpleShoppingCartService.java | 31 -------- .../domain/ports/ProductRepository.java | 8 --- .../src/main/resources/application.properties | 5 -- .../hexagonal/domain/ShoppingCartTest.java | 28 -------- 13 files changed, 272 deletions(-) delete mode 100644 hexagonal/pom.xml delete mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/Application.java delete mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ItemTransportObject.java delete mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartController.java delete mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/Product.java delete mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/ProductCrudRepository.java delete mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/domain/CartItem.java delete mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCart.java delete mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCartService.java delete mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/domain/SimpleShoppingCartService.java delete mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/domain/ports/ProductRepository.java delete mode 100644 hexagonal/src/main/resources/application.properties delete mode 100644 hexagonal/src/test/java/com/baeldung/hexagonal/domain/ShoppingCartTest.java diff --git a/hexagonal/pom.xml b/hexagonal/pom.xml deleted file mode 100644 index 020a48ce58..0000000000 --- a/hexagonal/pom.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.5.3 - - - com.example - demo - 0.0.1-SNAPSHOT - demo - Demo project for Spring Boot - - 11 - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - com.h2database - h2 - runtime - - - org.springframework.boot - spring-boot-starter-web - - - - org.projectlombok - lombok - true - - - javax.xml.bind - jaxb-api - 2.3.0 - - - org.junit.jupiter - junit-jupiter-engine - 5.7.2 - test - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - - - diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/Application.java b/hexagonal/src/main/java/com/baeldung/hexagonal/Application.java deleted file mode 100644 index eb762f615d..0000000000 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/Application.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.hexagonal; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class Application { - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } -} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ItemTransportObject.java b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ItemTransportObject.java deleted file mode 100644 index bcf38e99a0..0000000000 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ItemTransportObject.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.baeldung.hexagonal.adapter.in; - -import lombok.Data; - -@Data -class ItemTransportObject { - private String name; - private Integer quantity; - private String category; -} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartController.java b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartController.java deleted file mode 100644 index ffaa1a1a08..0000000000 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/in/ShoppingCartController.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.hexagonal.adapter.in; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import com.baeldung.hexagonal.domain.ShoppingCartService; - -@RestController -@RequestMapping("/shopping-cart") -public class ShoppingCartController { - - @Autowired - ShoppingCartService shoppingCartService; - - @GetMapping - public Float getTotalCartValue() { - return shoppingCartService.getTotalCartValue(); - } - - @PostMapping() - public void addItem(@RequestBody ItemTransportObject item) { - shoppingCartService.addItem(item.getName(), item.getQuantity()); - } -} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/Product.java b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/Product.java deleted file mode 100644 index 00a330b50a..0000000000 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/Product.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.baeldung.hexagonal.adapter.out; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; - -import com.baeldung.hexagonal.domain.CartItem; - -import lombok.Data; - -@Entity -@Data -public class Product { - - @Id - public final Integer id; - @Column - public final String name; - @Column - public final Float price; - - public CartItem toItem() { - return new CartItem(name, price); - } - -} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/ProductCrudRepository.java b/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/ProductCrudRepository.java deleted file mode 100644 index 3708a1a19d..0000000000 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/adapter/out/ProductCrudRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.hexagonal.adapter.out; - -import org.springframework.data.repository.CrudRepository; -import org.springframework.stereotype.Repository; - -import com.baeldung.hexagonal.domain.ports.ProductRepository; - -@Repository -public interface ProductCrudRepository extends CrudRepository, ProductRepository { - - Product findByName(String name); -} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/CartItem.java b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/CartItem.java deleted file mode 100644 index 1e0fcfb50e..0000000000 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/CartItem.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.hexagonal.domain; - -import lombok.Data; -import lombok.NonNull; - -@Data -public class CartItem { - - @NonNull - private final String name; - private final Float price; - -} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCart.java b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCart.java deleted file mode 100644 index 949090eb80..0000000000 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCart.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.hexagonal.domain; - -import java.util.Map; - -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -class ShoppingCart { - - private final Map itemToQuantity; - - Float getTotalCartValue() { - return itemToQuantity.entrySet() - .stream() - .map(item -> item.getKey() - .getPrice() * item.getValue()) - .reduce(0f, Float::sum); - } - - void addItem(CartItem cartItem, Integer quantity) { - if (quantity < 0) - throw new IllegalArgumentException("Quantity should not be negative."); - itemToQuantity.put(cartItem, itemToQuantity.getOrDefault(cartItem, 0) + quantity); - } -} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCartService.java b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCartService.java deleted file mode 100644 index 022020e298..0000000000 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ShoppingCartService.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.baeldung.hexagonal.domain; - -public interface ShoppingCartService { - - Float getTotalCartValue(); - - void addItem(String name, Integer quantity); -} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/SimpleShoppingCartService.java b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/SimpleShoppingCartService.java deleted file mode 100644 index 9bced883a5..0000000000 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/SimpleShoppingCartService.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.baeldung.hexagonal.domain; - -import java.util.HashMap; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.baeldung.hexagonal.adapter.out.Product; -import com.baeldung.hexagonal.domain.ports.ProductRepository; - -@Service -public class SimpleShoppingCartService implements ShoppingCartService { - - private final ShoppingCart shoppingCart; - - @Autowired - ProductRepository productRepository; - - public SimpleShoppingCartService() { - this.shoppingCart = new ShoppingCart(new HashMap<>()); - } - - public Float getTotalCartValue() { - return shoppingCart.getTotalCartValue(); - } - - public void addItem(String name, Integer quantity) { - Product product = productRepository.findByName(name); - shoppingCart.addItem(product.toItem(), quantity); - } -} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ports/ProductRepository.java b/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ports/ProductRepository.java deleted file mode 100644 index b4f53beb1e..0000000000 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/domain/ports/ProductRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.baeldung.hexagonal.domain.ports; - -import com.baeldung.hexagonal.adapter.out.Product; - -public interface ProductRepository { - - Product findByName(String name); -} diff --git a/hexagonal/src/main/resources/application.properties b/hexagonal/src/main/resources/application.properties deleted file mode 100644 index 730dded1b7..0000000000 --- a/hexagonal/src/main/resources/application.properties +++ /dev/null @@ -1,5 +0,0 @@ -spring.datasource.url=jdbc:h2:mem:testdb -spring.datasource.driverClassName=org.h2.Driver -spring.datasource.username=sa -spring.datasource.password=password -spring.jpa.database-platform=org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/hexagonal/src/test/java/com/baeldung/hexagonal/domain/ShoppingCartTest.java b/hexagonal/src/test/java/com/baeldung/hexagonal/domain/ShoppingCartTest.java deleted file mode 100644 index c39892a8fa..0000000000 --- a/hexagonal/src/test/java/com/baeldung/hexagonal/domain/ShoppingCartTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.hexagonal.domain; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.jupiter.api.Test; - -class ShoppingCartTest { - - @Test - void givenNonemptyShoppingCart_whenGetTotalCartValueCalled_thenShouldCalculateCorrectly() { - - // given - Map items = new HashMap<>(); - items.put(new CartItem("Cheese", 1.5f), 2); - items.put(new CartItem("Lemon", 2f), 5); - - ShoppingCart cart = new ShoppingCart(items); - - // when - Float totalCartValue = cart.getTotalCartValue(); - - // then - assertEquals(totalCartValue, 13f, 0); - } -} From 80f9c20edf3a25d5e92682c3ada354b4fdaac022 Mon Sep 17 00:00:00 2001 From: asia Date: Sun, 5 Sep 2021 11:16:30 +0200 Subject: [PATCH 08/16] Refactoring based on the feedback --- .../pom.xml | 148 ++++++++---------- .../BenchmarkRunner.java | 3 +- .../ObjectsCopyBenchmark.java | 2 +- .../PrimitivesCopyBenchmark.java | 3 +- 4 files changed, 70 insertions(+), 86 deletions(-) rename core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/{jmh => copyArrayMethodsPerformance}/BenchmarkRunner.java (73%) rename core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/{jmh => copyArrayMethodsPerformance}/ObjectsCopyBenchmark.java (94%) rename core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/{jmh => copyArrayMethodsPerformance}/PrimitivesCopyBenchmark.java (94%) diff --git a/core-java-modules/core-java-arrays-operations-advanced/pom.xml b/core-java-modules/core-java-arrays-operations-advanced/pom.xml index 57574de4a3..f690b4d17d 100644 --- a/core-java-modules/core-java-arrays-operations-advanced/pom.xml +++ b/core-java-modules/core-java-arrays-operations-advanced/pom.xml @@ -1,93 +1,75 @@ - 4.0.0 - core-java-arrays-operations-advanced - core-java-arrays-operations-advanced - jar + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + core-java-arrays-operations-advanced + core-java-arrays-operations-advanced + jar - - core-java-modules - com.baeldung.core-java-modules - 0.0.1-SNAPSHOT - + + core-java-modules + com.baeldung.core-java-modules + 0.0.1-SNAPSHOT + - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + - - org.assertj - assertj-core - ${assertj-core.version} - test - + + org.assertj + assertj-core + ${assertj-core.version} + test + - - org.openjdk.jmh - jmh-core - ${jmh.version} - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh.version} - - + + org.openjdk.jmh + jmh-core + ${jmh.version} + - - 3.10.0 - 1.22 - UTF-8 - 1.33 - 3.0.2 - 0.10 - 3.2.0 - + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + + - - - - org.apache.maven.plugins - maven-jar-plugin - ${maven-jar-plugin.version} - - - - com.baeldung.BenchmarkRunner - - - - - - org.apache.maven.plugins - maven-assembly-plugin - ${maven-assembly-plugin.version} - - - jar-with-dependencies - - - - com.baeldung.jmh.BenchmarkRunner - - - - - - make-assembly - package - - single - - - - - - + + 3.10.0 + 1.33 + + + + + + maven-assembly-plugin + + + jar-with-dependencies + + + + com.baeldung.copyArrayMethodsPerformance.BenchmarkRunner + + + + + + make-assembly + package + + single + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/BenchmarkRunner.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/BenchmarkRunner.java similarity index 73% rename from core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/BenchmarkRunner.java rename to core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/BenchmarkRunner.java index 96e2a8833e..b34b121e1a 100644 --- a/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/BenchmarkRunner.java +++ b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/BenchmarkRunner.java @@ -1,8 +1,9 @@ -package com.baeldung.jmh; +package com.baeldung.copyArrayMethodsPerformance; public class BenchmarkRunner { public static void main(String[] args) throws Exception { + org.openjdk.jmh.Main.main(args); } diff --git a/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/ObjectsCopyBenchmark.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/ObjectsCopyBenchmark.java similarity index 94% rename from core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/ObjectsCopyBenchmark.java rename to core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/ObjectsCopyBenchmark.java index 2cfa00b0e8..4c9992a38d 100644 --- a/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/ObjectsCopyBenchmark.java +++ b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/ObjectsCopyBenchmark.java @@ -1,4 +1,4 @@ -package com.baeldung.jmh; +package com.baeldung.copyArrayMethodsPerformance; import org.openjdk.jmh.annotations.*; diff --git a/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/PrimitivesCopyBenchmark.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/PrimitivesCopyBenchmark.java similarity index 94% rename from core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/PrimitivesCopyBenchmark.java rename to core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/PrimitivesCopyBenchmark.java index f51ceadf2a..e3fcc8568f 100644 --- a/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/jmh/PrimitivesCopyBenchmark.java +++ b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/PrimitivesCopyBenchmark.java @@ -1,4 +1,4 @@ -package com.baeldung.jmh; +package com.baeldung.copyArrayMethodsPerformance; import org.openjdk.jmh.annotations.*; @@ -16,6 +16,7 @@ public class PrimitivesCopyBenchmark { @Param({ "10", "1000000" }) public int SIZE; + int[] src; @Setup From 52581b66722af0d70cfc6088a5d3538e7ffc3ae1 Mon Sep 17 00:00:00 2001 From: asia Date: Tue, 7 Sep 2021 10:12:09 +0200 Subject: [PATCH 09/16] Refactoring based on feedback - package rename --- core-java-modules/core-java-arrays-operations-advanced/pom.xml | 2 +- .../baeldung/copyArrayMethodsPerformance/BenchmarkRunner.java | 2 +- .../copyArrayMethodsPerformance/ObjectsCopyBenchmark.java | 2 +- .../copyArrayMethodsPerformance/PrimitivesCopyBenchmark.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core-java-modules/core-java-arrays-operations-advanced/pom.xml b/core-java-modules/core-java-arrays-operations-advanced/pom.xml index f690b4d17d..065f1930e2 100644 --- a/core-java-modules/core-java-arrays-operations-advanced/pom.xml +++ b/core-java-modules/core-java-arrays-operations-advanced/pom.xml @@ -55,7 +55,7 @@ - com.baeldung.copyArrayMethodsPerformance.BenchmarkRunner + com.baeldung.copyarraymethodsperformance.BenchmarkRunner diff --git a/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/BenchmarkRunner.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/BenchmarkRunner.java index b34b121e1a..0adbcc1986 100644 --- a/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/BenchmarkRunner.java +++ b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/BenchmarkRunner.java @@ -1,4 +1,4 @@ -package com.baeldung.copyArrayMethodsPerformance; +package com.baeldung.copyarraymethodsperformance; public class BenchmarkRunner { diff --git a/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/ObjectsCopyBenchmark.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/ObjectsCopyBenchmark.java index 4c9992a38d..6a492bf0d1 100644 --- a/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/ObjectsCopyBenchmark.java +++ b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/ObjectsCopyBenchmark.java @@ -1,4 +1,4 @@ -package com.baeldung.copyArrayMethodsPerformance; +package com.baeldung.copyarraymethodsperformance; import org.openjdk.jmh.annotations.*; diff --git a/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/PrimitivesCopyBenchmark.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/PrimitivesCopyBenchmark.java index e3fcc8568f..767e91a350 100644 --- a/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/PrimitivesCopyBenchmark.java +++ b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/PrimitivesCopyBenchmark.java @@ -1,4 +1,4 @@ -package com.baeldung.copyArrayMethodsPerformance; +package com.baeldung.copyarraymethodsperformance; import org.openjdk.jmh.annotations.*; From 23e4df15ff00e63e515468bdc8e61d770576fb48 Mon Sep 17 00:00:00 2001 From: asia Date: Tue, 7 Sep 2021 10:26:07 +0200 Subject: [PATCH 10/16] Directory rename --- .../BenchmarkRunner.java | 0 .../ObjectsCopyBenchmark.java | 0 .../PrimitivesCopyBenchmark.java | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/{copyArrayMethodsPerformance => copyarraymethodsperformance}/BenchmarkRunner.java (100%) rename core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/{copyArrayMethodsPerformance => copyarraymethodsperformance}/ObjectsCopyBenchmark.java (100%) rename core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/{copyArrayMethodsPerformance => copyarraymethodsperformance}/PrimitivesCopyBenchmark.java (100%) diff --git a/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/BenchmarkRunner.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyarraymethodsperformance/BenchmarkRunner.java similarity index 100% rename from core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/BenchmarkRunner.java rename to core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyarraymethodsperformance/BenchmarkRunner.java diff --git a/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/ObjectsCopyBenchmark.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyarraymethodsperformance/ObjectsCopyBenchmark.java similarity index 100% rename from core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/ObjectsCopyBenchmark.java rename to core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyarraymethodsperformance/ObjectsCopyBenchmark.java diff --git a/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/PrimitivesCopyBenchmark.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyarraymethodsperformance/PrimitivesCopyBenchmark.java similarity index 100% rename from core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyArrayMethodsPerformance/PrimitivesCopyBenchmark.java rename to core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/copyarraymethodsperformance/PrimitivesCopyBenchmark.java From fa5d7221e92a7ba8f6068077961916f6c5c0c40a Mon Sep 17 00:00:00 2001 From: asia Date: Mon, 20 Sep 2021 12:32:52 +0200 Subject: [PATCH 11/16] BAEL-5149 Remove accents from String in Java --- .../StringNormalizer.java | 49 +++++++++++++++++++ .../StringNormalizerUnitTest.java | 44 +++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/accentsanddiacriticsremoval/StringNormalizer.java create mode 100644 core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/accentsanddiacriticsremoval/StringNormalizerUnitTest.java diff --git a/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/accentsanddiacriticsremoval/StringNormalizer.java b/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/accentsanddiacriticsremoval/StringNormalizer.java new file mode 100644 index 0000000000..fe02edfe5d --- /dev/null +++ b/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/accentsanddiacriticsremoval/StringNormalizer.java @@ -0,0 +1,49 @@ +package com.baeldung.accentsanddiacriticsremoval; + +import org.apache.commons.lang3.StringUtils; + +import java.text.Normalizer; +import java.util.StringJoiner; + +class StringNormalizer { + + static String removeAccentsWithApacheCommons(String input) { + return StringUtils.stripAccents(input); + } + + static String removeAccents(String input) { + return normalize(input).replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); + } + + static String unicodeValueOfNormalizedString(String input) { + return toUnicode(normalize(input)); + } + + private static String normalize(String input) { + return input == null ? null : Normalizer.normalize(input, Normalizer.Form.NFD); + } + + private static String toUnicode(String input) { + if (input.length() == 1) { + return toUnicode(input.charAt(0)); + } else { + StringJoiner stringJoiner = new StringJoiner(" "); + for (char c : input.toCharArray()) { + stringJoiner.add(toUnicode(c)); + } + return stringJoiner.toString(); + } + } + + private static String toUnicode(char input) { + + String hex = Integer.toHexString(input); + StringBuilder sb = new StringBuilder(hex); + + while (sb.length() < 4) { + sb.insert(0, "0"); + } + sb.insert(0, "\\u"); + return sb.toString(); + } +} diff --git a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/accentsanddiacriticsremoval/StringNormalizerUnitTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/accentsanddiacriticsremoval/StringNormalizerUnitTest.java new file mode 100644 index 0000000000..5c132ca7e7 --- /dev/null +++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/accentsanddiacriticsremoval/StringNormalizerUnitTest.java @@ -0,0 +1,44 @@ +package com.baeldung.accentsanddiacriticsremoval; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +import com.baeldung.accentsanddiacriticsremoval.StringNormalizer; + +class StringNormalizerUnitTest { + + @Test + void givenStringWithDecomposableUnicodeCharacters_whenRemoveAccents_thenReturnASCIIString() { + assertEquals("aaaeiiiiggnnsssuuy", StringNormalizer.removeAccents("āăąēîïĩíĝġńñšŝśûůŷ")); + } + + @Test + void givenStringWithDecomposableUnicodeCharacters_whenRemoveAccentsWithApacheCommons_thenReturnASCIIString() { + assertEquals("aaaeiiiiggnnsssuuy", StringNormalizer.removeAccentsWithApacheCommons("āăąēîïĩíĝġńñšŝśûůŷ")); + } + + @Test + void givenStringWithNondecomposableUnicodeCharacters_whenRemoveAccents_thenReturnOriginalString() { + assertEquals("łđħœ", StringNormalizer.removeAccents("łđħœ")); + } + + @Test + void givenStringWithNondecomposableUnicodeCharacters_whenRemoveAccentsWithApacheCommons_thenReturnModifiedString() { + assertEquals("lđħœ", StringNormalizer.removeAccentsWithApacheCommons("łđħœ")); + } + + @Test + void givenStringWithDecomposableUnicodeCharacters_whenUnicodeValueOfNormalizedString_thenReturnUnicodeValue() { + assertEquals("\\u0061 \\u0304", StringNormalizer.unicodeValueOfNormalizedString("ā")); + assertEquals("\\u0069 \\u0308", StringNormalizer.unicodeValueOfNormalizedString("ï")); + assertEquals("\\u006e \\u0301", StringNormalizer.unicodeValueOfNormalizedString("ń")); + } + + @Test + void givenStringWithNonDecomposableUnicodeCharacters_whenUnicodeValueOfNormalizedString_thenReturnOriginalValue() { + assertEquals("\\u0142", StringNormalizer.unicodeValueOfNormalizedString("ł")); + assertEquals("\\u0127", StringNormalizer.unicodeValueOfNormalizedString("ħ")); + assertEquals("\\u0111", StringNormalizer.unicodeValueOfNormalizedString("đ")); + } +} \ No newline at end of file From 0771c47a87f9e049e17334e2cafb27841800763d Mon Sep 17 00:00:00 2001 From: asia Date: Mon, 20 Sep 2021 12:32:52 +0200 Subject: [PATCH 12/16] BAEL-5149 Remove accents from String in Java --- .../StringNormalizer.java | 49 +++++++++++++ .../CollatorTest.java | 70 +++++++++++++++++++ .../StringNormalizerUnitTest.java | 51 ++++++++++++++ 3 files changed, 170 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/accentsanddiacriticsremoval/StringNormalizer.java create mode 100644 core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/accentsanddiacriticsremoval/CollatorTest.java create mode 100644 core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/accentsanddiacriticsremoval/StringNormalizerUnitTest.java diff --git a/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/accentsanddiacriticsremoval/StringNormalizer.java b/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/accentsanddiacriticsremoval/StringNormalizer.java new file mode 100644 index 0000000000..d33b9178ea --- /dev/null +++ b/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/accentsanddiacriticsremoval/StringNormalizer.java @@ -0,0 +1,49 @@ +package com.baeldung.accentsanddiacriticsremoval; + +import org.apache.commons.lang3.StringUtils; + +import java.text.Normalizer; +import java.util.StringJoiner; + +class StringNormalizer { + + static String removeAccentsWithApacheCommons(String input) { + return StringUtils.stripAccents(input); + } + + static String removeAccents(String input) { + return normalize(input).replaceAll("\\p{M}", ""); + } + + static String unicodeValueOfNormalizedString(String input) { + return toUnicode(normalize(input)); + } + + private static String normalize(String input) { + return input == null ? null : Normalizer.normalize(input, Normalizer.Form.NFKD); + } + + private static String toUnicode(String input) { + if (input.length() == 1) { + return toUnicode(input.charAt(0)); + } else { + StringJoiner stringJoiner = new StringJoiner(" "); + for (char c : input.toCharArray()) { + stringJoiner.add(toUnicode(c)); + } + return stringJoiner.toString(); + } + } + + private static String toUnicode(char input) { + + String hex = Integer.toHexString(input); + StringBuilder sb = new StringBuilder(hex); + + while (sb.length() < 4) { + sb.insert(0, "0"); + } + sb.insert(0, "\\u"); + return sb.toString(); + } +} diff --git a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/accentsanddiacriticsremoval/CollatorTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/accentsanddiacriticsremoval/CollatorTest.java new file mode 100644 index 0000000000..26386982e6 --- /dev/null +++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/accentsanddiacriticsremoval/CollatorTest.java @@ -0,0 +1,70 @@ +package com.baeldung.accentsanddiacriticsremoval; + +import org.junit.Test; +import org.openjdk.jmh.annotations.Setup; + +import java.text.Collator; + +import static java.lang.Character.*; +import static java.lang.String.valueOf; +import static org.junit.Assert.assertEquals; + +public class CollatorTest { + + private final Collator collator = Collator.getInstance(); + + @Setup + public void setup() { + collator.setDecomposition(2); + } + + @Test + public void givenAccentedStringAndPrimaryCollatorStrength_whenCompareWithASCIIString_thenReturnTrue() { + Collator collator = Collator.getInstance(); + collator.setDecomposition(2); + collator.setStrength(0); + assertEquals(0, (collator.compare("a", "a"))); + assertEquals(0, (collator.compare("ä", "a"))); + assertEquals(0, (collator.compare("A", "a"))); + assertEquals(1, (collator.compare("b", "a"))); + assertEquals(0, (collator.compare(valueOf(toChars(0x0001)), valueOf(toChars(0x0002))))); + } + + @Test + public void givenAccentedStringAndSecondaryCollatorStrength_whenCompareWithASCIIString_thenReturnTrue() { + collator.setStrength(1); + assertEquals(1, (collator.compare("ä", "a"))); + assertEquals(1, (collator.compare("b", "a"))); + assertEquals(0, (collator.compare("A", "a"))); + assertEquals(0, (collator.compare("a", "a"))); + assertEquals(0, (collator.compare(valueOf(toChars(0x0001)), valueOf(toChars(0x0002))))); + + } + + @Test + public void givenAccentedStringAndTeriaryCollatorStrength_whenCompareWithASCIIString_thenReturnTrue() { + collator.setStrength(2); + assertEquals(1, (collator.compare("A", "a"))); + assertEquals(1, (collator.compare("ä", "a"))); + assertEquals(1, (collator.compare("b", "a"))); + assertEquals(0, (collator.compare("a", "a"))); + assertEquals(0, (collator.compare(valueOf(toChars(0x0001)), valueOf(toChars(0x0002))))); + } + + @Test + public void givenAccentedStringAndIdenticalCollatorStrength_whenCompareWithASCIIString_thenReturnTrue() { + collator.setStrength(3); + assertEquals(1, (collator.compare("A", "a"))); + assertEquals(1, (collator.compare("ä", "a"))); + assertEquals(1, (collator.compare("b", "a"))); + assertEquals(-1, (collator.compare(valueOf(toChars(0x0001)), valueOf(toChars(0x0002))))); + assertEquals(0, (collator.compare("a", "a"))); + } + + @Test + public void givenNondecomposableAccentedStringAndIdenticalCollatorStrength_whenCompareWithASCIIString_thenReturnTrue() { + collator.setStrength(0); + assertEquals(1, collator.compare("ł", "l")); + assertEquals(1, collator.compare("ø", "o")); + } +} diff --git a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/accentsanddiacriticsremoval/StringNormalizerUnitTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/accentsanddiacriticsremoval/StringNormalizerUnitTest.java new file mode 100644 index 0000000000..74359726b7 --- /dev/null +++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/accentsanddiacriticsremoval/StringNormalizerUnitTest.java @@ -0,0 +1,51 @@ +package com.baeldung.accentsanddiacriticsremoval; + +import static org.junit.Assert.assertFalse; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.text.Normalizer; + +import org.junit.jupiter.api.Test; + +class StringNormalizerUnitTest { + + @Test + public void givenNotNormalizedString_whenIsNormalized_thenReturnFalse() { + assertFalse(Normalizer.isNormalized("āăąēîïĩíĝġńñšŝśûůŷ", Normalizer.Form.NFKD)); + } + + @Test + void givenStringWithDecomposableUnicodeCharacters_whenRemoveAccents_thenReturnASCIIString() { + assertEquals("aaaeiiiiggnnsssuuy", StringNormalizer.removeAccents("āăąēîïĩíĝġńñšŝśûůŷ")); + } + + @Test + void givenStringWithDecomposableUnicodeCharacters_whenRemoveAccentsWithApacheCommons_thenReturnASCIIString() { + assertEquals("aaaeiiiiggnnsssuuy", StringNormalizer.removeAccentsWithApacheCommons("āăąēîïĩíĝġńñšŝśûůŷ")); + } + + @Test + void givenStringWithNondecomposableUnicodeCharacters_whenRemoveAccents_thenReturnOriginalString() { + assertEquals("łđħœ", StringNormalizer.removeAccents("łđħœ")); + } + + @Test + void givenStringWithNondecomposableUnicodeCharacters_whenRemoveAccentsWithApacheCommons_thenReturnModifiedString() { + assertEquals("lđħœ", StringNormalizer.removeAccentsWithApacheCommons("łđħœ")); + } + + @Test + void givenStringWithDecomposableUnicodeCharacters_whenUnicodeValueOfNormalizedString_thenReturnUnicodeValue() { + assertEquals("\\u0066 \\u0069", StringNormalizer.unicodeValueOfNormalizedString("fi")); + assertEquals("\\u0061 \\u0304", StringNormalizer.unicodeValueOfNormalizedString("ā")); + assertEquals("\\u0069 \\u0308", StringNormalizer.unicodeValueOfNormalizedString("ï")); + assertEquals("\\u006e \\u0301", StringNormalizer.unicodeValueOfNormalizedString("ń")); + } + + @Test + void givenStringWithNonDecomposableUnicodeCharacters_whenUnicodeValueOfNormalizedString_thenReturnOriginalValue() { + assertEquals("\\u0142", StringNormalizer.unicodeValueOfNormalizedString("ł")); + assertEquals("\\u0127", StringNormalizer.unicodeValueOfNormalizedString("ħ")); + assertEquals("\\u0111", StringNormalizer.unicodeValueOfNormalizedString("đ")); + } +} \ No newline at end of file From 3ae4d1ee7614392371d4873925944bfd971eb623 Mon Sep 17 00:00:00 2001 From: asia Date: Mon, 11 Oct 2021 10:27:17 +0200 Subject: [PATCH 13/16] Including suggestions after a review --- .../CollatorUnitTest.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/accentsanddiacriticsremoval/CollatorUnitTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/accentsanddiacriticsremoval/CollatorUnitTest.java index 04fdcb50a1..93b4f5af2e 100644 --- a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/accentsanddiacriticsremoval/CollatorUnitTest.java +++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/accentsanddiacriticsremoval/CollatorUnitTest.java @@ -23,42 +23,42 @@ public class CollatorUnitTest { Collator collator = Collator.getInstance(); collator.setDecomposition(2); collator.setStrength(0); - assertEquals(0, (collator.compare("a", "a"))); - assertEquals(0, (collator.compare("ä", "a"))); - assertEquals(0, (collator.compare("A", "a"))); - assertEquals(1, (collator.compare("b", "a"))); - assertEquals(0, (collator.compare(valueOf(toChars(0x0001)), valueOf(toChars(0x0002))))); + assertEquals(0, collator.compare("a", "a")); + assertEquals(0, collator.compare("ä", "a")); + assertEquals(0, collator.compare("A", "a")); + assertEquals(1, collator.compare("b", "a")); + assertEquals(0, collator.compare(valueOf(toChars(0x0001)), valueOf(toChars(0x0002)))); } @Test public void givenAccentedStringAndSecondaryCollatorStrength_whenCompareWithASCIIString_thenReturnTrue() { collator.setStrength(1); - assertEquals(1, (collator.compare("ä", "a"))); - assertEquals(1, (collator.compare("b", "a"))); - assertEquals(0, (collator.compare("A", "a"))); - assertEquals(0, (collator.compare("a", "a"))); - assertEquals(0, (collator.compare(valueOf(toChars(0x0001)), valueOf(toChars(0x0002))))); + assertEquals(1, collator.compare("ä", "a")); + assertEquals(1, collator.compare("b", "a")); + assertEquals(0, collator.compare("A", "a")); + assertEquals(0, collator.compare("a", "a")); + assertEquals(0, collator.compare(valueOf(toChars(0x0001)), valueOf(toChars(0x0002)))); } @Test public void givenAccentedStringAndTeriaryCollatorStrength_whenCompareWithASCIIString_thenReturnTrue() { collator.setStrength(2); - assertEquals(1, (collator.compare("A", "a"))); - assertEquals(1, (collator.compare("ä", "a"))); - assertEquals(1, (collator.compare("b", "a"))); - assertEquals(0, (collator.compare("a", "a"))); - assertEquals(0, (collator.compare(valueOf(toChars(0x0001)), valueOf(toChars(0x0002))))); + assertEquals(1, collator.compare("A", "a")); + assertEquals(1, collator.compare("ä", "a")); + assertEquals(1, collator.compare("b", "a")); + assertEquals(0, collator.compare("a", "a")); + assertEquals(0, collator.compare(valueOf(toChars(0x0001)), valueOf(toChars(0x0002)))); } @Test public void givenAccentedStringAndIdenticalCollatorStrength_whenCompareWithASCIIString_thenReturnTrue() { collator.setStrength(3); - assertEquals(1, (collator.compare("A", "a"))); - assertEquals(1, (collator.compare("ä", "a"))); - assertEquals(1, (collator.compare("b", "a"))); - assertEquals(-1, (collator.compare(valueOf(toChars(0x0001)), valueOf(toChars(0x0002))))); - assertEquals(0, (collator.compare("a", "a"))); + assertEquals(1, collator.compare("A", "a")); + assertEquals(1, collator.compare("ä", "a")); + assertEquals(1, collator.compare("b", "a")); + assertEquals(-1, collator.compare(valueOf(toChars(0x0001)), valueOf(toChars(0x0002)))); + assertEquals(0, collator.compare("a", "a")); } @Test From 39cc6be1ab910520c843a03f704ca183e7edfd84 Mon Sep 17 00:00:00 2001 From: asia Date: Sun, 30 Jan 2022 21:19:39 +0100 Subject: [PATCH 14/16] Add SPQR project. --- .../spring-boot-libraries-2/pom.xml | 5 ++ .../src/main/java/com/baeldung/sprq/Book.java | 57 ++++++++++++++++++ .../java/com/baeldung/sprq/BookResolver.java | 42 +++++++++++++ .../java/com/baeldung/sprq/BookService.java | 48 +++++++++++++++ .../com/baeldung/sprq/GraphqlController.java | 35 +++++++++++ .../java/com/baeldung/sprq/IBookService.java | 15 +++++ .../GraphqlControllerIntegrationTest.java | 60 +++++++++++++++++++ 7 files changed, 262 insertions(+) create mode 100644 spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/Book.java create mode 100644 spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/BookResolver.java create mode 100644 spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/BookService.java create mode 100644 spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/GraphqlController.java create mode 100644 spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/IBookService.java create mode 100644 spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/sprq/GraphqlControllerIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-libraries-2/pom.xml b/spring-boot-modules/spring-boot-libraries-2/pom.xml index 04c09754b4..f62a341efc 100644 --- a/spring-boot-modules/spring-boot-libraries-2/pom.xml +++ b/spring-boot-modules/spring-boot-libraries-2/pom.xml @@ -57,6 +57,11 @@ ${awaitility.version} test + + io.leangen.graphql + spqr + 0.11.2 + diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/Book.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/Book.java new file mode 100644 index 0000000000..c6ff9e515a --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/Book.java @@ -0,0 +1,57 @@ +package com.baeldung.sprq; + +import java.util.Objects; + +public class Book { + private Integer id; + private String author; + private String title; + + public Book(Integer id, String author, String title) { + this.id = id; + this.author = author; + this.title = title; + } + + public Book() { + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + Book book = (Book) o; + return id.equals(book.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/BookResolver.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/BookResolver.java new file mode 100644 index 0000000000..747d52f0af --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/BookResolver.java @@ -0,0 +1,42 @@ +package com.baeldung.sprq; + +import io.leangen.graphql.annotations.GraphQLArgument; +import io.leangen.graphql.annotations.GraphQLMutation; +import io.leangen.graphql.annotations.GraphQLQuery; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class BookResolver { + + @Autowired + IBookService bookService; + + @GraphQLQuery(name = "getBookWithTitle") + public Book getBookWithTitle(@GraphQLArgument(name = "title") String title) { + return bookService.getBookWithTitle(title); + } + + @GraphQLQuery(name = "getAllBooks", description = "Get all books") + public List getAllBooks() { + return bookService.getAllBooks(); + } + + @GraphQLMutation(name = "addBook") + public Book addBook(@GraphQLArgument(name = "newBook") Book book) { + return bookService.addBook(book); + } + + @GraphQLMutation(name = "updateBook") + public Book updateBook(@GraphQLArgument(name = "modifiedBook") Book book) { + return bookService.updateBook(book); + } + + @GraphQLMutation(name = "deleteBook") + public void deleteBook(@GraphQLArgument(name = "book") Book book) { + bookService.deleteBook(book); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/BookService.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/BookService.java new file mode 100644 index 0000000000..6dbfe9c6f9 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/BookService.java @@ -0,0 +1,48 @@ +package com.baeldung.sprq; + +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Service; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +@Service +public class BookService implements IBookService { + + Set books = new HashSet<>(); + + @Override + public Book getBookWithTitle(String title) { + return books.stream() + .filter(book -> book.getTitle() + .equals(title)) + .findFirst() + .orElse(null); + } + + @Override + public List getAllBooks() { + return books.stream() + .collect(Collectors.toList()); + } + + @Override + public Book addBook(Book book) { + books.add(book); + return book; + } + + @Override + public Book updateBook(Book book) { + books.remove(book); + books.add(book); + return book; + } + + @Override + public boolean deleteBook(Book book) { + return books.remove(book); + } +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/GraphqlController.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/GraphqlController.java new file mode 100644 index 0000000000..b62bdbd6a8 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/GraphqlController.java @@ -0,0 +1,35 @@ +package com.baeldung.sprq; + +import graphql.ExecutionResult; +import graphql.GraphQL; +import graphql.GraphQLException; +import graphql.schema.GraphQLSchema; +import io.leangen.graphql.GraphQLSchemaGenerator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Profile; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +@RestController +public class GraphqlController { + + private final GraphQL graphQL; + + @Autowired + public GraphqlController(BookResolver bookResolver) { + GraphQLSchema schema = new GraphQLSchemaGenerator().withBasePackages("com.baeldung") + .withOperationsFromSingleton(bookResolver) + .generate(); + this.graphQL = new GraphQL.Builder(schema).build(); + } + + @PostMapping(value = "/graphql") + public Map execute(@RequestBody Map request, HttpServletRequest raw) throws GraphQLException { + ExecutionResult result = graphQL.execute(request.get("query")); + return result.getData(); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/IBookService.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/IBookService.java new file mode 100644 index 0000000000..1c1257c178 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/IBookService.java @@ -0,0 +1,15 @@ +package com.baeldung.sprq; + +import java.util.List; + +public interface IBookService { + Book getBookWithTitle(String title); + + List getAllBooks(); + + Book addBook(Book book); + + Book updateBook(Book book); + + boolean deleteBook(Book book); +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/sprq/GraphqlControllerIntegrationTest.java b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/sprq/GraphqlControllerIntegrationTest.java new file mode 100644 index 0000000000..65b6ff1e0b --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/sprq/GraphqlControllerIntegrationTest.java @@ -0,0 +1,60 @@ +package com.baeldung.sprq; + +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(SpringRunner.class) +@SpringBootTest +@AutoConfigureMockMvc +public class GraphqlControllerIntegrationTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + BookService bookService; + + private static final String GRAPHQL_PATH = "/graphql"; + + @Test + public void givenNoBooks_whenReadAll_thenStatusIsOk() throws Exception { + + String getAllBooksQuery = "{\n" + " getAllBooks {\n" + " id\n" + " author\n" + " title\n" + " }\n" + "}\n"; + + this.mockMvc.perform(post(GRAPHQL_PATH).content(toJSON(getAllBooksQuery)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.getAllBooks").isEmpty()); + } + + @Test + public void whenAddBook_thenStatusIsOk() throws Exception { + + String addBookMutation = "mutation {\n" + " addBook(newBook: {id: 123, author: \"J.R.R. Tolkien\", title: \"The Lord of the Rings\"}) {\n" + " id\n" + " author\n" + " title\n" + " }\n" + "}\n"; + + this.mockMvc.perform(post(GRAPHQL_PATH).content(toJSON(addBookMutation)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.addBook.id").value("123")) + .andExpect(jsonPath("$.addBook.author").value("J.R.R. Tolkien")) + .andExpect(jsonPath("$.addBook.title").value("The Lord of the Rings")); + } + + private String toJSON(String query) throws JSONException { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("query", query); + return jsonObject.toString(); + } +} \ No newline at end of file From eba9e9aed7e57ae0270fc6f7f3fe7745d8d25e6d Mon Sep 17 00:00:00 2001 From: asia Date: Tue, 8 Feb 2022 20:26:02 +0100 Subject: [PATCH 15/16] Remove unnecessary line breaks. --- .../baeldung/sprq/GraphqlControllerIntegrationTest.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/sprq/GraphqlControllerIntegrationTest.java b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/sprq/GraphqlControllerIntegrationTest.java index 65b6ff1e0b..b1054f09f8 100644 --- a/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/sprq/GraphqlControllerIntegrationTest.java +++ b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/sprq/GraphqlControllerIntegrationTest.java @@ -31,10 +31,11 @@ public class GraphqlControllerIntegrationTest { @Test public void givenNoBooks_whenReadAll_thenStatusIsOk() throws Exception { - String getAllBooksQuery = "{\n" + " getAllBooks {\n" + " id\n" + " author\n" + " title\n" + " }\n" + "}\n"; + String getAllBooksQuery = "{ getAllBooks {id author title } }"; this.mockMvc.perform(post(GRAPHQL_PATH).content(toJSON(getAllBooksQuery)) - .contentType(MediaType.APPLICATION_JSON)) + .contentType( + MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.getAllBooks").isEmpty()); } @@ -42,7 +43,8 @@ public class GraphqlControllerIntegrationTest { @Test public void whenAddBook_thenStatusIsOk() throws Exception { - String addBookMutation = "mutation {\n" + " addBook(newBook: {id: 123, author: \"J.R.R. Tolkien\", title: \"The Lord of the Rings\"}) {\n" + " id\n" + " author\n" + " title\n" + " }\n" + "}\n"; + String addBookMutation = "mutation { addBook(newBook: {id: 123, author: \"J.R.R. Tolkien\", " + + "title: \"The Lord of the Rings\"}) { id author title } }"; this.mockMvc.perform(post(GRAPHQL_PATH).content(toJSON(addBookMutation)) .contentType(MediaType.APPLICATION_JSON)) From 72b79f502328ec2a68a32fb69613550e58b0f97e Mon Sep 17 00:00:00 2001 From: asia Date: Mon, 14 Mar 2022 21:46:13 +0100 Subject: [PATCH 16/16] BAEL-5304: adding graphql-spqr module --- graphql/graphql-spqr/pom.xml | 51 +++++++++++++++++ .../main/java/com/baeldung/SpringBootApp.java | 11 ++++ .../src/main/java/com/baeldung/spqr/Book.java | 57 +++++++++++++++++++ .../java/com/baeldung/spqr/BookService.java | 51 +++++++++++++++++ .../java/com/baeldung/spqr/IBookService.java | 15 +++++ 5 files changed, 185 insertions(+) create mode 100644 graphql/graphql-spqr/pom.xml create mode 100644 graphql/graphql-spqr/src/main/java/com/baeldung/SpringBootApp.java create mode 100644 graphql/graphql-spqr/src/main/java/com/baeldung/spqr/Book.java create mode 100644 graphql/graphql-spqr/src/main/java/com/baeldung/spqr/BookService.java create mode 100644 graphql/graphql-spqr/src/main/java/com/baeldung/spqr/IBookService.java diff --git a/graphql/graphql-spqr/pom.xml b/graphql/graphql-spqr/pom.xml new file mode 100644 index 0000000000..c825be9b79 --- /dev/null +++ b/graphql/graphql-spqr/pom.xml @@ -0,0 +1,51 @@ + + + + 4.0.0 + com.baeldung.graphql + graphql-spqr + 1.0 + graphql-java + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../.. + + + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot-version} + + + org.springframework.boot + spring-boot-starter + ${spring-boot-version} + + + io.leangen.graphql + graphql-spqr-spring-boot-starter + ${graphql-spqr-spring-boot-starter-version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.6.2 + + + + + + 2.6.2 + 0.0.6 + + \ No newline at end of file diff --git a/graphql/graphql-spqr/src/main/java/com/baeldung/SpringBootApp.java b/graphql/graphql-spqr/src/main/java/com/baeldung/SpringBootApp.java new file mode 100644 index 0000000000..dc49f6a7e4 --- /dev/null +++ b/graphql/graphql-spqr/src/main/java/com/baeldung/SpringBootApp.java @@ -0,0 +1,11 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootApp { + public static void main(String[] args) { + SpringApplication.run(SpringBootApp.class, args); + } +} diff --git a/graphql/graphql-spqr/src/main/java/com/baeldung/spqr/Book.java b/graphql/graphql-spqr/src/main/java/com/baeldung/spqr/Book.java new file mode 100644 index 0000000000..405eadca84 --- /dev/null +++ b/graphql/graphql-spqr/src/main/java/com/baeldung/spqr/Book.java @@ -0,0 +1,57 @@ +package com.baeldung.spqr; + +import java.util.Objects; + +public class Book { + private Integer id; + private String author; + private String title; + + public Book(Integer id, String author, String title) { + this.id = id; + this.author = author; + this.title = title; + } + + public Book() { + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + Book book = (Book) o; + return id.equals(book.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +} diff --git a/graphql/graphql-spqr/src/main/java/com/baeldung/spqr/BookService.java b/graphql/graphql-spqr/src/main/java/com/baeldung/spqr/BookService.java new file mode 100644 index 0000000000..7c9b129491 --- /dev/null +++ b/graphql/graphql-spqr/src/main/java/com/baeldung/spqr/BookService.java @@ -0,0 +1,51 @@ +package com.baeldung.spqr; + +import io.leangen.graphql.annotations.GraphQLArgument; +import io.leangen.graphql.annotations.GraphQLMutation; +import io.leangen.graphql.annotations.GraphQLQuery; +import io.leangen.graphql.spqr.spring.annotations.GraphQLApi; +import org.springframework.stereotype.Service; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@Service +@GraphQLApi +public class BookService implements IBookService { + + Set books = new HashSet<>(); + + @GraphQLQuery(name = "getBookWithTitle") + public Book getBookWithTitle(@GraphQLArgument(name = "title") String title) { + return books.stream() + .filter(book -> book.getTitle() + .equals(title)) + .findFirst() + .orElse(null); + } + + @GraphQLQuery(name = "getAllBooks", description = "Get all books") + public List getAllBooks() { + return books.stream() + .toList(); + } + + @GraphQLMutation(name = "addBook") + public Book addBook(@GraphQLArgument(name = "newBook") Book book) { + books.add(book); + return book; + } + + @GraphQLMutation(name = "updateBook") + public Book updateBook(@GraphQLArgument(name = "modifiedBook") Book book) { + books.remove(book); + books.add(book); + return book; + } + + @GraphQLMutation(name = "deleteBook") + public boolean deleteBook(@GraphQLArgument(name = "book") Book book) { + return books.remove(book); + } +} \ No newline at end of file diff --git a/graphql/graphql-spqr/src/main/java/com/baeldung/spqr/IBookService.java b/graphql/graphql-spqr/src/main/java/com/baeldung/spqr/IBookService.java new file mode 100644 index 0000000000..fa92494745 --- /dev/null +++ b/graphql/graphql-spqr/src/main/java/com/baeldung/spqr/IBookService.java @@ -0,0 +1,15 @@ +package com.baeldung.spqr; + +import java.util.List; + +public interface IBookService { + Book getBookWithTitle(String title); + + List getAllBooks(); + + Book addBook(Book book); + + Book updateBook(Book book); + + boolean deleteBook(Book book); +}