diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..549e00a2a96fa9d7c5dbc9859664a78d980158c2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..c1dd12f17644411d6e840bd5a10c6ecda0175f18 Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000000000000000000000000000000000..b74bf7fcd640440a49eb602158547670ef907772 --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar diff --git a/mvnw b/mvnw new file mode 100644 index 0000000000000000000000000000000000000000..8a8fb2282df5b8f7263470a5a2dc0e196f35f35f --- /dev/null +++ b/mvnw @@ -0,0 +1,316 @@ +#!/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 /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + 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="`\\unset -f command; \\command -v 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/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$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 \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000000000000000000000000000000000000..1d8ab018eaf11d9b3a4a90e7818ace373dfbb380 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,188 @@ +@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 "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\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/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq 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%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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 "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..4183f8d27239b10cd694e183560805cca25f8f4c --- /dev/null +++ b/pom.xml @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-parent</artifactId> + <version>3.0.1</version> + <relativePath/> <!-- lookup parent from repository --> + </parent> + <groupId>com.nisum.poc</groupId> + <artifactId>Webflux</artifactId> + <version>0.0.1-SNAPSHOT</version> + <name>Webflux</name> + <description>Demo project for Spring Boot webFlux</description> + <properties> + <java.version>17</java.version> + </properties> + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-webflux</artifactId> + </dependency> + + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <optional>true</optional> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>io.projectreactor</groupId> + <artifactId>reactor-test</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <configuration> + <excludes> + <exclude> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + </exclude> + </excludes> + </configuration> + </plugin> + </plugins> + </build> + +</project> diff --git a/src/main/java/com/nisum/poc/Webflux/WebFluxApplication.java b/src/main/java/com/nisum/poc/Webflux/WebFluxApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..e1852f8dbceb4d210890731d3a6acca5ed135915 --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/WebFluxApplication.java @@ -0,0 +1,20 @@ +package com.nisum.poc.Webflux; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories; +import org.springframework.stereotype.Component; + +@SpringBootApplication +@ComponentScan(basePackages = "com.nisum") +@EntityScan("com.nisum.poc") +//@EnableReactiveMongoRepositories(basePackages = "com.nisum.poc") +public class WebFluxApplication { + + public static void main(String[] args) { + SpringApplication.run(WebFluxApplication.class, args); + } + +} diff --git a/src/main/java/com/nisum/poc/Webflux/config/MongoDBConfiguration.java b/src/main/java/com/nisum/poc/Webflux/config/MongoDBConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..1d958f0cb2a4da7814085a59b1b5e3274dd30204 --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/config/MongoDBConfiguration.java @@ -0,0 +1,38 @@ +package com.nisum.poc.Webflux.config; + +import com.mongodb.reactivestreams.client.MongoClient; +import com.mongodb.reactivestreams.client.MongoClients; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.mongodb.config.AbstractReactiveMongoConfiguration; +import org.springframework.data.mongodb.core.ReactiveMongoTemplate; +import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; +import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories; + +@Configuration +@EnableReactiveMongoRepositories(basePackages = "com.nisum") +public class MongoDBConfiguration extends AbstractReactiveMongoConfiguration { + + + @Value("${db.name}") + private String dbname; + + @Value("${db.host}") + private String dbHost; + + + @Override + public MongoClient reactiveMongoClient() { + return MongoClients.create(); + } + @Override + protected String getDatabaseName() { + return dbname ; + } + @Bean + public ReactiveMongoTemplate reactiveMongoTemplate(){ + return new ReactiveMongoTemplate(reactiveMongoClient(),getDatabaseName()); + + } +} diff --git a/src/main/java/com/nisum/poc/Webflux/config/WebFluxConfig.java b/src/main/java/com/nisum/poc/Webflux/config/WebFluxConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..5f7d1a17181fb15a2705a488bc75059e37b0a3fb --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/config/WebFluxConfig.java @@ -0,0 +1,11 @@ +package com.nisum.poc.Webflux.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.config.EnableWebFlux; +import org.springframework.web.reactive.config.WebFluxConfigurer; + +@Configuration +@EnableWebFlux +public class WebFluxConfig implements WebFluxConfigurer { +} diff --git a/src/main/java/com/nisum/poc/Webflux/config/WebclientEx.java b/src/main/java/com/nisum/poc/Webflux/config/WebclientEx.java new file mode 100644 index 0000000000000000000000000000000000000000..bd865a52366a03da2b963055bd96c4ad6c65cd7b --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/config/WebclientEx.java @@ -0,0 +1,17 @@ +package com.nisum.poc.Webflux.config; + +import com.nisum.poc.Webflux.entity.Student; +import io.netty.handler.codec.http.websocketx.extensions.compression.WebSocketClientCompressionHandler; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Flux; + +@Configuration +public class WebclientEx { + + WebClient client = WebClient.create("http://localhost:4042"); + public Flux<Student> getAllStudents(){ + return client.get().uri("/allStudents").accept(MediaType.APPLICATION_JSON).retrieve().bodyToFlux(Student.class); + } +} diff --git a/src/main/java/com/nisum/poc/Webflux/controller/AddressController.java b/src/main/java/com/nisum/poc/Webflux/controller/AddressController.java new file mode 100644 index 0000000000000000000000000000000000000000..79d3eee736f4098f850bdcb217331c6133904863 --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/controller/AddressController.java @@ -0,0 +1,32 @@ +package com.nisum.poc.Webflux.controller; + +import com.nisum.poc.Webflux.entity.Address; +import com.nisum.poc.Webflux.model.AddressPayload; +import com.nisum.poc.Webflux.service.IAddressService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@RestController +public class AddressController { + @Autowired + IAddressService addressService; + + + @PostMapping("/saveaddress") + public Mono<Address> createAddress(@RequestBody Address address){ + return addressService.createAddress(address); + + } + + @GetMapping("/alladdress") + public Flux<Address> getAllAddress(){ + return addressService.getAllAddress(); + + } +} diff --git a/src/main/java/com/nisum/poc/Webflux/controller/StudentController.java b/src/main/java/com/nisum/poc/Webflux/controller/StudentController.java new file mode 100644 index 0000000000000000000000000000000000000000..1879ec878314cf1d34cb368fe03b9bda2943f7fb --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/controller/StudentController.java @@ -0,0 +1,80 @@ +package com.nisum.poc.Webflux.controller; + +import com.nisum.poc.Webflux.entity.Student; +import com.nisum.poc.Webflux.entity.Subject; +import com.nisum.poc.Webflux.model.StudentPayload; +import com.nisum.poc.Webflux.service.IStudentService; +import com.nisum.poc.Webflux.service.ISubjectsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.time.Duration; +import java.util.Arrays; +import java.util.List; + +@RestController +public class StudentController { + + @Autowired + IStudentService studentService; + + @PostMapping("/saveStudent") + public Mono<Student> creatStudent(@RequestBody Student student){ + return studentService.createStudent(student); + + } + + @GetMapping("/allStudents") + public Flux<StudentPayload> getAllStudents(){ + return studentService.getAllStudents(); + + } + @GetMapping("/concatEx") + public Flux<String> concatFlux(){ + return studentService.concat(); + + } + + @GetMapping("/mergeEx") + public Flux<String> mergeFlux(){ + return studentService.merge().log(); + + } + @GetMapping("/zipEx") + public Flux<Integer> zip(){ + return studentService.combineWithZip(); + } + + @GetMapping("/zipWithEx") + public Flux<Integer> zipWith(){ + Flux<Integer> evenNumbers = Flux + .range(1, 5) + .filter(x -> x % 2 == 0); // i.e. 2, 4 + + Flux<Integer> oddNumbers = Flux + .range(1, 5) + .filter(x -> x % 2 > 0);//1,3,5 + Flux<Integer> concatIntegers = Flux.concat(evenNumbers,oddNumbers); + Flux<Integer> mergefIntegers = Flux.merge(evenNumbers,oddNumbers); + Flux<Integer> zipIntegers = Flux.zip(evenNumbers,oddNumbers,(a,b)->a*b).log(); + //flux to mono last(),next(),elementAt(1), haselements() haselement(1), + Mono<Integer> integerMono = oddNumbers.next(); + Flux<Integer> zipwithIntegers = evenNumbers.zipWith(oddNumbers,(a,b)->a*b);//2,12 + return zipwithIntegers; + } + + @GetMapping("/flatMap") + public Flux<String> transformUsingFlatMap() { + List<String> names = Arrays.asList("google ", "abc", "fb", " stackoverflow"," bhanuchander"," reddy"); + Flux<String> namess = Flux.fromIterable(names).filter(name -> name.length() >= 5).flatMap(name -> { + return Flux.just(name.toUpperCase()). + delayElements(Duration.ofMillis(151)).log(); + }); + return namess; + } +} diff --git a/src/main/java/com/nisum/poc/Webflux/controller/SubjectsController.java b/src/main/java/com/nisum/poc/Webflux/controller/SubjectsController.java new file mode 100644 index 0000000000000000000000000000000000000000..c2318252826bdeec9d0058bda6493c06e0327e9d --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/controller/SubjectsController.java @@ -0,0 +1,32 @@ +package com.nisum.poc.Webflux.controller; + +import com.nisum.poc.Webflux.entity.Address; +import com.nisum.poc.Webflux.entity.Subject; +import com.nisum.poc.Webflux.service.ISubjectsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@RestController +public class SubjectsController { + + @Autowired + ISubjectsService subjectsService; + + @PostMapping("/savesubject") + public Mono<Subject> creatSubject(@RequestBody Subject subject){ + return subjectsService.createSuject(subject); + + } + + @GetMapping("/allsubjects") + public Flux<Subject> getAllSubjects(){ + return subjectsService.getAllSubjects(); + + } + +} diff --git a/src/main/java/com/nisum/poc/Webflux/entity/Address.java b/src/main/java/com/nisum/poc/Webflux/entity/Address.java new file mode 100644 index 0000000000000000000000000000000000000000..8f85b4067a40501e4438c7e4b432f804e110e971 --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/entity/Address.java @@ -0,0 +1,28 @@ +package com.nisum.poc.Webflux.entity; + +import lombok.*; +import org.springframework.context.annotation.Scope; +import org.springframework.context.annotation.ScopedProxyMode; +import org.springframework.data.annotation.Id; +import org.springframework.data.annotation.Transient; +import org.springframework.data.mongodb.core.mapping.Document; + +@AllArgsConstructor +@NoArgsConstructor +@Setter +@Getter +@Document +@Builder +//@Scope(scopeName="request",proxyMode = ScopedProxyMode.TARGET_CLASS) +public class Address { + + @Transient + public static final String SEQUENCE_NAME = "users_sequence"; + @Id + private Long id; + private String address; + private String city; + private String pinCode; + private String addressType; + private Long studentId; +} diff --git a/src/main/java/com/nisum/poc/Webflux/entity/Student.java b/src/main/java/com/nisum/poc/Webflux/entity/Student.java new file mode 100644 index 0000000000000000000000000000000000000000..d3af89b84a2e4a3b618d42e8288d4fdb77002ffc --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/entity/Student.java @@ -0,0 +1,32 @@ +package com.nisum.poc.Webflux.entity; + +import lombok.*; +import org.springframework.context.annotation.Scope; +import org.springframework.context.annotation.ScopedProxyMode; +import org.springframework.data.annotation.Id; +import org.springframework.data.annotation.Transient; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.util.List; + +@Document +@AllArgsConstructor +@NoArgsConstructor +@Setter +@Getter +@Builder +//@Scope(scopeName="request",proxyMode = ScopedProxyMode.TARGET_CLASS) +public class Student { + + @Transient + public static final String SEQUENCE_NAME = "users_sequence"; + @Id + private Long id; + private String firstName; + private String lastName; + private Integer age; + private List<String> phoneNumbers; + private List<Address> address; + private List<Subject> subjects; + +} diff --git a/src/main/java/com/nisum/poc/Webflux/entity/Subject.java b/src/main/java/com/nisum/poc/Webflux/entity/Subject.java new file mode 100644 index 0000000000000000000000000000000000000000..8d75d3a5ee266d27430b0bd01368af60b076838a --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/entity/Subject.java @@ -0,0 +1,29 @@ +package com.nisum.poc.Webflux.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.context.annotation.Scope; +import org.springframework.context.annotation.ScopedProxyMode; +import org.springframework.data.annotation.Id; +import org.springframework.data.annotation.Transient; +import org.springframework.data.mongodb.core.mapping.Document; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Document +@Builder +//@Scope(scopeName="request",proxyMode = ScopedProxyMode.TARGET_CLASS) +public class Subject { + + @Transient + public static final String SEQUENCE_NAME = "users_sequence"; + @Id + private Long id; + private String subjectName; + private Long studentId; + + +} diff --git a/src/main/java/com/nisum/poc/Webflux/model/AddressPayload.java b/src/main/java/com/nisum/poc/Webflux/model/AddressPayload.java new file mode 100644 index 0000000000000000000000000000000000000000..ffb4844a64ac72c9823b37eb7f5e6e2c2f180c3c --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/model/AddressPayload.java @@ -0,0 +1,17 @@ +package com.nisum.poc.Webflux.model; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AddressPayload { + private Integer id; + private String address; + private String city; + private String pinCode; + private String addressType; + private Long studentId; +} diff --git a/src/main/java/com/nisum/poc/Webflux/model/StudentPayload.java b/src/main/java/com/nisum/poc/Webflux/model/StudentPayload.java new file mode 100644 index 0000000000000000000000000000000000000000..fbbb744958024b133d4180e06bfb7cbd0f199499 --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/model/StudentPayload.java @@ -0,0 +1,24 @@ +package com.nisum.poc.Webflux.model; + + +import com.nisum.poc.Webflux.entity.Address; +import com.nisum.poc.Webflux.entity.Subject; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.data.mongodb.core.aggregation.ArrayOperators; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class StudentPayload { + private Long id; + private String firstName; + private String lastName; + private Integer age; + private List<String> phoneNumbers; + private List<Address> addresses; + private List<Subject> subjects; +} diff --git a/src/main/java/com/nisum/poc/Webflux/model/SubjectPayload.java b/src/main/java/com/nisum/poc/Webflux/model/SubjectPayload.java new file mode 100644 index 0000000000000000000000000000000000000000..b30dd8a3287c8f636a21e71ed490082bde8a80d6 --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/model/SubjectPayload.java @@ -0,0 +1,16 @@ +package com.nisum.poc.Webflux.model; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SubjectPayload { + + private Integer id; + private String subjectName; + private Long studentId; + +} diff --git a/src/main/java/com/nisum/poc/Webflux/repository/AddressRepository.java b/src/main/java/com/nisum/poc/Webflux/repository/AddressRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..358177a9bb11a5f324a2eea1a43f4e5a4aa8b213 --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/repository/AddressRepository.java @@ -0,0 +1,12 @@ +package com.nisum.poc.Webflux.repository; + +import com.nisum.poc.Webflux.entity.Address; +import org.springframework.data.mongodb.repository.ReactiveMongoRepository; +import org.springframework.stereotype.Repository; +import reactor.core.publisher.Flux; + +@Repository +public interface AddressRepository extends ReactiveMongoRepository<Address, Long> { + + Flux<Address> findByStudentId(Long studentId); +} diff --git a/src/main/java/com/nisum/poc/Webflux/repository/StudentRepository.java b/src/main/java/com/nisum/poc/Webflux/repository/StudentRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..0371e1df6ef484550345f4e2648ffcaeeffbcc43 --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/repository/StudentRepository.java @@ -0,0 +1,9 @@ +package com.nisum.poc.Webflux.repository; + +import org.springframework.data.mongodb.repository.ReactiveMongoRepository; +import com.nisum.poc.Webflux.entity.Student; +import org.springframework.stereotype.Repository; + +@Repository +public interface StudentRepository extends ReactiveMongoRepository<Student,Long> { +} diff --git a/src/main/java/com/nisum/poc/Webflux/repository/SubjectRepository.java b/src/main/java/com/nisum/poc/Webflux/repository/SubjectRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..8d9d4f86e0233e233c4e42ec2ebd05af37c30f5c --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/repository/SubjectRepository.java @@ -0,0 +1,13 @@ +package com.nisum.poc.Webflux.repository; + +import com.nisum.poc.Webflux.entity.Address; +import com.nisum.poc.Webflux.entity.Subject; +import org.springframework.data.mongodb.repository.ReactiveMongoRepository; +import org.springframework.stereotype.Repository; +import reactor.core.publisher.Flux; + +@Repository +public interface SubjectRepository extends ReactiveMongoRepository<Subject,Long> { + Flux<Subject> findByStudentId(Long subjectId); + +} diff --git a/src/main/java/com/nisum/poc/Webflux/service/IAddressService.java b/src/main/java/com/nisum/poc/Webflux/service/IAddressService.java new file mode 100644 index 0000000000000000000000000000000000000000..842c0da7ea90603bece17bcdd31826051ec7c06c --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/service/IAddressService.java @@ -0,0 +1,14 @@ +package com.nisum.poc.Webflux.service; + +import com.nisum.poc.Webflux.entity.Address; +import com.nisum.poc.Webflux.model.AddressPayload; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@Service +public interface IAddressService { + Mono<Address> createAddress(Address address); + + Flux<Address> getAllAddress(); +} diff --git a/src/main/java/com/nisum/poc/Webflux/service/IStudentService.java b/src/main/java/com/nisum/poc/Webflux/service/IStudentService.java new file mode 100644 index 0000000000000000000000000000000000000000..d45f2eddcbcd49c91376ec001b24f2b3f45ddd3d --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/service/IStudentService.java @@ -0,0 +1,21 @@ +package com.nisum.poc.Webflux.service; + +import com.nisum.poc.Webflux.entity.Student; +import com.nisum.poc.Webflux.entity.Subject; +import com.nisum.poc.Webflux.model.StudentPayload; +import org.springframework.stereotype.Repository; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@Service +public interface IStudentService { + + Mono<Student> createStudent(Student student); + + Flux<StudentPayload> getAllStudents(); + Flux<String> concat(); + + Flux<String> merge(); + public Flux<Integer> combineWithZip(); +} diff --git a/src/main/java/com/nisum/poc/Webflux/service/ISubjectsService.java b/src/main/java/com/nisum/poc/Webflux/service/ISubjectsService.java new file mode 100644 index 0000000000000000000000000000000000000000..c49db887ce9e1fee07e134ea472aa08fe4f0f43a --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/service/ISubjectsService.java @@ -0,0 +1,14 @@ +package com.nisum.poc.Webflux.service; + +import com.nisum.poc.Webflux.entity.Address; +import com.nisum.poc.Webflux.entity.Subject; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@Service +public interface ISubjectsService { + Mono<Subject> createSuject(Subject subject); + + Flux<Subject> getAllSubjects(); +} diff --git a/src/main/java/com/nisum/poc/Webflux/service/impl/AddressServiceImpl.java b/src/main/java/com/nisum/poc/Webflux/service/impl/AddressServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..71d1d78f1531fcb15531ba6bd501f19e359630db --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/service/impl/AddressServiceImpl.java @@ -0,0 +1,28 @@ +package com.nisum.poc.Webflux.service.impl; + +import com.nisum.poc.Webflux.entity.Address; +import com.nisum.poc.Webflux.repository.AddressRepository; +import com.nisum.poc.Webflux.service.IAddressService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@Service +@Slf4j +public class AddressServiceImpl implements IAddressService { + + @Autowired + AddressRepository addressRepository; + @Override + public Mono<Address> createAddress(Address address) { + return addressRepository.save(address); + + } + + @Override + public Flux<Address> getAllAddress() { + return addressRepository.findAll(); + } +} diff --git a/src/main/java/com/nisum/poc/Webflux/service/impl/StudentServiceImpl.java b/src/main/java/com/nisum/poc/Webflux/service/impl/StudentServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..8da871ef2ecc27f3ca36713f86f0bb2afaaceeff --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/service/impl/StudentServiceImpl.java @@ -0,0 +1,121 @@ +package com.nisum.poc.Webflux.service.impl; + +import com.nisum.poc.Webflux.entity.Address; +import com.nisum.poc.Webflux.entity.Student; +import com.nisum.poc.Webflux.entity.Subject; +import com.nisum.poc.Webflux.model.StudentPayload; +import com.nisum.poc.Webflux.repository.AddressRepository; +import com.nisum.poc.Webflux.repository.StudentRepository; +import com.nisum.poc.Webflux.repository.SubjectRepository; +import com.nisum.poc.Webflux.service.IStudentService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.util.function.Tuple2; + +import java.util.ArrayList; +import java.util.List; + + +@Service +@Slf4j +public class StudentServiceImpl implements IStudentService { + + + @Autowired + StudentRepository studentRepository; + @Autowired + AddressRepository addressRepository; + @Autowired + SubjectRepository subjectRepository; + @Override + public Mono<Student> createStudent(Student student) { + Student student1 = new Student(); + student1.setId(student.getId()); + student1.setAge(student.getAge()); + student1.setFirstName(student.getFirstName()); + student1.setLastName(student.getLastName()); + student1.setPhoneNumbers(student.getPhoneNumbers()); + Mono<Student> studentMono = studentRepository.save(student1); + + List<Address> addressList = new ArrayList<>(); + List<Subject> subjectList = new ArrayList<>(); + + studentMono.subscribe(studentmono -> { + student.getAddress().forEach(address -> { + Address address1 = new Address(); + address1.setId(address.getId()); + address1.setAddress(address.getAddress()); + address1.setStudentId(studentmono.getId()); + address1.setCity(address.getCity()); + address1.setAddressType(address.getAddressType()); + address1.setPinCode(address.getPinCode()); + addressList.add(address1); + }); + student.getSubjects().forEach(sub -> { + Subject subject = new Subject(); + subject.setId(sub.getId()); + subject.setSubjectName(sub.getSubjectName()); + subject.setStudentId(studentmono.getId()); + subjectList.add(subject); + }); + Flux<Address> addressFlux = addressRepository.saveAll(addressList); + Flux<Subject> subjectFlux = subjectRepository.saveAll(subjectList); + }); + return studentMono; + } + @Override + public Flux<StudentPayload> getAllStudents() { + return studentRepository.findAll().flatMap(student -> { + Flux<Address> addressFlux = addressRepository.findByStudentId(student.getId()).switchIfEmpty(Flux.just(new Address())); + Flux<Subject> subjectFlux = subjectRepository.findByStudentId(student.getId()).switchIfEmpty(Flux.just(new Subject())); + StudentPayload studentPayload = new StudentPayload(); + studentPayload.setId(student.getId()); + studentPayload.setAge(student.getAge()); + studentPayload.setPhoneNumbers(student.getPhoneNumbers()); + studentPayload.setFirstName(student.getFirstName()); + studentPayload.setLastName(student.getLastName()); + studentPayload.setAddresses(addressFlux.collectList().block()); + studentPayload.setSubjects(subjectFlux.collectList().block()); + Flux<StudentPayload> studentPayloadFlux = Flux.just(studentPayload); + return studentPayloadFlux; + }); + // return studentFlux; + } + + public Flux<String> concat() { + Flux<String> names1 = Flux.just("Hi ", " Hello ", "how "); + Flux<String> names2 = Flux.just("are ", " you ", " Doing"); + Flux<String> names = Flux.concat(names1, names2).log(); + return names; + } + + public Flux<String> merge() { + Flux<String> names1 = Flux.just("Hi ", " Hello ", "how "); + Flux<String> names2 = Flux.just("are ", " you ", " Doing"); + Flux<String> names = Flux.merge(names1, names2).log(); + return names; + } + + public Flux<Integer> combineWithZip(){ + + Flux<Integer> name1 = Flux.just(1, 2, 3); + Flux<Integer> name2 = Flux.just(4,5,6); + Flux<Integer> name3 = Flux.zip(name1,name2,(n1, n2)->{ + return n1*n2; + }); + return name3; + } + public Mono<String> combineWithZipChara(){ + + Mono<String> name1 = Mono.just("Hi"); + Mono<String> name2 = Mono.just("are"); + Flux<String> name3 = Mono.zip(name1,name2).flatMap(a ->{ + a.getT1().toString(); + }); + + } + +} diff --git a/src/main/java/com/nisum/poc/Webflux/service/impl/SubjectsServiceImpl.java b/src/main/java/com/nisum/poc/Webflux/service/impl/SubjectsServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..0a42c1dc21b66cc863f062fcf865ab0ae76e4a95 --- /dev/null +++ b/src/main/java/com/nisum/poc/Webflux/service/impl/SubjectsServiceImpl.java @@ -0,0 +1,28 @@ +package com.nisum.poc.Webflux.service.impl; + +import com.nisum.poc.Webflux.entity.Address; +import com.nisum.poc.Webflux.entity.Subject; +import com.nisum.poc.Webflux.repository.SubjectRepository; +import com.nisum.poc.Webflux.service.ISubjectsService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@Service +@Slf4j +public class SubjectsServiceImpl implements ISubjectsService { + + @Autowired + SubjectRepository subjectRepository; + @Override + public Mono<Subject> createSuject(Subject subject) { + return subjectRepository.save(subject); + } + + @Override + public Flux<Subject> getAllSubjects() { + return subjectRepository.findAll(); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000000000000000000000000000000000000..f492f20183cb05f15f796c800b546760d74edac5 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,3 @@ +db.name=StudentDatabase +db.host=mongodb://localhost:27017 +server.port=4042 diff --git a/src/test/java/com/nisum/poc/Webflux/WebfluxApplicationTests.java b/src/test/java/com/nisum/poc/Webflux/WebfluxApplicationTests.java new file mode 100644 index 0000000000000000000000000000000000000000..f851bd5264c5d8c937e319b95ab634a1e66f9a42 --- /dev/null +++ b/src/test/java/com/nisum/poc/Webflux/WebfluxApplicationTests.java @@ -0,0 +1,13 @@ +package com.nisum.poc.Webflux; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class WebfluxApplicationTests { + + @Test + void contextLoads() { + } + +}