Merge remote-tracking branch 'origin/master'
This commit is contained in:
		
						commit
						e7100ab790
					
				| @ -14,4 +14,4 @@ This module contains articles about Apache POI. | |||||||
| - [Set the Date Format Using Apache POI](https://www.baeldung.com/java-apache-poi-date-format) | - [Set the Date Format Using Apache POI](https://www.baeldung.com/java-apache-poi-date-format) | ||||||
| - [Replacing Variables in a Document Template with Java](https://www.baeldung.com/java-replace-pattern-word-document-doc-docx) | - [Replacing Variables in a Document Template with Java](https://www.baeldung.com/java-replace-pattern-word-document-doc-docx) | ||||||
| - [Lock Header Rows With Apache POI](https://www.baeldung.com/java-apache-poi-lock-header-rows) | - [Lock Header Rows With Apache POI](https://www.baeldung.com/java-apache-poi-lock-header-rows) | ||||||
| - More articles: [[<-- prev]](../apache-poi) | - More articles: [[<-- prev]](../apache-poi)[[next -->]](../apache-poi-3) | ||||||
|  | |||||||
| @ -27,7 +27,7 @@ | |||||||
|     </dependencies> |     </dependencies> | ||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <poi.version>5.2.3</poi.version> |         <poi.version>5.2.5</poi.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
| </project> | </project> | ||||||
| @ -1,4 +1,10 @@ | |||||||
| ## Relevant Articles | ## Apache POI | ||||||
|  | 
 | ||||||
|  | This module contains articles about Apache POI. | ||||||
|  | 
 | ||||||
|  | ### Relevant Articles: | ||||||
|  | 
 | ||||||
| - [How To Convert Excel Data Into List Of Java Objects](https://www.baeldung.com/java-convert-excel-data-into-list) | - [How To Convert Excel Data Into List Of Java Objects](https://www.baeldung.com/java-convert-excel-data-into-list) | ||||||
| - [Expand Columns with Apache POI](https://www.baeldung.com/java-apache-poi-expand-columns) | - [Expand Columns with Apache POI](https://www.baeldung.com/java-apache-poi-expand-columns) | ||||||
| - [Apply Bold Text Style for an Entire Row Using Apache POI](https://www.baeldung.com/appache-poi-apply-bold-text-style-entire-row) | - [Apply Bold Text Style for an Entire Row Using Apache POI](https://www.baeldung.com/appache-poi-apply-bold-text-style-entire-row) | ||||||
|  | - More articles: [[<-- prev]](../apache-poi-2) | ||||||
| @ -24,50 +24,41 @@ | |||||||
|             <artifactId>poi-scratchpad</artifactId> |             <artifactId>poi-scratchpad</artifactId> | ||||||
|             <version>${poi.version}</version> |             <version>${poi.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|         <!-- https://mvnrepository.com/artifact/com.github.ozlerhakan/poiji --> |  | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>com.github.ozlerhakan</groupId> |             <groupId>com.github.ozlerhakan</groupId> | ||||||
|             <artifactId>poiji</artifactId> |             <artifactId>poiji</artifactId> | ||||||
|             <version>${poiji.version}</version> |             <version>${poiji.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
| 
 |  | ||||||
|         <!-- https://mvnrepository.com/artifact/org.apache.poi/poi/5.2.3 --> |  | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>org.apache.poi</groupId> |             <groupId>org.apache.poi</groupId> | ||||||
|             <artifactId>poi</artifactId> |             <artifactId>poi</artifactId> | ||||||
|             <version>${poi.version}</version> |             <version>${poi.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|         <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas/4.1.2 --> |  | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>org.apache.poi</groupId> |             <groupId>org.apache.poi</groupId> | ||||||
|             <artifactId>poi-ooxml-schemas</artifactId> |             <artifactId>poi-ooxml-schemas</artifactId> | ||||||
|             <version>4.1.2</version> |             <version>${poi-ooxml-schemas.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|         <!-- https://mvnrepository.com/artifact/org.apache.xmlbeans/xmlbeans/5.1.1 --> |  | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>org.apache.xmlbeans</groupId> |             <groupId>org.apache.xmlbeans</groupId> | ||||||
|             <artifactId>xmlbeans</artifactId> |             <artifactId>xmlbeans</artifactId> | ||||||
|             <version>5.1.1</version> |             <version>${xmlbeans.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|         <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 --> |  | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>org.apache.commons</groupId> |             <groupId>org.apache.commons</groupId> | ||||||
|             <artifactId>commons-collections4</artifactId> |             <artifactId>commons-collections4</artifactId> | ||||||
|             <version>4.4</version> |             <version>${commons-collections4.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|         <!-- https://mvnrepository.com/artifact/org.dhatim/fastexcel/0.15.7 --> |  | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>org.dhatim</groupId> |             <groupId>org.dhatim</groupId> | ||||||
|             <artifactId>fastexcel</artifactId> |             <artifactId>fastexcel</artifactId> | ||||||
|             <version>${fastexcel.version}</version> |             <version>${fastexcel.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|         <!-- https://mvnrepository.com/artifact/org.dhatim/fastexcel-reader/0.15.7 --> |  | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>org.dhatim</groupId> |             <groupId>org.dhatim</groupId> | ||||||
|             <artifactId>fastexcel-reader</artifactId> |             <artifactId>fastexcel-reader</artifactId> | ||||||
|             <version>${fastexcel.version}</version> |             <version>${fastexcel.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|         <!-- https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl/2.6.12 --> |  | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>net.sourceforge.jexcelapi</groupId> |             <groupId>net.sourceforge.jexcelapi</groupId> | ||||||
|             <artifactId>jxl</artifactId> |             <artifactId>jxl</artifactId> | ||||||
| @ -77,8 +68,11 @@ | |||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <poi.version>5.2.5</poi.version> |         <poi.version>5.2.5</poi.version> | ||||||
|         <poiji.version>4.1.1</poiji.version> |         <poi-ooxml-schemas.version>4.1.2</poi-ooxml-schemas.version> | ||||||
|         <fastexcel.version>0.15.7</fastexcel.version> |         <poiji.version>4.2.0</poiji.version> | ||||||
|  |         <xmlbeans.version>5.2.0</xmlbeans.version> | ||||||
|  |         <commons-collections4.version>4.4</commons-collections4.version> | ||||||
|  |         <fastexcel.version>0.17.0</fastexcel.version> | ||||||
|         <jxl.version>2.6.12</jxl.version> |         <jxl.version>2.6.12</jxl.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -60,10 +60,10 @@ | |||||||
|     </build> |     </build> | ||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <poi.version>5.2.0</poi.version> |         <poi.version>5.2.5</poi.version> | ||||||
|         <jexcel.version>1.0.6</jexcel.version> |         <jexcel.version>1.0.9</jexcel.version> | ||||||
|         <fastexcel.version>0.15.3</fastexcel.version> |         <fastexcel.version>0.17.0</fastexcel.version> | ||||||
|         <maven.resources.plugin.version>3.2.0</maven.resources.plugin.version> |         <maven.resources.plugin.version>3.3.1</maven.resources.plugin.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
| </project> | </project> | ||||||
| @ -37,7 +37,7 @@ | |||||||
|             <plugin> |             <plugin> | ||||||
|                 <groupId>org.apache.maven.plugins</groupId> |                 <groupId>org.apache.maven.plugins</groupId> | ||||||
|                 <artifactId>maven-dependency-plugin</artifactId> |                 <artifactId>maven-dependency-plugin</artifactId> | ||||||
|                 <version>${maven-plugins-version}</version> |                 <version>${maven-dependency-plugin.version}</version> | ||||||
|                 <executions> |                 <executions> | ||||||
|                     <execution> |                     <execution> | ||||||
|                         <id>copy</id> |                         <id>copy</id> | ||||||
| @ -58,10 +58,7 @@ | |||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <gson.version>2.10.1</gson.version> |         <gson.version>2.10.1</gson.version> | ||||||
|         <dynamodblocal.version>1.21.1</dynamodblocal.version> |         <maven-dependency-plugin.version>3.1.1</maven-dependency-plugin.version> | ||||||
|         <commons-codec-version>1.16.0</commons-codec-version> |  | ||||||
|         <jets3t-version>0.9.4.0006L</jets3t-version> |  | ||||||
|         <maven-plugins-version>3.1.1</maven-plugins-version> |  | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
| </project> | </project> | ||||||
| @ -27,7 +27,7 @@ | |||||||
|             <dependency> |             <dependency> | ||||||
|                 <groupId>software.amazon.awssdk</groupId> |                 <groupId>software.amazon.awssdk</groupId> | ||||||
|                 <artifactId>bom</artifactId> |                 <artifactId>bom</artifactId> | ||||||
|                 <version>${awssdk.version}</version> |                 <version>${aws-java-sdk-v2.version}</version> | ||||||
|                 <type>pom</type> |                 <type>pom</type> | ||||||
|                 <scope>import</scope> |                 <scope>import</scope> | ||||||
|             </dependency> |             </dependency> | ||||||
| @ -93,7 +93,6 @@ | |||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <spring.version>2.2.1.RELEASE</spring.version> |         <spring.version>2.2.1.RELEASE</spring.version> | ||||||
|         <awssdk.version>2.17.283</awssdk.version> |  | ||||||
|         <reactor.version>3.6.0</reactor.version> |         <reactor.version>3.6.0</reactor.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -18,7 +18,7 @@ | |||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>software.amazon.awssdk</groupId> |             <groupId>software.amazon.awssdk</groupId> | ||||||
|             <artifactId>s3</artifactId> |             <artifactId>s3</artifactId> | ||||||
|             <version>${aws.java.sdk.version}</version> |             <version>${aws-java-sdk-v2.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
| 
 | 
 | ||||||
|         <dependency> |         <dependency> | ||||||
| @ -30,19 +30,18 @@ | |||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>org.lucee</groupId> |             <groupId>org.lucee</groupId> | ||||||
|             <artifactId>jets3t</artifactId> |             <artifactId>jets3t</artifactId> | ||||||
|             <version>${jets3t-version}</version> |             <version>${jets3t.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>org.lucee</groupId> |             <groupId>org.lucee</groupId> | ||||||
|             <artifactId>commons-codec</artifactId> |             <artifactId>commons-codec</artifactId> | ||||||
|             <version>${commons-codec-version}</version> |             <version>${commons-codec.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|     </dependencies> |     </dependencies> | ||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <aws.java.sdk.version>2.20.52</aws.java.sdk.version> |         <commons-codec.version>1.10.L001</commons-codec.version> | ||||||
|         <commons-codec-version>1.10.L001</commons-codec-version> |         <jets3t.version>0.9.4.0014L</jets3t.version> | ||||||
|         <jets3t-version>0.9.4.0006L</jets3t-version> |  | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
| </project> | </project> | ||||||
| @ -33,7 +33,7 @@ | |||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <aws-java-sdk.version>1.12.331</aws-java-sdk.version> |         <aws-java-sdk.version>1.12.331</aws-java-sdk.version> | ||||||
|         <aws-java-sdk-v2.version>2.20.147</aws-java-sdk-v2.version> |         <aws-java-sdk-v2.version>2.24.9</aws-java-sdk-v2.version> | ||||||
|         <maven-shade-plugin.version>3.0.0</maven-shade-plugin.version> |         <maven-shade-plugin.version>3.0.0</maven-shade-plugin.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -157,7 +157,7 @@ | |||||||
|     <properties> |     <properties> | ||||||
|         <groovy-wslite.version>1.1.3</groovy-wslite.version> |         <groovy-wslite.version>1.1.3</groovy-wslite.version> | ||||||
|         <assembly.plugin.version>3.4.2</assembly.plugin.version> |         <assembly.plugin.version>3.4.2</assembly.plugin.version> | ||||||
|         <compiler.plugin.version>3.8.1</compiler.plugin.version> |         <compiler.plugin.version>3.12.1</compiler.plugin.version> | ||||||
|         <groovy.compiler.version>3.9.0</groovy.compiler.version> |         <groovy.compiler.version>3.9.0</groovy.compiler.version> | ||||||
|         <groovy-eclipse-batch.version>3.0.9-03</groovy-eclipse-batch.version> |         <groovy-eclipse-batch.version>3.0.9-03</groovy-eclipse-batch.version> | ||||||
|     </properties> |     </properties> | ||||||
|  | |||||||
| @ -37,7 +37,7 @@ | |||||||
|     </build> |     </build> | ||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <compiler.plugin.version>3.8.0</compiler.plugin.version> |         <compiler.plugin.version>3.12.1</compiler.plugin.version> | ||||||
|         <source.version>11</source.version> |         <source.version>11</source.version> | ||||||
|         <target.version>11</target.version> |         <target.version>11</target.version> | ||||||
|     </properties> |     </properties> | ||||||
|  | |||||||
| @ -37,7 +37,7 @@ | |||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||||||
|         <compiler.plugin.version>3.8.0</compiler.plugin.version> |         <compiler.plugin.version>3.12.1</compiler.plugin.version> | ||||||
|         <source.version>11</source.version> |         <source.version>11</source.version> | ||||||
|         <target.version>11</target.version> |         <target.version>11</target.version> | ||||||
|     </properties> |     </properties> | ||||||
|  | |||||||
| @ -14,4 +14,4 @@ This module contains articles about networking in Java | |||||||
| - [Handling java.net.ConnectException](https://www.baeldung.com/java-net-connectexception) | - [Handling java.net.ConnectException](https://www.baeldung.com/java-net-connectexception) | ||||||
| - [Getting MAC Addresses in Java](https://www.baeldung.com/java-mac-address) | - [Getting MAC Addresses in Java](https://www.baeldung.com/java-mac-address) | ||||||
| - [Sending Emails with Attachments in Java](https://www.baeldung.com/java-send-emails-attachments) | - [Sending Emails with Attachments in Java](https://www.baeldung.com/java-send-emails-attachments) | ||||||
| - [[<-- Prev]](/core-java-modules/core-java-networking) | - [[<-- Prev]](/core-java-modules/core-java-networking) [[Next --> ]](/core-java-modules/core-java-networking-3) | ||||||
|  | |||||||
| @ -14,4 +14,4 @@ This module contains articles about networking in Java | |||||||
| - [Get Domain Name From Given URL in Java](https://www.baeldung.com/java-domain-name-from-url) | - [Get Domain Name From Given URL in Java](https://www.baeldung.com/java-domain-name-from-url) | ||||||
| - [Java HttpClient Timeout](https://www.baeldung.com/java-httpclient-timeout) | - [Java HttpClient Timeout](https://www.baeldung.com/java-httpclient-timeout) | ||||||
| - [Port Scanning With Java](https://www.baeldung.com/java-port-scanning) | - [Port Scanning With Java](https://www.baeldung.com/java-port-scanning) | ||||||
| - [[<-- Prev]](/core-java-modules/core-java-networking-2) | - [[<-- Prev]](/core-java-modules/core-java-networking-2) [[Next --> ]](/core-java-modules/core-java-networking-4) | ||||||
|  | |||||||
| @ -8,3 +8,4 @@ | |||||||
| - [Normalize a URL in Java](https://www.baeldung.com/java-url-normalization) | - [Normalize a URL in Java](https://www.baeldung.com/java-url-normalization) | ||||||
| - [Translating Space Characters in URLEncoder](https://www.baeldung.com/java-urlencoder-translate-space-characters) | - [Translating Space Characters in URLEncoder](https://www.baeldung.com/java-urlencoder-translate-space-characters) | ||||||
| - [Creating a Custom URL Connection](https://www.baeldung.com/java-custom-url-connection) | - [Creating a Custom URL Connection](https://www.baeldung.com/java-custom-url-connection) | ||||||
|  | - [[<-- Prev]](/core-java-modules/core-java-networking-3) | ||||||
| @ -17,46 +17,43 @@ | |||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>commons-validator</groupId> |             <groupId>commons-validator</groupId> | ||||||
|             <artifactId>commons-validator</artifactId> |             <artifactId>commons-validator</artifactId> | ||||||
|             <version>${apache.commons-validator.version}</version> |             <version>${commons-validator.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>org.jsoup</groupId> |             <groupId>org.jsoup</groupId> | ||||||
|             <artifactId>jsoup</artifactId> |             <artifactId>jsoup</artifactId> | ||||||
|             <version>${jsoup.version}</version> |             <version>${jsoup.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|         <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> |  | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>org.apache.httpcomponents</groupId> |             <groupId>org.apache.httpcomponents</groupId> | ||||||
|             <artifactId>httpclient</artifactId> |             <artifactId>httpclient</artifactId> | ||||||
|             <version>4.5.2</version> |             <version>${httpclient.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|         <!-- https://mvnrepository.com/artifact/javax.ws.rs/javax.ws.rs-api --> |  | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>javax.ws.rs</groupId> |             <groupId>javax.ws.rs</groupId> | ||||||
|             <artifactId>javax.ws.rs-api</artifactId> |             <artifactId>javax.ws.rs-api</artifactId> | ||||||
|             <version>2.1.1</version> |             <version>${javax.ws.rs-api.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>org.glassfish.jersey.core</groupId> |             <groupId>org.glassfish.jersey.core</groupId> | ||||||
|             <artifactId>jersey-common</artifactId> |             <artifactId>jersey-common</artifactId> | ||||||
|             <version>2.22.2</version> |             <version>${jersey-common.version}</version> | ||||||
|             <scope>test</scope> |             <scope>test</scope> | ||||||
|         </dependency> |         </dependency> | ||||||
|         <!-- https://mvnrepository.com/artifact/org.springframework/spring-web --> |  | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>org.springframework</groupId> |             <groupId>org.springframework</groupId> | ||||||
|             <artifactId>spring-web</artifactId> |             <artifactId>spring-web</artifactId> | ||||||
|             <version>6.0.6</version> |             <version>${spring-web.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|     </dependencies> |     </dependencies> | ||||||
| 
 | 
 | ||||||
|     <build> |  | ||||||
|         <finalName>core-java-networking-4</finalName> |  | ||||||
|     </build> |  | ||||||
| 
 |  | ||||||
|     <properties> |     <properties> | ||||||
|         <apache.commons-validator.version>1.7</apache.commons-validator.version> |         <commons-validator.version>1.7</commons-validator.version> | ||||||
|         <jsoup.version>1.16.2</jsoup.version> |         <jsoup.version>1.17.2</jsoup.version> | ||||||
|  |         <httpclient.version>4.5.2</httpclient.version> | ||||||
|  |         <javax.ws.rs-api.version>2.1.1</javax.ws.rs-api.version> | ||||||
|  |         <jersey-common.version>2.22.2</jersey-common.version> | ||||||
|  |         <spring-web.version>6.0.6</spring-web.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
| </project> | </project> | ||||||
| @ -13,6 +13,19 @@ | |||||||
|         <version>0.0.1-SNAPSHOT</version> |         <version>0.0.1-SNAPSHOT</version> | ||||||
|     </parent> |     </parent> | ||||||
| 
 | 
 | ||||||
|  |     <dependencies> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>org.apache.commons</groupId> | ||||||
|  |             <artifactId>commons-lang3</artifactId> | ||||||
|  |             <version>${apache.commons.lang3.version}</version> | ||||||
|  |         </dependency> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>com.google.guava</groupId> | ||||||
|  |             <artifactId>guava</artifactId> | ||||||
|  |             <version>${guava.version}</version> | ||||||
|  |         </dependency> | ||||||
|  |     </dependencies> | ||||||
|  | 
 | ||||||
|     <build> |     <build> | ||||||
|         <plugins> |         <plugins> | ||||||
|             <plugin> |             <plugin> | ||||||
| @ -29,6 +42,8 @@ | |||||||
|     <properties> |     <properties> | ||||||
|         <maven.compiler.source>11</maven.compiler.source> |         <maven.compiler.source>11</maven.compiler.source> | ||||||
|         <maven.compiler.target>11</maven.compiler.target> |         <maven.compiler.target>11</maven.compiler.target> | ||||||
|  |         <apache.commons.lang3.version>3.14.0</apache.commons.lang3.version> | ||||||
|  |         <guava.version>33.0.0-jre</guava.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
| </project> | </project> | ||||||
|  | |||||||
| @ -0,0 +1,58 @@ | |||||||
|  | package com.baeldung.firstnchars; | ||||||
|  | 
 | ||||||
|  | import static org.junit.jupiter.api.Assertions.assertEquals; | ||||||
|  | 
 | ||||||
|  | import org.apache.commons.lang3.StringUtils; | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | 
 | ||||||
|  | import com.google.common.base.Ascii; | ||||||
|  | 
 | ||||||
|  | class FirstNCharactersUnitTest { | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenString_whenUsingSubstringMethod_thenGetFirstChars() { | ||||||
|  |         String givenInput = "Hello Baeldung Readers"; | ||||||
|  | 
 | ||||||
|  |         assertEquals("He", givenInput.substring(0, 2)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenString_whenUsingSubSequenceMethod_thenGetFirstChars() { | ||||||
|  |         String givenInput = "Welcome"; | ||||||
|  | 
 | ||||||
|  |         assertEquals("Wel", givenInput.subSequence(0, 3)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenString_whenUsingStreamApi_thenGetFirstChars() { | ||||||
|  |         String givenInput = "The world is beautiful"; | ||||||
|  |         String result = givenInput.chars() | ||||||
|  |           .limit(3) | ||||||
|  |           .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) | ||||||
|  |           .toString(); | ||||||
|  | 
 | ||||||
|  |         assertEquals("The", result); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenString_whenUsingStringUtilsSubstringMethod_thenGetFirstChars() { | ||||||
|  |         String givenInput = "Baeldung"; | ||||||
|  | 
 | ||||||
|  |         assertEquals("Baeld", StringUtils.substring(givenInput, 0, 5)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenString_whenUsingStringUtilsLeftMethod_thenGetFirstChars() { | ||||||
|  |         String givenInput = "kindness always wins"; | ||||||
|  | 
 | ||||||
|  |         assertEquals("kind", StringUtils.left(givenInput, 4)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenString_whenUsingGuavaTruncateMethod_thenGetFirstChars() { | ||||||
|  |         String givenInput = "Tamassint"; | ||||||
|  | 
 | ||||||
|  |         assertEquals("Tama", Ascii.truncate(givenInput, 4, "")); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,38 @@ | |||||||
|  | package com.baeldung.removetrailingspaces; | ||||||
|  | 
 | ||||||
|  | import static org.junit.jupiter.api.Assertions.assertEquals; | ||||||
|  | 
 | ||||||
|  | import org.apache.commons.lang3.StringUtils; | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | 
 | ||||||
|  | public class RemoveTrailingSpaceOrWhitespaceUnitTest { | ||||||
|  | 
 | ||||||
|  |     private final static String INPUT = "  a b c d e \t  "; | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void whenUsingTrim_thenBothLeadingAndTrailingWhitespaceAreRemoved() { | ||||||
|  |         String result = INPUT.trim(); | ||||||
|  |         assertEquals("a b c d e", result); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void whenUsingReplaceAll_thenGetExpectedResult() { | ||||||
|  |         String result1 = INPUT.replaceAll(" +$", ""); | ||||||
|  |         assertEquals("  a b c d e \t", result1); | ||||||
|  | 
 | ||||||
|  |         String result2 = INPUT.replaceAll("\\s+$", ""); | ||||||
|  |         assertEquals("  a b c d e", result2); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void whenUsingStripTrailing_thenAllTrailingWhitespaceRemoved() { | ||||||
|  |         String result = INPUT.stripTrailing(); | ||||||
|  |         assertEquals("  a b c d e", result); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void whenUsingStringUtilsStripEnd_thenTrailingSpaceRemoved() { | ||||||
|  |         String result = StringUtils.stripEnd(INPUT, " "); | ||||||
|  |         assertEquals("  a b c d e \t", result); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -183,7 +183,7 @@ | |||||||
|         <spring.boot.version>1.5.6.RELEASE</spring.boot.version> |         <spring.boot.version>1.5.6.RELEASE</spring.boot.version> | ||||||
|         <jsonpath.version>2.8.0</jsonpath.version> |         <jsonpath.version>2.8.0</jsonpath.version> | ||||||
|         <spring-boot-maven-plugin.version>2.0.4.RELEASE</spring-boot-maven-plugin.version> |         <spring-boot-maven-plugin.version>2.0.4.RELEASE</spring-boot-maven-plugin.version> | ||||||
|         <compiler.plugin.version>3.1</compiler.plugin.version> |         <compiler.plugin.version>3.12.1</compiler.plugin.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
| </project> | </project> | ||||||
| @ -95,10 +95,10 @@ dependencies { | |||||||
|         [group: 'org.springframework', name: 'spring-core', version: '4.3.5.RELEASE'], |         [group: 'org.springframework', name: 'spring-core', version: '4.3.5.RELEASE'], | ||||||
|         [group: 'org.springframework', name: 'spring-aop', version: '4.3.5.RELEASE'] |         [group: 'org.springframework', name: 'spring-aop', version: '4.3.5.RELEASE'] | ||||||
|     ) |     ) | ||||||
|     testImplementation('org.hibernate:hibernate-core:5.2.12.Final') { |     testImplementation('org.hibernate.orm:hibernate-core:6.4.2.Final') { | ||||||
|         transitive = true |         transitive = true | ||||||
|     } |     } | ||||||
|     runtimeOnly(group: 'org.hibernate', name: 'hibernate-core', version: '5.2.12.Final') { |     runtimeOnly(group: 'org.hibernate.orm', name: 'hibernate-core', version: '6.4.2.Final') { | ||||||
|         transitive = false |         transitive = false | ||||||
|     } |     } | ||||||
|     runtimeOnly "org.codehaus.groovy:groovy-all:2.4.11@jar" |     runtimeOnly "org.codehaus.groovy:groovy-all:2.4.11@jar" | ||||||
|  | |||||||
| @ -24,7 +24,7 @@ | |||||||
|             <plugin> |             <plugin> | ||||||
|                 <groupId>org.apache.maven.plugins</groupId> |                 <groupId>org.apache.maven.plugins</groupId> | ||||||
|                 <artifactId>maven-compiler-plugin</artifactId> |                 <artifactId>maven-compiler-plugin</artifactId> | ||||||
|                 <version>3.8.0</version> |                 <version>3.12.1</version> | ||||||
|             </plugin> |             </plugin> | ||||||
|         </plugins> |         </plugins> | ||||||
|     </build> |     </build> | ||||||
|  | |||||||
| @ -41,7 +41,7 @@ | |||||||
|         <project.version>1.0</project.version> |         <project.version>1.0</project.version> | ||||||
|         <maven.compiler.source>19</maven.compiler.source> |         <maven.compiler.source>19</maven.compiler.source> | ||||||
|         <maven.compiler.target>19</maven.compiler.target> |         <maven.compiler.target>19</maven.compiler.target> | ||||||
|         <maven.compiler.version>3.10.1</maven.compiler.version> |         <maven.compiler.version>3.12.1</maven.compiler.version> | ||||||
|         <junit.jupiter.version>5.9.0</junit.jupiter.version> |         <junit.jupiter.version>5.9.0</junit.jupiter.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1052,7 +1052,7 @@ | |||||||
| 
 | 
 | ||||||
|         <!-- Plugin versions --> |         <!-- Plugin versions --> | ||||||
|         <maven-clean-plugin.version>3.1.0</maven-clean-plugin.version> |         <maven-clean-plugin.version>3.1.0</maven-clean-plugin.version> | ||||||
|         <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version> |         <maven-compiler-plugin.version>3.12.1</maven-compiler-plugin.version> | ||||||
|         <maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version> |         <maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version> | ||||||
|         <maven-enforcer-plugin.version>3.0.0-M2</maven-enforcer-plugin.version> |         <maven-enforcer-plugin.version>3.0.0-M2</maven-enforcer-plugin.version> | ||||||
|         <maven-resources-plugin.version>3.1.0</maven-resources-plugin.version> |         <maven-resources-plugin.version>3.1.0</maven-resources-plugin.version> | ||||||
|  | |||||||
| @ -872,7 +872,7 @@ | |||||||
| 
 | 
 | ||||||
|         <!-- Plugin versions --> |         <!-- Plugin versions --> | ||||||
|         <maven-clean-plugin.version>3.1.0</maven-clean-plugin.version> |         <maven-clean-plugin.version>3.1.0</maven-clean-plugin.version> | ||||||
|         <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version> |         <maven-compiler-plugin.version>3.12.1</maven-compiler-plugin.version> | ||||||
|         <maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version> |         <maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version> | ||||||
|         <maven-enforcer-plugin.version>3.0.0-M2</maven-enforcer-plugin.version> |         <maven-enforcer-plugin.version>3.0.0-M2</maven-enforcer-plugin.version> | ||||||
|         <maven-resources-plugin.version>3.1.0</maven-resources-plugin.version> |         <maven-resources-plugin.version>3.1.0</maven-resources-plugin.version> | ||||||
|  | |||||||
| @ -873,7 +873,7 @@ | |||||||
| 
 | 
 | ||||||
|         <!-- Plugin versions --> |         <!-- Plugin versions --> | ||||||
|         <maven-clean-plugin.version>3.1.0</maven-clean-plugin.version> |         <maven-clean-plugin.version>3.1.0</maven-clean-plugin.version> | ||||||
|         <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version> |         <maven-compiler-plugin.version>3.12.1</maven-compiler-plugin.version> | ||||||
|         <maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version> |         <maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version> | ||||||
|         <maven-enforcer-plugin.version>3.0.0-M2</maven-enforcer-plugin.version> |         <maven-enforcer-plugin.version>3.0.0-M2</maven-enforcer-plugin.version> | ||||||
|         <maven-resources-plugin.version>3.1.0</maven-resources-plugin.version> |         <maven-resources-plugin.version>3.1.0</maven-resources-plugin.version> | ||||||
|  | |||||||
| @ -18,6 +18,11 @@ | |||||||
|             <artifactId>gson</artifactId> |             <artifactId>gson</artifactId> | ||||||
|             <version>${gson.version}</version> |             <version>${gson.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>com.google.guava</groupId> | ||||||
|  |             <artifactId>guava</artifactId> | ||||||
|  |             <version>${guava.version}</version> | ||||||
|  |         </dependency> | ||||||
|     </dependencies> |     </dependencies> | ||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|  | |||||||
| @ -0,0 +1,34 @@ | |||||||
|  | package com.baeldung.gson.jsontolist.type; | ||||||
|  | 
 | ||||||
|  | import java.lang.reflect.ParameterizedType; | ||||||
|  | import java.lang.reflect.Type; | ||||||
|  | 
 | ||||||
|  | public class ParameterizedTypeImpl implements ParameterizedType { | ||||||
|  | 
 | ||||||
|  |     private final Class<?> rawType; | ||||||
|  |     private final Type[] actualTypeArguments; | ||||||
|  | 
 | ||||||
|  |     private ParameterizedTypeImpl(Class<?> rawType, Type[] actualTypeArguments) { | ||||||
|  |         this.rawType = rawType; | ||||||
|  |         this.actualTypeArguments = actualTypeArguments; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static ParameterizedType make(Class<?> rawType, Type ... actualTypeArguments) { | ||||||
|  |         return new ParameterizedTypeImpl(rawType, actualTypeArguments); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public Type[] getActualTypeArguments() { | ||||||
|  |         return actualTypeArguments; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public Type getRawType() { | ||||||
|  |         return rawType; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public Type getOwnerType() { | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,23 @@ | |||||||
|  | package com.baeldung.gson.jsontolist.type; | ||||||
|  | 
 | ||||||
|  | public class School { | ||||||
|  | 
 | ||||||
|  |     private String name; | ||||||
|  |     private String city; | ||||||
|  | 
 | ||||||
|  |     public String getName() { | ||||||
|  |         return name; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setName(String name) { | ||||||
|  |         this.name = name; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getCity() { | ||||||
|  |         return city; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setCity(String city) { | ||||||
|  |         this.city = city; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,23 @@ | |||||||
|  | package com.baeldung.gson.jsontolist.type; | ||||||
|  | 
 | ||||||
|  | public class Student { | ||||||
|  | 
 | ||||||
|  |     private String name; | ||||||
|  |     private String grade; | ||||||
|  | 
 | ||||||
|  |     public String getName() { | ||||||
|  |         return name; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setName(String name) { | ||||||
|  |         this.name = name; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getGrade() { | ||||||
|  |         return grade; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setGrade(String grade) { | ||||||
|  |         this.grade = grade; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,129 @@ | |||||||
|  | package com.baeldung.gson.jsontolist.type; | ||||||
|  | 
 | ||||||
|  | import java.lang.reflect.Type; | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  | 
 | ||||||
|  | import static org.junit.jupiter.api.Assertions.*; | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | import org.slf4j.Logger; | ||||||
|  | import org.slf4j.LoggerFactory; | ||||||
|  | 
 | ||||||
|  | import com.google.common.reflect.TypeParameter; | ||||||
|  | import com.google.gson.Gson; | ||||||
|  | import com.google.gson.JsonArray; | ||||||
|  | import com.google.gson.JsonElement; | ||||||
|  | import com.google.gson.reflect.TypeToken; | ||||||
|  | 
 | ||||||
|  | public class JsonArrayStringToListUnitTest { | ||||||
|  | 
 | ||||||
|  |     Logger LOGGER = LoggerFactory.getLogger(JsonArrayStringToListUnitTest.class); | ||||||
|  |     final String jsonArrayOfStudents = | ||||||
|  |         "[" | ||||||
|  |             + "{\"name\":\"John\", \"grade\":\"1\"}, " | ||||||
|  |             + "{\"name\":\"Tom\", \"grade\":\"2\"}, " | ||||||
|  |             + "{\"name\":\"Ram\", \"grade\":\"3\"}, " | ||||||
|  |             + "{\"name\":\"Sara\", \"grade\":\"1\"}" | ||||||
|  |       + "]"; | ||||||
|  |     final String jsonArrayOfSchools = | ||||||
|  |         "[" | ||||||
|  |             + "{\"name\":\"St. John\", \"city\":\"Chicago City\"}, " | ||||||
|  |             + "{\"name\":\"St. Tom\", \"city\":\"New York City\"}, " | ||||||
|  |             + "{\"name\":\"St. Ram\", \"city\":\"Mumbai\"}, " | ||||||
|  |             + "{\"name\":\"St. Sara\", \"city\":\"Budapest\"}" | ||||||
|  |       + "]"; | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenJsonArray_whenListElementTypeDynamic_thenConvertToJavaListUsingTypeToken() { | ||||||
|  |         Gson gson = new Gson(); | ||||||
|  |         TypeToken<List<Student>> typeTokenForListOfStudents = new TypeToken<List<Student>>(){}; | ||||||
|  |         TypeToken<List<School>> typeTokenForListOfSchools = new TypeToken<List<School>>(){}; | ||||||
|  |         List<Student> studentsLst = gson.fromJson(jsonArrayOfStudents, typeTokenForListOfStudents.getType()); | ||||||
|  |         List<School> schoolLst = gson.fromJson(jsonArrayOfSchools, typeTokenForListOfSchools.getType()); | ||||||
|  |         assertAll( | ||||||
|  |             () -> studentsLst.forEach(e -> assertTrue(e instanceof Student)), | ||||||
|  |             () -> schoolLst.forEach(e -> assertTrue(e instanceof School)) | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenJsonArray_whenListElementTypeDynamic_thenConvertToJavaListUsingTypeTokenFails() { | ||||||
|  |         Gson gson = new Gson(); | ||||||
|  |         List<Student> studentsLst = gson.fromJson(jsonArrayOfStudents, new ListWithDynamicTypeElement<Student>().getType()); | ||||||
|  |         assertFalse(studentsLst.get(0) instanceof Student); | ||||||
|  |         assertThrows(ClassCastException.class, () -> studentsLst.forEach(e -> assertTrue(e instanceof Student))); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     class ListWithDynamicTypeElement<T> { | ||||||
|  |         Type getType() { | ||||||
|  |             TypeToken<List<T>> typeToken = new TypeToken<List<T>>(){}; | ||||||
|  |             return typeToken.getType(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenJsonArray_whenListElementTypeDynamic_thenConvertToJavaListUsingGetParameterized() { | ||||||
|  |         Gson gson = new Gson(); | ||||||
|  |         List<Student> studentsLst = gson.fromJson(jsonArrayOfStudents, getGenericTypeForListFromTypeTokenUsingGetParameterized(Student.class)); | ||||||
|  |         List<School> schoolLst = gson.fromJson(jsonArrayOfSchools, getGenericTypeForListFromTypeTokenUsingGetParameterized(School.class)); | ||||||
|  |         assertAll( | ||||||
|  |             () -> studentsLst.forEach(e -> assertTrue(e instanceof Student)), | ||||||
|  |             () -> schoolLst.forEach(e -> assertTrue(e instanceof School)) | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenJsonArray_whenListElementTypeDynamic_thenConvertToJavaListUsingJsonArray() { | ||||||
|  |         List<Student> studentsLst = createListFromJsonArray(jsonArrayOfStudents, Student.class); | ||||||
|  |         List<School> schoolLst = createListFromJsonArray(jsonArrayOfSchools, School.class); | ||||||
|  |         assertAll( | ||||||
|  |             () -> studentsLst.forEach(e -> assertTrue(e instanceof Student)), | ||||||
|  |             () -> schoolLst.forEach(e -> assertTrue(e instanceof School)) | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenJsonArray_whenListElementTypeDynamic_thenConvertToJavaListUsingTypeTokenFromGuava() { | ||||||
|  |         Gson gson = new Gson(); | ||||||
|  |         List<Student> studentsLst = gson.fromJson(jsonArrayOfStudents, getTypeForListUsingTypeTokenFromGuava(Student.class)); | ||||||
|  |         List<School> schoolLst = gson.fromJson(jsonArrayOfSchools, getTypeForListUsingTypeTokenFromGuava(School.class)); | ||||||
|  |         assertAll( | ||||||
|  |             () -> studentsLst.forEach(e -> assertTrue(e instanceof Student)), | ||||||
|  |             () -> schoolLst.forEach(e -> assertTrue(e instanceof School)) | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenJsonArray_whenListElementTypeDynamic_thenConvertToJavaListUsingParameterizedType() { | ||||||
|  |         Gson gson = new Gson(); | ||||||
|  |         List<Student> studentsLst = gson.fromJson(jsonArrayOfStudents, ParameterizedTypeImpl.make(List.class, Student.class)); | ||||||
|  |         List<School> schoolLst = gson.fromJson(jsonArrayOfSchools, ParameterizedTypeImpl.make(List.class, School.class)); | ||||||
|  |         assertAll( | ||||||
|  |             () -> studentsLst.forEach(e -> assertTrue(e instanceof Student)), | ||||||
|  |             () -> schoolLst.forEach(e -> assertTrue(e instanceof School)) | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     Type getGenericTypeForListFromTypeTokenUsingGetParameterized(Class elementClass) { | ||||||
|  |         return TypeToken.getParameterized(List.class, elementClass).getType(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     <T> List<T> createListFromJsonArray(String jsonArray, Type elementType) { | ||||||
|  |         Gson gson = new Gson(); | ||||||
|  |         List<T> list = new ArrayList<>(); | ||||||
|  |         JsonArray array = gson.fromJson(jsonArray, JsonArray.class); | ||||||
|  | 
 | ||||||
|  |         for(JsonElement element : array) { | ||||||
|  |             T item = gson.fromJson(element, elementType); | ||||||
|  |             list.add(item); | ||||||
|  |         } | ||||||
|  |         return list; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     <T> Type getTypeForListUsingTypeTokenFromGuava(Class<T> type) { | ||||||
|  |         return new com.google.common.reflect.TypeToken<List<T>>() {} | ||||||
|  |             .where(new TypeParameter<T>() {}, type) | ||||||
|  |             .getType(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,73 @@ | |||||||
|  | package com.baeldung.jsonnodetoarraynode; | ||||||
|  | 
 | ||||||
|  | import static org.junit.jupiter.api.Assertions.assertEquals; | ||||||
|  | import static org.junit.jupiter.api.Assertions.assertNotNull; | ||||||
|  | import static org.junit.jupiter.api.Assertions.assertTrue; | ||||||
|  | 
 | ||||||
|  | import java.util.Iterator; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.stream.Collectors; | ||||||
|  | import java.util.stream.StreamSupport; | ||||||
|  | 
 | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | 
 | ||||||
|  | import com.fasterxml.jackson.core.JsonProcessingException; | ||||||
|  | import com.fasterxml.jackson.databind.JsonNode; | ||||||
|  | import com.fasterxml.jackson.databind.ObjectMapper; | ||||||
|  | import com.fasterxml.jackson.databind.node.ArrayNode; | ||||||
|  | 
 | ||||||
|  | public class JsonNodeToArrayNodeConverterUnitTest { | ||||||
|  |     @Test | ||||||
|  |     void givenJsonNode_whenUsingJsonNodeMethods_thenConvertToArrayNode() throws JsonProcessingException { | ||||||
|  |         int count = 0; | ||||||
|  |         String json = "{\"objects\": [\"One\", \"Two\", \"Three\"]}"; | ||||||
|  |         final JsonNode arrayNode = new ObjectMapper().readTree(json).get("objects"); | ||||||
|  |         if (arrayNode.isArray()) { | ||||||
|  |             for (final JsonNode objNode : arrayNode) { | ||||||
|  |                 assertNotNull(objNode, "Array element should not be null"); | ||||||
|  |                 count++; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         assertNotNull(arrayNode, "The 'objects' array should not be null"); | ||||||
|  |         assertTrue(arrayNode.isArray(), "The 'objects' should be an array"); | ||||||
|  |         assertEquals(3, count, "The 'objects' array should have 3 elements"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |      @Test | ||||||
|  |      void givenJsonNode_whenUsingCreateArrayNode_thenConvertToArrayNode() throws Exception { | ||||||
|  |         ObjectMapper objectMapper = new ObjectMapper(); | ||||||
|  |         JsonNode originalJsonNode = objectMapper.readTree("{\"objects\": [\"One\", \"Two\", \"Three\"]}"); | ||||||
|  |         ArrayNode arrayNode = objectMapper.createArrayNode(); | ||||||
|  |         originalJsonNode.get("objects").elements().forEachRemaining(arrayNode::add); | ||||||
|  |         assertEquals("[\"One\",\"Two\",\"Three\"]", arrayNode.toString()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |      void givenJsonNode_whenUsingStreamSupport_thenConvertToArrayNode() throws Exception { | ||||||
|  |         String json = "{\"objects\": [\"One\", \"Two\", \"Three\"]}"; | ||||||
|  |         JsonNode obj = new ObjectMapper().readTree(json); | ||||||
|  |         List<JsonNode> objects = StreamSupport | ||||||
|  |             .stream(obj.get("objects").spliterator(), false) | ||||||
|  |             .collect(Collectors.toList()); | ||||||
|  | 
 | ||||||
|  |         assertEquals(3, objects.size(), "The 'objects' list should contain 3 elements"); | ||||||
|  | 
 | ||||||
|  |         JsonNode firstObject = objects.get(0); | ||||||
|  |         assertEquals("One", firstObject.asText(), "The first element should be One"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |      void givenJsonNode_whenUsingIterator_thenConvertToArrayNode() throws Exception { | ||||||
|  |         String json = "{\"objects\": [\"One\", \"Two\", \"Three\"]}"; | ||||||
|  |         JsonNode datasets = new ObjectMapper().readTree(json); | ||||||
|  |         Iterator<JsonNode> iterator = datasets.withArray("objects").elements(); | ||||||
|  | 
 | ||||||
|  |         int count = 0; | ||||||
|  |         while (iterator.hasNext()) { | ||||||
|  |             JsonNode dataset = iterator.next(); | ||||||
|  |             System.out.print(dataset.toString() + " "); | ||||||
|  |             count++; | ||||||
|  |         } | ||||||
|  |         assertEquals(3, count, "The 'objects' list should contain 3 elements"); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -22,7 +22,7 @@ | |||||||
|     </dependencies> |     </dependencies> | ||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <jsoup.version>1.16.2</jsoup.version> |         <jsoup.version>1.17.2</jsoup.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
| </project> | </project> | ||||||
| @ -24,7 +24,7 @@ | |||||||
|             <plugin> |             <plugin> | ||||||
|                 <groupId>org.apache.maven.plugins</groupId> |                 <groupId>org.apache.maven.plugins</groupId> | ||||||
|                 <artifactId>maven-compiler-plugin</artifactId> |                 <artifactId>maven-compiler-plugin</artifactId> | ||||||
|                 <version>3.8.1</version> |                 <version>3.12.1</version> | ||||||
|                 <configuration> |                 <configuration> | ||||||
|                     <!-- http://maven.apache.org/plugins/maven-compiler-plugin/ --> |                     <!-- http://maven.apache.org/plugins/maven-compiler-plugin/ --> | ||||||
|                     <source>1.8</source> |                     <source>1.8</source> | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ | |||||||
|             <plugin> |             <plugin> | ||||||
|                 <groupId>org.apache.maven.plugins</groupId> |                 <groupId>org.apache.maven.plugins</groupId> | ||||||
|                 <artifactId>maven-compiler-plugin</artifactId> |                 <artifactId>maven-compiler-plugin</artifactId> | ||||||
|                 <version>3.8.1</version> |                 <version>3.12.1</version> | ||||||
|                 <configuration> |                 <configuration> | ||||||
|                     <!-- http://maven.apache.org/plugins/maven-compiler-plugin/ --> |                     <!-- http://maven.apache.org/plugins/maven-compiler-plugin/ --> | ||||||
|                     <source>1.8</source> |                     <source>1.8</source> | ||||||
|  | |||||||
							
								
								
									
										29
									
								
								libraries-data-io-2/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								libraries-data-io-2/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | |||||||
|  | <?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||||
|  |     <modelVersion>4.0.0</modelVersion> | ||||||
|  |     <parent> | ||||||
|  |         <groupId>com.baeldung</groupId> | ||||||
|  |         <artifactId>parent-modules</artifactId> | ||||||
|  |         <version>1.0.0-SNAPSHOT</version> | ||||||
|  |     </parent> | ||||||
|  | 
 | ||||||
|  |     <artifactId>libraries-data-io-2</artifactId> | ||||||
|  |     <name>libraries-data-io-3</name> | ||||||
|  | 
 | ||||||
|  |     <properties> | ||||||
|  |         <maven.compiler.source>19</maven.compiler.source> | ||||||
|  |         <maven.compiler.target>19</maven.compiler.target> | ||||||
|  |         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||||||
|  |         <google-flatbuffers.version>23.5.26</google-flatbuffers.version> | ||||||
|  |     </properties> | ||||||
|  |     <dependencies> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>com.google.flatbuffers</groupId> | ||||||
|  |             <artifactId>flatbuffers-java</artifactId> | ||||||
|  |             <version>${google-flatbuffers.version}</version> | ||||||
|  |         </dependency> | ||||||
|  |     </dependencies> | ||||||
|  | 
 | ||||||
|  | </project> | ||||||
| @ -0,0 +1,18 @@ | |||||||
|  | // automatically generated by the FlatBuffers compiler, do not modify | ||||||
|  | 
 | ||||||
|  | package MyGame.terrains; | ||||||
|  | 
 | ||||||
|  | @SuppressWarnings("unused") | ||||||
|  | public final class Color { | ||||||
|  |   private Color() { } | ||||||
|  |   public static final byte Brown = 0; | ||||||
|  |   public static final byte Red = 1; | ||||||
|  |   public static final byte Green = 2; | ||||||
|  |   public static final byte Blue = 3; | ||||||
|  |   public static final byte White = 4; | ||||||
|  | 
 | ||||||
|  |   public static final String[] names = { "Brown", "Red", "Green", "Blue", "White", }; | ||||||
|  | 
 | ||||||
|  |   public static String name(int e) { return names[e]; } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| @ -0,0 +1,51 @@ | |||||||
|  | // automatically generated by the FlatBuffers compiler, do not modify | ||||||
|  | 
 | ||||||
|  | package MyGame.terrains; | ||||||
|  | 
 | ||||||
|  | import java.nio.ByteBuffer; | ||||||
|  | import java.nio.ByteOrder; | ||||||
|  | 
 | ||||||
|  | import com.google.flatbuffers.BaseVector; | ||||||
|  | import com.google.flatbuffers.Constants; | ||||||
|  | import com.google.flatbuffers.FlatBufferBuilder; | ||||||
|  | import com.google.flatbuffers.Table; | ||||||
|  | 
 | ||||||
|  | @SuppressWarnings("unused") | ||||||
|  | public final class Effect extends Table { | ||||||
|  |   public static void ValidateVersion() { Constants.FLATBUFFERS_23_5_26(); } | ||||||
|  |   public static Effect getRootAsEffect(ByteBuffer _bb) { return getRootAsEffect(_bb, new Effect()); } | ||||||
|  |   public static Effect getRootAsEffect(ByteBuffer _bb, Effect obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); } | ||||||
|  |   public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); } | ||||||
|  |   public Effect __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } | ||||||
|  | 
 | ||||||
|  |   public String name() { int o = __offset(4); return o != 0 ? __string(o + bb_pos) : null; } | ||||||
|  |   public ByteBuffer nameAsByteBuffer() { return __vector_as_bytebuffer(4, 1); } | ||||||
|  |   public ByteBuffer nameInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 4, 1); } | ||||||
|  |   public short damage() { int o = __offset(6); return o != 0 ? bb.getShort(o + bb_pos) : 0; } | ||||||
|  |   public boolean mutateDamage(short damage) { int o = __offset(6); if (o != 0) { bb.putShort(o + bb_pos, damage); return true; } else { return false; } } | ||||||
|  | 
 | ||||||
|  |   public static int createEffect(FlatBufferBuilder builder, | ||||||
|  |       int nameOffset, | ||||||
|  |       short damage) { | ||||||
|  |     builder.startTable(2); | ||||||
|  |     Effect.addName(builder, nameOffset); | ||||||
|  |     Effect.addDamage(builder, damage); | ||||||
|  |     return Effect.endEffect(builder); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   public static void startEffect(FlatBufferBuilder builder) { builder.startTable(2); } | ||||||
|  |   public static void addName(FlatBufferBuilder builder, int nameOffset) { builder.addOffset(0, nameOffset, 0); } | ||||||
|  |   public static void addDamage(FlatBufferBuilder builder, short damage) { builder.addShort(1, damage, 0); } | ||||||
|  |   public static int endEffect(FlatBufferBuilder builder) { | ||||||
|  |     int o = builder.endTable(); | ||||||
|  |     return o; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   public static final class Vector extends BaseVector { | ||||||
|  |     public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; } | ||||||
|  | 
 | ||||||
|  |     public Effect get(int j) { return get(new Effect(), j); } | ||||||
|  |     public Effect get(Effect obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| @ -0,0 +1,59 @@ | |||||||
|  | // automatically generated by the FlatBuffers compiler, do not modify | ||||||
|  | 
 | ||||||
|  | package MyGame.terrains; | ||||||
|  | 
 | ||||||
|  | import java.nio.ByteBuffer; | ||||||
|  | import java.nio.ByteOrder; | ||||||
|  | 
 | ||||||
|  | import com.google.flatbuffers.BaseVector; | ||||||
|  | import com.google.flatbuffers.Constants; | ||||||
|  | import com.google.flatbuffers.FlatBufferBuilder; | ||||||
|  | import com.google.flatbuffers.Table; | ||||||
|  | 
 | ||||||
|  | @SuppressWarnings("unused") | ||||||
|  | public final class Terrain extends Table { | ||||||
|  |   public static void ValidateVersion() { Constants.FLATBUFFERS_23_5_26(); } | ||||||
|  |   public static Terrain getRootAsTerrain(ByteBuffer _bb) { return getRootAsTerrain(_bb, new Terrain()); } | ||||||
|  |   public static Terrain getRootAsTerrain(ByteBuffer _bb, Terrain obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); } | ||||||
|  |   public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); } | ||||||
|  |   public Terrain __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } | ||||||
|  | 
 | ||||||
|  |   public MyGame.terrains.Vec3 pos() { return pos(new MyGame.terrains.Vec3()); } | ||||||
|  |   public MyGame.terrains.Vec3 pos(MyGame.terrains.Vec3 obj) { int o = __offset(4); return o != 0 ? obj.__assign(o + bb_pos, bb) : null; } | ||||||
|  |   public String name() { int o = __offset(6); return o != 0 ? __string(o + bb_pos) : null; } | ||||||
|  |   public ByteBuffer nameAsByteBuffer() { return __vector_as_bytebuffer(6, 1); } | ||||||
|  |   public ByteBuffer nameInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 6, 1); } | ||||||
|  |   public byte color() { int o = __offset(8); return o != 0 ? bb.get(o + bb_pos) : 3; } | ||||||
|  |   public boolean mutateColor(byte color) { int o = __offset(8); if (o != 0) { bb.put(o + bb_pos, color); return true; } else { return false; } } | ||||||
|  |   public String navigation() { int o = __offset(10); return o != 0 ? __string(o + bb_pos) : null; } | ||||||
|  |   public ByteBuffer navigationAsByteBuffer() { return __vector_as_bytebuffer(10, 1); } | ||||||
|  |   public ByteBuffer navigationInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 10, 1); } | ||||||
|  |   public MyGame.terrains.Effect effects(int j) { return effects(new MyGame.terrains.Effect(), j); } | ||||||
|  |   public MyGame.terrains.Effect effects(MyGame.terrains.Effect obj, int j) { int o = __offset(12); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; } | ||||||
|  |   public int effectsLength() { int o = __offset(12); return o != 0 ? __vector_len(o) : 0; } | ||||||
|  |   public MyGame.terrains.Effect.Vector effectsVector() { return effectsVector(new MyGame.terrains.Effect.Vector()); } | ||||||
|  |   public MyGame.terrains.Effect.Vector effectsVector(MyGame.terrains.Effect.Vector obj) { int o = __offset(12); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; } | ||||||
|  | 
 | ||||||
|  |   public static void startTerrain(FlatBufferBuilder builder) { builder.startTable(5); } | ||||||
|  |   public static void addPos(FlatBufferBuilder builder, int posOffset) { builder.addStruct(0, posOffset, 0); } | ||||||
|  |   public static void addName(FlatBufferBuilder builder, int nameOffset) { builder.addOffset(1, nameOffset, 0); } | ||||||
|  |   public static void addColor(FlatBufferBuilder builder, byte color) { builder.addByte(2, color, 3); } | ||||||
|  |   public static void addNavigation(FlatBufferBuilder builder, int navigationOffset) { builder.addOffset(3, navigationOffset, 0); } | ||||||
|  |   public static void addEffects(FlatBufferBuilder builder, int effectsOffset) { builder.addOffset(4, effectsOffset, 0); } | ||||||
|  |   public static int createEffectsVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); } | ||||||
|  |   public static void startEffectsVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); } | ||||||
|  |   public static int endTerrain(FlatBufferBuilder builder) { | ||||||
|  |     int o = builder.endTable(); | ||||||
|  |     return o; | ||||||
|  |   } | ||||||
|  |   public static void finishTerrainBuffer(FlatBufferBuilder builder, int offset) { builder.finish(offset); } | ||||||
|  |   public static void finishSizePrefixedTerrainBuffer(FlatBufferBuilder builder, int offset) { builder.finishSizePrefixed(offset); } | ||||||
|  | 
 | ||||||
|  |   public static final class Vector extends BaseVector { | ||||||
|  |     public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; } | ||||||
|  | 
 | ||||||
|  |     public Terrain get(int j) { return get(new Terrain(), j); } | ||||||
|  |     public Terrain get(Terrain obj, int j) {  return obj.__assign(__indirect(__element(j), bb), bb); } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| @ -0,0 +1,38 @@ | |||||||
|  | // automatically generated by the FlatBuffers compiler, do not modify | ||||||
|  | 
 | ||||||
|  | package MyGame.terrains; | ||||||
|  | 
 | ||||||
|  | import java.nio.ByteBuffer; | ||||||
|  | 
 | ||||||
|  | import com.google.flatbuffers.BaseVector; | ||||||
|  | import com.google.flatbuffers.FlatBufferBuilder; | ||||||
|  | import com.google.flatbuffers.Struct; | ||||||
|  | 
 | ||||||
|  | @SuppressWarnings("unused") | ||||||
|  | public final class Vec3 extends Struct { | ||||||
|  |   public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); } | ||||||
|  |   public Vec3 __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } | ||||||
|  | 
 | ||||||
|  |   public float x() { return bb.getFloat(bb_pos + 0); } | ||||||
|  |   public void mutateX(float x) { bb.putFloat(bb_pos + 0, x); } | ||||||
|  |   public float y() { return bb.getFloat(bb_pos + 4); } | ||||||
|  |   public void mutateY(float y) { bb.putFloat(bb_pos + 4, y); } | ||||||
|  |   public float z() { return bb.getFloat(bb_pos + 8); } | ||||||
|  |   public void mutateZ(float z) { bb.putFloat(bb_pos + 8, z); } | ||||||
|  | 
 | ||||||
|  |   public static int createVec3(FlatBufferBuilder builder, float x, float y, float z) { | ||||||
|  |     builder.prep(4, 12); | ||||||
|  |     builder.putFloat(z); | ||||||
|  |     builder.putFloat(y); | ||||||
|  |     builder.putFloat(x); | ||||||
|  |     return builder.offset(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   public static final class Vector extends BaseVector { | ||||||
|  |     public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; } | ||||||
|  | 
 | ||||||
|  |     public Vec3 get(int j) { return get(new Vec3(), j); } | ||||||
|  |     public Vec3 get(Vec3 obj, int j) {  return obj.__assign(__element(j), bb); } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| @ -0,0 +1,61 @@ | |||||||
|  | package com.baeldung.flatbuffers; | ||||||
|  | 
 | ||||||
|  | import static MyGame.terrains.Terrain.addColor; | ||||||
|  | import static MyGame.terrains.Terrain.addEffects; | ||||||
|  | import static MyGame.terrains.Terrain.addNavigation; | ||||||
|  | import static MyGame.terrains.Terrain.endTerrain; | ||||||
|  | import static MyGame.terrains.Terrain.startTerrain; | ||||||
|  | 
 | ||||||
|  | import java.nio.ByteBuffer; | ||||||
|  | 
 | ||||||
|  | import com.google.flatbuffers.FlatBufferBuilder; | ||||||
|  | 
 | ||||||
|  | import MyGame.terrains.Effect; | ||||||
|  | import MyGame.terrains.Terrain; | ||||||
|  | 
 | ||||||
|  | public class MyGameMain { | ||||||
|  | 
 | ||||||
|  |     public byte[] serialiseDesertTerrainData() { | ||||||
|  |         int INITIAL_BUFFER = 1024; | ||||||
|  |         FlatBufferBuilder builder = new FlatBufferBuilder(INITIAL_BUFFER); | ||||||
|  | 
 | ||||||
|  |         int sandstormOffset = builder.createString("Sandstorm"); | ||||||
|  |         short damage = 3; | ||||||
|  |         int sandStorm = MyGame.terrains.Effect.createEffect(builder, sandstormOffset, damage); | ||||||
|  | 
 | ||||||
|  |         int droughtOffset = builder.createString("Drought"); | ||||||
|  |         short damageDrought = 1; | ||||||
|  |         int drought = MyGame.terrains.Effect.createEffect(builder, droughtOffset, damageDrought); | ||||||
|  |         int[] effects = new int[2]; | ||||||
|  |         effects[0] = sandStorm; | ||||||
|  |         effects[1] = drought; | ||||||
|  | 
 | ||||||
|  |         byte color = MyGame.terrains.Color.Brown; | ||||||
|  |         int terrainName = builder.createString("Desert"); | ||||||
|  |         int navigationName = builder.createString("south"); | ||||||
|  | 
 | ||||||
|  |         int effectOffset = MyGame.terrains.Terrain.createEffectsVector(builder, effects); | ||||||
|  | 
 | ||||||
|  |         startTerrain(builder); | ||||||
|  |         MyGame.terrains.Terrain.addName(builder, terrainName); | ||||||
|  |         addColor(builder, color); | ||||||
|  |         addNavigation(builder, navigationName); | ||||||
|  |         addEffects(builder, effectOffset); | ||||||
|  |         int desert = endTerrain(builder); | ||||||
|  |         builder.finish(desert); | ||||||
|  | 
 | ||||||
|  |         return builder.sizedByteArray(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public MyGame.terrains.Terrain deserialiseDataToTerrain(byte[] buffer) { | ||||||
|  |         ByteBuffer buf = ByteBuffer.wrap(buffer); | ||||||
|  |         return Terrain.getRootAsTerrain(buf); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public Effect.Vector deserialiseDataToEffect(byte[] buffer) { | ||||||
|  |         ByteBuffer buf = ByteBuffer.wrap(buffer); | ||||||
|  | 
 | ||||||
|  |         return Terrain.getRootAsTerrain(buf) | ||||||
|  |           .effectsVector(); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,25 @@ | |||||||
|  | 
 | ||||||
|  | namespace MyGame.terrains; | ||||||
|  | 
 | ||||||
|  | enum Color:byte { Brown = 0, Red = 1, Green = 2, Blue = 3, White = 4 } | ||||||
|  | 
 | ||||||
|  | struct Vec3 { | ||||||
|  |   x:float; | ||||||
|  |   y:float; | ||||||
|  |   z:float; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | table Terrain { | ||||||
|  |   pos:Vec3; // Struct. | ||||||
|  |   name: string; | ||||||
|  |   color:Color = Blue; | ||||||
|  |   navigation: string; | ||||||
|  |   effects: [Effect]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | table Effect { | ||||||
|  |   name: string; | ||||||
|  |   damage: short; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | root_type Terrain; | ||||||
| @ -0,0 +1,43 @@ | |||||||
|  | package flatbuffers; | ||||||
|  | 
 | ||||||
|  | import org.junit.Assert; | ||||||
|  | import org.junit.Test; | ||||||
|  | 
 | ||||||
|  | import com.baeldung.flatbuffers.MyGameMain; | ||||||
|  | 
 | ||||||
|  | import MyGame.terrains.Effect; | ||||||
|  | 
 | ||||||
|  | public class FlatBufferGameUnitTest { | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void givenTerrainEffect_whenSerialisedWithValues_returnBytes() { | ||||||
|  |         MyGameMain myGame = new MyGameMain(); | ||||||
|  |         byte[] bytes = myGame.serialiseDesertTerrainData(); | ||||||
|  |         Assert.assertNotNull(bytes); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void givenSerialisedBytes_whenDeSerialised_returnsTerrain() { | ||||||
|  |         MyGameMain myGame = new MyGameMain(); | ||||||
|  |         byte[] bytes = myGame.serialiseDesertTerrainData(); | ||||||
|  | 
 | ||||||
|  |         MyGame.terrains.Terrain terrain = myGame.deserialiseDataToTerrain(bytes); | ||||||
|  |         Assert.assertNotNull(terrain); | ||||||
|  |         Assert.assertEquals(terrain.name(), "Desert"); | ||||||
|  |         Assert.assertEquals(terrain.navigation(), "south"); | ||||||
|  |         Assert.assertEquals(MyGame.terrains.Color.name(terrain.color()), "Brown"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void givenSerialisedBytes_whenDeSerialised_returnsTerrainEffect() { | ||||||
|  |         MyGameMain myGame = new MyGameMain(); | ||||||
|  |         byte[] bytes = myGame.serialiseDesertTerrainData(); | ||||||
|  | 
 | ||||||
|  |         Effect.Vector effectsVector = myGame.deserialiseDataToEffect(bytes); | ||||||
|  |         Assert.assertNotNull(effectsVector); | ||||||
|  |         Assert.assertEquals(effectsVector.get(0).name(), "Sandstorm"); | ||||||
|  |         Assert.assertEquals(effectsVector.get(1).name(), "Drought"); | ||||||
|  | 
 | ||||||
|  |         Assert.assertEquals(effectsVector.get(1).damage(), 1); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -13,9 +13,8 @@ | |||||||
|     </parent> |     </parent> | ||||||
| 
 | 
 | ||||||
|     <dependencies> |     <dependencies> | ||||||
|         <!-- sftp file transfer --> |  | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>com.jcraft</groupId> |             <groupId>com.github.mwiede</groupId> | ||||||
|             <artifactId>jsch</artifactId> |             <artifactId>jsch</artifactId> | ||||||
|             <version>${jsch.version}</version> |             <version>${jsch.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
| @ -27,7 +26,7 @@ | |||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>org.apache.commons</groupId> |             <groupId>org.apache.commons</groupId> | ||||||
|             <artifactId>commons-vfs2</artifactId> |             <artifactId>commons-vfs2</artifactId> | ||||||
|             <version>${vfs.version}</version> |             <version>${commons-vfs2.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>net.lingala.zip4j</groupId> |             <groupId>net.lingala.zip4j</groupId> | ||||||
| @ -66,12 +65,12 @@ | |||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <!-- sftp --> |         <!-- sftp --> | ||||||
|         <jsch.version>0.1.55</jsch.version> |         <jsch.version>0.2.16</jsch.version> | ||||||
|         <sshj.version>0.37.0</sshj.version> |         <sshj.version>0.38.0</sshj.version> | ||||||
|         <vfs.version>2.4</vfs.version> |         <commons-vfs2.version>2.9.0</commons-vfs2.version> | ||||||
|         <zip4j.version>2.9.0</zip4j.version> |         <zip4j.version>2.11.5</zip4j.version> | ||||||
|         <opencsv.version>5.8</opencsv.version> |         <opencsv.version>5.9</opencsv.version> | ||||||
|         <spring.version>4.3.8.RELEASE</spring.version> |         <spring.version>6.1.4</spring.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
| </project> | </project> | ||||||
| @ -58,6 +58,13 @@ | |||||||
| 
 | 
 | ||||||
|     <build> |     <build> | ||||||
|         <plugins> |         <plugins> | ||||||
|  |             <plugin> | ||||||
|  |                 <groupId>org.springframework.boot</groupId> | ||||||
|  |                 <artifactId>spring-boot-maven-plugin</artifactId> | ||||||
|  |                 <configuration> | ||||||
|  |                     <skip>true</skip> | ||||||
|  |                 </configuration> | ||||||
|  |             </plugin> | ||||||
|             <plugin> |             <plugin> | ||||||
|                 <groupId>org.openapitools</groupId> |                 <groupId>org.openapitools</groupId> | ||||||
|                 <artifactId>openapi-generator-maven-plugin</artifactId> |                 <artifactId>openapi-generator-maven-plugin</artifactId> | ||||||
|  | |||||||
| @ -33,13 +33,15 @@ | |||||||
|     </dependencies> |     </dependencies> | ||||||
| 
 | 
 | ||||||
|     <build> |     <build> | ||||||
|         <finalName>lombok</finalName> |         <plugins> | ||||||
|         <resources> |             <plugin> | ||||||
|             <resource> |                 <groupId>org.springframework.boot</groupId> | ||||||
|                 <directory>src/main/resources</directory> |                 <artifactId>spring-boot-maven-plugin</artifactId> | ||||||
|                 <filtering>true</filtering> |                 <configuration> | ||||||
|             </resource> |                     <skip>true</skip> | ||||||
|         </resources> |                 </configuration> | ||||||
|  |             </plugin> | ||||||
|  |         </plugins> | ||||||
|     </build> |     </build> | ||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|  | |||||||
| @ -10,9 +10,9 @@ | |||||||
| 
 | 
 | ||||||
|     <parent> |     <parent> | ||||||
|         <groupId>com.baeldung</groupId> |         <groupId>com.baeldung</groupId> | ||||||
|         <artifactId>parent-boot-2</artifactId> |         <artifactId>parent-boot-3</artifactId> | ||||||
|         <version>0.0.1-SNAPSHOT</version> |         <version>0.0.1-SNAPSHOT</version> | ||||||
|         <relativePath>../parent-boot-2</relativePath> |         <relativePath>../parent-boot-3</relativePath> | ||||||
|     </parent> |     </parent> | ||||||
| 
 | 
 | ||||||
|     <modules> |     <modules> | ||||||
|  | |||||||
| @ -22,7 +22,7 @@ | |||||||
|     </build> |     </build> | ||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <compiler.plugin.version>3.11.0</compiler.plugin.version> |         <compiler.plugin.version>3.12.1</compiler.plugin.version> | ||||||
|         <source.version>9</source.version> |         <source.version>9</source.version> | ||||||
|         <target.version>9</target.version> |         <target.version>9</target.version> | ||||||
|     </properties> |     </properties> | ||||||
|  | |||||||
| @ -40,7 +40,7 @@ | |||||||
|     </build> |     </build> | ||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <compiler.plugin.version>3.8.0</compiler.plugin.version> |         <compiler.plugin.version>3.12.1</compiler.plugin.version> | ||||||
|         <source.version>1.9</source.version> |         <source.version>1.9</source.version> | ||||||
|         <target.version>1.9</target.version> |         <target.version>1.9</target.version> | ||||||
|     </properties> |     </properties> | ||||||
|  | |||||||
| @ -152,7 +152,7 @@ | |||||||
|         <jdk.version>17</jdk.version> |         <jdk.version>17</jdk.version> | ||||||
|         <release.version>17</release.version> |         <release.version>17</release.version> | ||||||
|         <packaging>jar</packaging> |         <packaging>jar</packaging> | ||||||
|         <compiler.plugin.version>3.7.0</compiler.plugin.version> |         <compiler.plugin.version>3.12.1</compiler.plugin.version> | ||||||
|         <micronaut.runtime>netty</micronaut.runtime> |         <micronaut.runtime>netty</micronaut.runtime> | ||||||
|         <shade.plugin.version>3.2.0</shade.plugin.version> |         <shade.plugin.version>3.2.0</shade.plugin.version> | ||||||
|     </properties> |     </properties> | ||||||
|  | |||||||
| @ -68,7 +68,7 @@ | |||||||
|     <properties> |     <properties> | ||||||
|         <source.version>9</source.version> |         <source.version>9</source.version> | ||||||
|         <target.version>9</target.version> |         <target.version>9</target.version> | ||||||
|         <compiler.plugin.version>3.8.1</compiler.plugin.version> |         <compiler.plugin.version>3.12.1</compiler.plugin.version> | ||||||
|         <appmodules.version>1.0</appmodules.version> |         <appmodules.version>1.0</appmodules.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -160,7 +160,7 @@ | |||||||
|         <uberjar.name>benchmarks</uberjar.name> |         <uberjar.name>benchmarks</uberjar.name> | ||||||
|         <clean.plugin.version>3.1.0</clean.plugin.version> |         <clean.plugin.version>3.1.0</clean.plugin.version> | ||||||
|         <deploy.plugin.version>3.0.0-M1</deploy.plugin.version> |         <deploy.plugin.version>3.0.0-M1</deploy.plugin.version> | ||||||
|         <compiler.plugin.version>3.8.1</compiler.plugin.version> |         <compiler.plugin.version>3.12.1</compiler.plugin.version> | ||||||
|         <shade.plugin.version>3.2.4</shade.plugin.version> |         <shade.plugin.version>3.2.4</shade.plugin.version> | ||||||
|         <install.version>3.0.0-M1</install.version> |         <install.version>3.0.0-M1</install.version> | ||||||
|         <jar.plugin.version>3.2.0</jar.plugin.version> |         <jar.plugin.version>3.2.0</jar.plugin.version> | ||||||
|  | |||||||
| @ -12,18 +12,6 @@ | |||||||
|         <artifactId>persistence-modules</artifactId> |         <artifactId>persistence-modules</artifactId> | ||||||
|         <version>1.0.0-SNAPSHOT</version> |         <version>1.0.0-SNAPSHOT</version> | ||||||
|     </parent> |     </parent> | ||||||
|     <build> |  | ||||||
|         <plugins> |  | ||||||
|             <plugin> |  | ||||||
|                 <groupId>org.apache.maven.plugins</groupId> |  | ||||||
|                 <artifactId>maven-compiler-plugin</artifactId> |  | ||||||
|                 <configuration> |  | ||||||
|                     <source>9</source> |  | ||||||
|                     <target>9</target> |  | ||||||
|                 </configuration> |  | ||||||
|             </plugin> |  | ||||||
|         </plugins> |  | ||||||
|     </build> |  | ||||||
| 
 | 
 | ||||||
|     <dependencies> |     <dependencies> | ||||||
|         <dependency> |         <dependency> | ||||||
| @ -38,8 +26,17 @@ | |||||||
|         </dependency> |         </dependency> | ||||||
|     </dependencies> |     </dependencies> | ||||||
| 
 | 
 | ||||||
|  |     <build> | ||||||
|  |         <plugins> | ||||||
|  |             <plugin> | ||||||
|  |                 <groupId>org.apache.maven.plugins</groupId> | ||||||
|  |                 <artifactId>maven-compiler-plugin</artifactId> | ||||||
|  |             </plugin> | ||||||
|  |         </plugins> | ||||||
|  |     </build> | ||||||
|  | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <calcite.version>1.34.0</calcite.version> |         <calcite.version>1.36.0</calcite.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
| </project> | </project> | ||||||
| @ -92,7 +92,7 @@ | |||||||
|         <failOnMissingWebXml>false</failOnMissingWebXml> |         <failOnMissingWebXml>false</failOnMissingWebXml> | ||||||
|         <javaee-web-api.version>8.0.1</javaee-web-api.version> |         <javaee-web-api.version>8.0.1</javaee-web-api.version> | ||||||
|         <maven.war-plugin.version>3.3.1</maven.war-plugin.version> |         <maven.war-plugin.version>3.3.1</maven.war-plugin.version> | ||||||
|         <maven.compiler-plugin.version>3.8.1</maven.compiler-plugin.version> |         <maven.compiler-plugin.version>3.12.1</maven.compiler-plugin.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
| </project> | </project> | ||||||
| @ -48,7 +48,7 @@ | |||||||
|     <properties> |     <properties> | ||||||
|         <maven.release.version>11</maven.release.version> |         <maven.release.version>11</maven.release.version> | ||||||
|         <sirix-core.version>0.9.3</sirix-core.version> |         <sirix-core.version>0.9.3</sirix-core.version> | ||||||
|         <compiler.plugin.version>3.8.0</compiler.plugin.version> |         <compiler.plugin.version>3.12.1</compiler.plugin.version> | ||||||
|         <asm.version>6.1</asm.version> |         <asm.version>6.1</asm.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -0,0 +1,13 @@ | |||||||
|  | package com.baeldung.dbview; | ||||||
|  | 
 | ||||||
|  | import org.springframework.boot.SpringApplication; | ||||||
|  | import org.springframework.boot.autoconfigure.SpringBootApplication; | ||||||
|  | 
 | ||||||
|  | @SpringBootApplication | ||||||
|  | public class DatabaseViewApplication { | ||||||
|  | 
 | ||||||
|  |     public static void main(String[] args) { | ||||||
|  |         SpringApplication.run(DatabaseViewApplication.class, args); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,43 @@ | |||||||
|  | package com.baeldung.dbview; | ||||||
|  | 
 | ||||||
|  | import jakarta.persistence.AttributeOverride; | ||||||
|  | import jakarta.persistence.AttributeOverrides; | ||||||
|  | import jakarta.persistence.Column; | ||||||
|  | import jakarta.persistence.EmbeddedId; | ||||||
|  | import jakarta.persistence.Entity; | ||||||
|  | import jakarta.persistence.Table; | ||||||
|  | 
 | ||||||
|  | import lombok.AllArgsConstructor; | ||||||
|  | import lombok.Builder; | ||||||
|  | import lombok.EqualsAndHashCode; | ||||||
|  | import lombok.Getter; | ||||||
|  | import lombok.NoArgsConstructor; | ||||||
|  | import lombok.ToString; | ||||||
|  | 
 | ||||||
|  | import java.math.BigDecimal; | ||||||
|  | 
 | ||||||
|  | @Entity | ||||||
|  | @Table(name = "SHOP_SALE_VIEW") | ||||||
|  | @Getter | ||||||
|  | @Builder | ||||||
|  | @ToString | ||||||
|  | @NoArgsConstructor | ||||||
|  | @AllArgsConstructor | ||||||
|  | @EqualsAndHashCode(of = {"id"}) | ||||||
|  | public class ShopSale { | ||||||
|  | 
 | ||||||
|  |     @EmbeddedId | ||||||
|  |     @AttributeOverrides({ | ||||||
|  |             @AttributeOverride( name = "shopId", column = @Column(name = "shop_id")), | ||||||
|  |             @AttributeOverride( name = "year", column = @Column(name = "transaction_year")), | ||||||
|  |             @AttributeOverride( name = "month", column = @Column(name = "transaction_month")) | ||||||
|  |     }) | ||||||
|  |     private ShopSaleCompositeId id; | ||||||
|  | 
 | ||||||
|  |     @Column(name = "shop_location", length = 100) | ||||||
|  |     private String shopLocation; | ||||||
|  | 
 | ||||||
|  |     @Column(name = "total_amount") | ||||||
|  |     private BigDecimal totalAmount; | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,24 @@ | |||||||
|  | package com.baeldung.dbview; | ||||||
|  | 
 | ||||||
|  | import lombok.AllArgsConstructor; | ||||||
|  | import lombok.Builder; | ||||||
|  | import lombok.EqualsAndHashCode; | ||||||
|  | import lombok.Getter; | ||||||
|  | import lombok.NoArgsConstructor; | ||||||
|  | import lombok.ToString; | ||||||
|  | 
 | ||||||
|  | @Getter | ||||||
|  | @Builder | ||||||
|  | @ToString | ||||||
|  | @NoArgsConstructor | ||||||
|  | @AllArgsConstructor | ||||||
|  | @EqualsAndHashCode | ||||||
|  | public class ShopSaleCompositeId { | ||||||
|  | 
 | ||||||
|  |     private int shopId; | ||||||
|  | 
 | ||||||
|  |     private int year; | ||||||
|  | 
 | ||||||
|  |     private int month; | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,9 @@ | |||||||
|  | package com.baeldung.dbview; | ||||||
|  | 
 | ||||||
|  | import java.util.List; | ||||||
|  | 
 | ||||||
|  | public interface ShopSaleRepository extends ViewRepository<ShopSale, ShopSaleCompositeId> { | ||||||
|  | 
 | ||||||
|  |     List<ShopSale> findByIdShopId(Integer shopId); | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,46 @@ | |||||||
|  | package com.baeldung.dbview; | ||||||
|  | 
 | ||||||
|  | import jakarta.persistence.Column; | ||||||
|  | import jakarta.persistence.Entity; | ||||||
|  | import jakarta.persistence.Id; | ||||||
|  | import jakarta.persistence.Table; | ||||||
|  | 
 | ||||||
|  | import lombok.AllArgsConstructor; | ||||||
|  | import lombok.Builder; | ||||||
|  | import lombok.EqualsAndHashCode; | ||||||
|  | import lombok.Getter; | ||||||
|  | import lombok.NoArgsConstructor; | ||||||
|  | import lombok.ToString; | ||||||
|  | 
 | ||||||
|  | import java.math.BigDecimal; | ||||||
|  | 
 | ||||||
|  | @Entity | ||||||
|  | @Table(name = "SHOP_SALE_VIEW") | ||||||
|  | @Getter | ||||||
|  | @Builder | ||||||
|  | @ToString | ||||||
|  | @NoArgsConstructor | ||||||
|  | @AllArgsConstructor | ||||||
|  | @EqualsAndHashCode(of = {"id"}) | ||||||
|  | public class ShopSaleVid { | ||||||
|  | 
 | ||||||
|  |     @Id | ||||||
|  |     @Column(name = "id") | ||||||
|  |     private Long id; | ||||||
|  | 
 | ||||||
|  |     @Column(name = "shop_id") | ||||||
|  |     private int shopId; | ||||||
|  | 
 | ||||||
|  |     @Column(name = "shop_location", length = 100) | ||||||
|  |     private String shopLocation; | ||||||
|  | 
 | ||||||
|  |     @Column(name = "transaction_year") | ||||||
|  |     private int year; | ||||||
|  | 
 | ||||||
|  |     @Column(name = "transaction_month") | ||||||
|  |     private int month; | ||||||
|  | 
 | ||||||
|  |     @Column(name = "total_amount") | ||||||
|  |     private BigDecimal totalAmount; | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,9 @@ | |||||||
|  | package com.baeldung.dbview; | ||||||
|  | 
 | ||||||
|  | import java.util.List; | ||||||
|  | 
 | ||||||
|  | public interface ShopSaleVidRepository extends ViewNoIdRepository<ShopSaleVid, Long> { | ||||||
|  | 
 | ||||||
|  |     List<ShopSaleVid> findByShopId(Integer shopId); | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | package com.baeldung.dbview; | ||||||
|  | 
 | ||||||
|  | import org.springframework.data.repository.NoRepositoryBean; | ||||||
|  | import org.springframework.data.repository.Repository; | ||||||
|  | 
 | ||||||
|  | import java.util.List; | ||||||
|  | 
 | ||||||
|  | @NoRepositoryBean | ||||||
|  | public interface ViewNoIdRepository<T, K> extends Repository<T, K> { | ||||||
|  | 
 | ||||||
|  |     long count(); | ||||||
|  | 
 | ||||||
|  |     List<T> findAll(); | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,22 @@ | |||||||
|  | package com.baeldung.dbview; | ||||||
|  | 
 | ||||||
|  | import org.springframework.data.repository.NoRepositoryBean; | ||||||
|  | import org.springframework.data.repository.Repository; | ||||||
|  | 
 | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Optional; | ||||||
|  | 
 | ||||||
|  | @NoRepositoryBean | ||||||
|  | public interface ViewRepository<T, K> extends Repository<T, K> { | ||||||
|  | 
 | ||||||
|  |     long count(); | ||||||
|  | 
 | ||||||
|  |     boolean existsById(K id); | ||||||
|  | 
 | ||||||
|  |     List<T> findAll(); | ||||||
|  | 
 | ||||||
|  |     List<T> findAllById(Iterable<K> ids); | ||||||
|  | 
 | ||||||
|  |     Optional<T> findById(K id); | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,65 @@ | |||||||
|  | package com.baeldung.dbview; | ||||||
|  | 
 | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | import org.springframework.beans.factory.annotation.Autowired; | ||||||
|  | import org.springframework.boot.test.context.SpringBootTest; | ||||||
|  | 
 | ||||||
|  | import java.util.List; | ||||||
|  | 
 | ||||||
|  | import static org.assertj.core.api.Assertions.assertThat; | ||||||
|  | 
 | ||||||
|  | @SpringBootTest(classes = DatabaseViewApplication.class, properties = { | ||||||
|  |         "spring.jpa.show-sql=true", | ||||||
|  |         "spring.jpa.properties.hibernate.format_sql=true", | ||||||
|  |         "spring.jpa.hibernate.ddl-auto=none", | ||||||
|  |         "spring.jpa.defer-datasource-initialization=true", | ||||||
|  |         "spring.sql.init.data-locations=classpath:shop-sale-data.sql" | ||||||
|  | }) | ||||||
|  | class ShopSaleRepositoryIntegrationTest { | ||||||
|  | 
 | ||||||
|  |     private static final ShopSaleCompositeId id = ShopSaleCompositeId.builder() | ||||||
|  |             .shopId(1) | ||||||
|  |             .year(2024) | ||||||
|  |             .month(1) | ||||||
|  |             .build(); | ||||||
|  | 
 | ||||||
|  |     @Autowired | ||||||
|  |     private ShopSaleRepository shopSaleRepository; | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void whenCount_thenValueGreaterThanOne() { | ||||||
|  |         assertThat(shopSaleRepository.count()).isGreaterThan(0); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void whenFindAll_thenReturnAllRecords() { | ||||||
|  |         assertThat(shopSaleRepository.findAll()).isNotEmpty(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void whenExistsById_thenReturnTrue() { | ||||||
|  |         assertThat(shopSaleRepository.existsById(id)).isTrue(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void whenFindAllById_thenReturnListWithTwoInstances() { | ||||||
|  |         assertThat(shopSaleRepository.findAllById(List.of (id))).hasSize(1); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void whenFindById_thenReturnAnInstance() { | ||||||
|  |         assertThat(shopSaleRepository.findById(id).isPresent()).isTrue(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void whenFindByShopId_thenReturnAllShopSaleOfThatShop() { | ||||||
|  |         var shopId = 1; | ||||||
|  |         List<ShopSale> shopSaleVidList = shopSaleRepository.findByIdShopId(shopId); | ||||||
|  |         assertThat(shopSaleVidList).isNotEmpty(); | ||||||
|  |         shopSaleVidList.forEach(s -> assertThat(s.getId().getShopId()).isEqualTo(shopId)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,41 @@ | |||||||
|  | package com.baeldung.dbview; | ||||||
|  | 
 | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | import org.springframework.beans.factory.annotation.Autowired; | ||||||
|  | import org.springframework.boot.test.context.SpringBootTest; | ||||||
|  | 
 | ||||||
|  | import java.util.List; | ||||||
|  | 
 | ||||||
|  | import static org.assertj.core.api.Assertions.assertThat; | ||||||
|  | 
 | ||||||
|  | @SpringBootTest(classes = DatabaseViewApplication.class, properties = { | ||||||
|  |         "spring.jpa.show-sql=true", | ||||||
|  |         "spring.jpa.properties.hibernate.format_sql=true", | ||||||
|  |         "spring.jpa.hibernate.ddl-auto=none", | ||||||
|  |         "spring.jpa.defer-datasource-initialization=true", | ||||||
|  |         "spring.sql.init.data-locations=classpath:shop-sale-data.sql" | ||||||
|  | }) | ||||||
|  | class ShopSaleVidRepositoryIntegrationTest { | ||||||
|  | 
 | ||||||
|  |     @Autowired | ||||||
|  |     private ShopSaleVidRepository shopSaleVidRepository; | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void whenCount_thenValueGreaterThanOne() { | ||||||
|  |         assertThat(shopSaleVidRepository.count()).isGreaterThan(0); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void whenFindAll_thenReturnAllRecords() { | ||||||
|  |         assertThat(shopSaleVidRepository.findAll()).isNotEmpty(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void whenFindByShopId_thenReturnAllShopSaleOfThatShop() { | ||||||
|  |         var shopId = 1; | ||||||
|  |         List<ShopSaleVid> shopSaleList = shopSaleVidRepository.findByShopId(shopId); | ||||||
|  |         assertThat(shopSaleList).isNotEmpty(); | ||||||
|  |         shopSaleList.forEach(s -> assertThat(s.getShopId()).isEqualTo(shopId)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,47 @@ | |||||||
|  | CREATE TABLE SHOP | ||||||
|  | ( | ||||||
|  |     shop_id             int             AUTO_INCREMENT, | ||||||
|  |     shop_location       varchar(100)    NOT NULL UNIQUE, | ||||||
|  |     PRIMARY KEY(shop_id) | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | CREATE TABLE SHOP_TRANSACTION | ||||||
|  | ( | ||||||
|  |     transaction_id      bigint          AUTO_INCREMENT, | ||||||
|  |     transaction_date    date            NOT NULL, | ||||||
|  |     shop_id             int             NOT NULL, | ||||||
|  |     amount              decimal(8,2)    NOT NULL, | ||||||
|  |     PRIMARY KEY(transaction_id), | ||||||
|  |     FOREIGN KEY(shop_id) REFERENCES SHOP(shop_id) | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | CREATE VIEW SHOP_SALE_VIEW AS | ||||||
|  | SELECT ROW_NUMBER() OVER () AS id, shop_id, shop_location, transaction_year, transaction_month, SUM(amount) AS total_amount | ||||||
|  | FROM ( | ||||||
|  |     SELECT shop.shop_id, shop.shop_location, trans.amount, YEAR(transaction_date) AS transaction_year, MONTH(transaction_date) AS transaction_month | ||||||
|  |     FROM SHOP shop, SHOP_TRANSACTION trans | ||||||
|  |     WHERE shop.shop_id = trans.shop_id | ||||||
|  | ) SHOP_MONTH_TRANSACTION | ||||||
|  | GROUP BY shop_id, transaction_year, transaction_month; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | INSERT INTO SHOP(shop_location) VALUES ('Ealing'); | ||||||
|  | INSERT INTO SHOP(shop_location) VALUES ('Richmond'); | ||||||
|  | 
 | ||||||
|  | INSERT INTO SHOP_TRANSACTION(transaction_date, shop_id, amount) VALUES ('2024-01-05', 1, 3.49); | ||||||
|  | INSERT INTO SHOP_TRANSACTION(transaction_date, shop_id, amount) VALUES ('2024-01-31', 1, 7.29); | ||||||
|  | INSERT INTO SHOP_TRANSACTION(transaction_date, shop_id, amount) VALUES ('2024-02-09', 1, 1.60); | ||||||
|  | INSERT INTO SHOP_TRANSACTION(transaction_date, shop_id, amount) VALUES ('2024-02-17', 1, 5.99); | ||||||
|  | INSERT INTO SHOP_TRANSACTION(transaction_date, shop_id, amount) VALUES ('2024-02-18', 1, 5.99); | ||||||
|  | INSERT INTO SHOP_TRANSACTION(transaction_date, shop_id, amount) VALUES ('2024-03-01', 1, 8.99); | ||||||
|  | INSERT INTO SHOP_TRANSACTION(transaction_date, shop_id, amount) VALUES ('2024-03-22', 1, 5.49); | ||||||
|  | 
 | ||||||
|  | INSERT INTO SHOP_TRANSACTION(transaction_date, shop_id, amount) VALUES ('2024-01-15', 2, 8.99); | ||||||
|  | INSERT INTO SHOP_TRANSACTION(transaction_date, shop_id, amount) VALUES ('2024-01-18', 2, 8.99); | ||||||
|  | INSERT INTO SHOP_TRANSACTION(transaction_date, shop_id, amount) VALUES ('2024-02-01', 2, 5.99); | ||||||
|  | INSERT INTO SHOP_TRANSACTION(transaction_date, shop_id, amount) VALUES ('2024-02-05', 2, 2.50); | ||||||
|  | INSERT INTO SHOP_TRANSACTION(transaction_date, shop_id, amount) VALUES ('2024-03-01', 2, 5.99); | ||||||
|  | INSERT INTO SHOP_TRANSACTION(transaction_date, shop_id, amount) VALUES ('2024-03-02', 2, 6.60); | ||||||
|  | INSERT INTO SHOP_TRANSACTION(transaction_date, shop_id, amount) VALUES ('2024-03-17', 2, 1.19); | ||||||
| @ -84,7 +84,7 @@ | |||||||
|             <plugin> |             <plugin> | ||||||
|                 <groupId>org.apache.maven.plugins</groupId> |                 <groupId>org.apache.maven.plugins</groupId> | ||||||
|                 <artifactId>maven-compiler-plugin</artifactId> |                 <artifactId>maven-compiler-plugin</artifactId> | ||||||
|                 <version>3.8.1</version> |                 <version>3.12.1</version> | ||||||
|                 <configuration> |                 <configuration> | ||||||
|                     <annotationProcessorPaths> |                     <annotationProcessorPaths> | ||||||
|                         <path> |                         <path> | ||||||
|  | |||||||
| @ -74,7 +74,7 @@ | |||||||
|     </build> |     </build> | ||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <querydsl.version>5.0.0</querydsl.version> |         <querydsl.version>5.1.0</querydsl.version> | ||||||
|         <mysema.maven.version>1.1.3</mysema.maven.version> |         <mysema.maven.version>1.1.3</mysema.maven.version> | ||||||
|         <projectreactor.version>3.5.4</projectreactor.version> |         <projectreactor.version>3.5.4</projectreactor.version> | ||||||
|         <embed.mongo.version>4.6.3</embed.mongo.version> |         <embed.mongo.version>4.6.3</embed.mongo.version> | ||||||
|  | |||||||
							
								
								
									
										13
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								pom.xml
									
									
									
									
									
								
							| @ -8,6 +8,9 @@ | |||||||
|     <artifactId>parent-modules</artifactId> |     <artifactId>parent-modules</artifactId> | ||||||
|     <version>1.0.0-SNAPSHOT</version> |     <version>1.0.0-SNAPSHOT</version> | ||||||
|     <name>parent-modules</name> |     <name>parent-modules</name> | ||||||
|  |     <modules> | ||||||
|  |         <module>libraries-data-io-2</module> | ||||||
|  |     </modules> | ||||||
| 
 | 
 | ||||||
|     <packaging>pom</packaging> |     <packaging>pom</packaging> | ||||||
| 
 | 
 | ||||||
| @ -450,7 +453,9 @@ | |||||||
|             <modules> |             <modules> | ||||||
|                 <module>apache-spark</module> |                 <module>apache-spark</module> | ||||||
|                 <module>jhipster-modules</module> |                 <module>jhipster-modules</module> | ||||||
|  |                 <module>spring-cloud-modules/spring-cloud-azure</module> | ||||||
|                 <module>web-modules/restx</module> |                 <module>web-modules/restx</module> | ||||||
|  |                 <module>libraries-testing</module> | ||||||
|             </modules> |             </modules> | ||||||
|         </profile> |         </profile> | ||||||
| 
 | 
 | ||||||
| @ -594,6 +599,7 @@ | |||||||
| 
 | 
 | ||||||
|                 <module>apache-spark</module> |                 <module>apache-spark</module> | ||||||
|                 <module>jhipster-modules</module> |                 <module>jhipster-modules</module> | ||||||
|  |                 <module>spring-cloud-modules/spring-cloud-azure</module> | ||||||
|                 <module>web-modules/restx</module> |                 <module>web-modules/restx</module> | ||||||
|             </modules> |             </modules> | ||||||
| 
 | 
 | ||||||
| @ -758,7 +764,6 @@ | |||||||
|                 <module>libraries-server-2</module> |                 <module>libraries-server-2</module> | ||||||
|                 <module>libraries-server</module> |                 <module>libraries-server</module> | ||||||
|                 <module>libraries-stream</module> |                 <module>libraries-stream</module> | ||||||
|                 <module>libraries-testing</module> |  | ||||||
|                 <module>libraries-testing-2</module> |                 <module>libraries-testing-2</module> | ||||||
|                 <module>libraries-transform</module> |                 <module>libraries-transform</module> | ||||||
|                 <module>libraries</module> <!-- very long running --> |                 <module>libraries</module> <!-- very long running --> | ||||||
| @ -808,7 +813,6 @@ | |||||||
|                 <module>spring-batch</module> |                 <module>spring-batch</module> | ||||||
|                 <module>spring-boot-modules</module> |                 <module>spring-boot-modules</module> | ||||||
|                 <module>spring-boot-rest</module> |                 <module>spring-boot-rest</module> | ||||||
|                 <module>spring-cloud-modules/spring-cloud-azure</module> |  | ||||||
|                 <module>spring-cloud-modules/spring-cloud-circuit-breaker</module> |                 <module>spring-cloud-modules/spring-cloud-circuit-breaker</module> | ||||||
|                 <module>spring-cloud-modules/spring-cloud-contract</module> |                 <module>spring-cloud-modules/spring-cloud-contract</module> | ||||||
|                 <!--<module>spring-cloud-modules/spring-cloud-data-flow</module>--><!-- failing after upgrading to jdk17--> |                 <!--<module>spring-cloud-modules/spring-cloud-data-flow</module>--><!-- failing after upgrading to jdk17--> | ||||||
| @ -1054,7 +1058,6 @@ | |||||||
|                 <module>spring-batch</module> |                 <module>spring-batch</module> | ||||||
|                 <module>spring-boot-modules</module> |                 <module>spring-boot-modules</module> | ||||||
|                 <module>spring-boot-rest</module> |                 <module>spring-boot-rest</module> | ||||||
|                 <module>spring-cloud-modules/spring-cloud-azure</module> |  | ||||||
|                 <module>spring-cloud-modules/spring-cloud-circuit-breaker</module> |                 <module>spring-cloud-modules/spring-cloud-circuit-breaker</module> | ||||||
|                 <module>spring-cloud-modules/spring-cloud-contract</module> |                 <module>spring-cloud-modules/spring-cloud-contract</module> | ||||||
|                 <!--<module>spring-cloud-modules/spring-cloud-data-flow</module>--><!-- failing after upgrading to jdk17--> |                 <!--<module>spring-cloud-modules/spring-cloud-data-flow</module>--><!-- failing after upgrading to jdk17--> | ||||||
| @ -1184,9 +1187,9 @@ | |||||||
|         <jmh-generator.version>1.37</jmh-generator.version> |         <jmh-generator.version>1.37</jmh-generator.version> | ||||||
|         <maven-failsafe-plugin.version>3.1.2</maven-failsafe-plugin.version> |         <maven-failsafe-plugin.version>3.1.2</maven-failsafe-plugin.version> | ||||||
|         <commons-collections4.version>4.4</commons-collections4.version> |         <commons-collections4.version>4.4</commons-collections4.version> | ||||||
|         <commons-io.version>2.13.0</commons-io.version> |         <commons-io.version>2.15.1</commons-io.version> | ||||||
|         <commons-lang3.version>3.14.0</commons-lang3.version> |         <commons-lang3.version>3.14.0</commons-lang3.version> | ||||||
|         <commons-cli.version>1.5.0</commons-cli.version> |         <commons-cli.version>1.6.0</commons-cli.version> | ||||||
|         <maven-war-plugin.version>3.4.0</maven-war-plugin.version> |         <maven-war-plugin.version>3.4.0</maven-war-plugin.version> | ||||||
|         <javax.servlet-api.version>4.0.1</javax.servlet-api.version> |         <javax.servlet-api.version>4.0.1</javax.servlet-api.version> | ||||||
|         <jstl-api.version>1.2</jstl-api.version> |         <jstl-api.version>1.2</jstl-api.version> | ||||||
|  | |||||||
| @ -128,7 +128,7 @@ | |||||||
|     </profiles> |     </profiles> | ||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <compiler-plugin.version>3.10.1</compiler-plugin.version> |         <compiler-plugin.version>3.12.1</compiler-plugin.version> | ||||||
|         <failsafe.useModulePath>false</failsafe.useModulePath> |         <failsafe.useModulePath>false</failsafe.useModulePath> | ||||||
|         <maven.compiler.release>17</maven.compiler.release> |         <maven.compiler.release>17</maven.compiler.release> | ||||||
|         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||||||
|  | |||||||
| @ -27,7 +27,7 @@ | |||||||
|     </dependencyManagement> |     </dependencyManagement> | ||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <compiler-plugin.version>3.11.0</compiler-plugin.version> |         <compiler-plugin.version>3.12.1</compiler-plugin.version> | ||||||
|         <maven.compiler.release>21</maven.compiler.release> |         <maven.compiler.release>21</maven.compiler.release> | ||||||
|         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||||||
|         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> |         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> | ||||||
|  | |||||||
| @ -136,7 +136,7 @@ | |||||||
|     </profiles> |     </profiles> | ||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <compiler-plugin.version>3.10.1</compiler-plugin.version> |         <compiler-plugin.version>3.12.1</compiler-plugin.version> | ||||||
|         <maven.compiler.parameters>true</maven.compiler.parameters> |         <maven.compiler.parameters>true</maven.compiler.parameters> | ||||||
|         <maven.compiler.source>11</maven.compiler.source> |         <maven.compiler.source>11</maven.compiler.source> | ||||||
|         <maven.compiler.target>11</maven.compiler.target> |         <maven.compiler.target>11</maven.compiler.target> | ||||||
|  | |||||||
| @ -17,7 +17,7 @@ | |||||||
|         <module>apache-shiro</module> |         <module>apache-shiro</module> | ||||||
|         <module>cas</module> |         <module>cas</module> | ||||||
|         <module>cloud-foundry-uaa</module> |         <module>cloud-foundry-uaa</module> | ||||||
|         <module>java-ee-8-security-api</module> | <!--        <module>java-ee-8-security-api</module>--> | ||||||
|         <module>jee-7-security</module> |         <module>jee-7-security</module> | ||||||
|         <module>jjwt</module> |         <module>jjwt</module> | ||||||
|         <module>jwt</module> |         <module>jwt</module> | ||||||
|  | |||||||
| @ -11,16 +11,16 @@ | |||||||
| 
 | 
 | ||||||
|     <parent> |     <parent> | ||||||
|         <groupId>com.baeldung</groupId> |         <groupId>com.baeldung</groupId> | ||||||
|         <artifactId>parent-boot-2</artifactId> |         <artifactId>parent-boot-3</artifactId> | ||||||
|         <version>0.0.1-SNAPSHOT</version> |         <version>0.0.1-SNAPSHOT</version> | ||||||
|         <relativePath>../parent-boot-2</relativePath> |         <relativePath>../parent-boot-3</relativePath> | ||||||
|     </parent> |     </parent> | ||||||
| 
 | 
 | ||||||
|     <modules> |     <modules> | ||||||
|         <module>spring-boot-admin</module> |         <module>spring-boot-admin</module> | ||||||
|         <module>spring-boot-angular</module> |         <module>spring-boot-angular</module> | ||||||
|         <module>spring-boot-annotations</module> |         <module>spring-boot-annotations</module> | ||||||
|         <module>spring-boot-annotations-2</module> | <!--        <module>spring-boot-annotations-2</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <module>spring-boot-artifacts</module> |         <module>spring-boot-artifacts</module> | ||||||
|         <module>spring-boot-artifacts-2</module> |         <module>spring-boot-artifacts-2</module> | ||||||
|         <module>spring-boot-autoconfiguration</module> |         <module>spring-boot-autoconfiguration</module> | ||||||
| @ -31,33 +31,33 @@ | |||||||
|         <module>spring-boot-config-jpa-error</module> |         <module>spring-boot-config-jpa-error</module> | ||||||
|         <module>spring-boot-ctx-fluent</module> |         <module>spring-boot-ctx-fluent</module> | ||||||
|         <module>spring-boot-deployment</module> |         <module>spring-boot-deployment</module> | ||||||
|         <module>spring-boot-di</module> | <!--        <module>spring-boot-di</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <module>spring-boot-disable-logging</module> |         <module>spring-boot-disable-logging</module> | ||||||
|         <module>spring-boot-ci-cd</module> |         <module>spring-boot-ci-cd</module> | ||||||
|         <!-- <module>spring-boot-cli</module> --> <!-- Not a maven project --> |         <!-- <module>spring-boot-cli</module> --> <!-- Not a maven project --> | ||||||
|         <module>spring-boot-custom-starter</module> | <!--        <module>spring-boot-custom-starter</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <module>spring-boot-crud</module> |         <module>spring-boot-crud</module> | ||||||
|         <module>spring-boot-data</module> |         <module>spring-boot-data</module> | ||||||
|         <module>spring-boot-environment</module> |         <module>spring-boot-environment</module> | ||||||
|         <module>spring-boot-exceptions</module> |         <module>spring-boot-exceptions</module> | ||||||
|         <module>spring-boot-flowable</module> |         <module>spring-boot-flowable</module> | ||||||
|         <module>spring-boot-graphql</module> | <!--        <module>spring-boot-graphql</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <!--<module>spring-boot-groovy</module>--> <!-- failing after upgrading to jdk17--> |         <!--<module>spring-boot-groovy</module>--> <!-- failing after upgrading to jdk17--> | ||||||
|         <!-- <module>spring-boot-gradle</module> --> <!-- Not a maven project --> |         <!-- <module>spring-boot-gradle</module> --> <!-- Not a maven project --> | ||||||
|         <module>spring-boot-jasypt</module> |         <module>spring-boot-jasypt</module> | ||||||
|         <module>spring-boot-jsp</module> | <!--        <module>spring-boot-jsp</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <module>spring-boot-keycloak</module> |         <module>spring-boot-keycloak</module> | ||||||
|         <module>spring-boot-keycloak-2</module> |         <module>spring-boot-keycloak-2</module> | ||||||
|         <module>spring-boot-libraries</module> |         <!--        <module>spring-boot-libraries</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <module>spring-boot-libraries-2</module> | <!--        <module>spring-boot-libraries-2</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <module>spring-boot-process-automation</module> |         <module>spring-boot-process-automation</module> | ||||||
|         <module>spring-boot-logging-logback</module> |         <module>spring-boot-logging-logback</module> | ||||||
|         <module>spring-boot-logging-log4j2</module> |         <module>spring-boot-logging-log4j2</module> | ||||||
|         <module>spring-boot-mvc</module> | <!--        <module>spring-boot-mvc</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <module>spring-boot-mvc-2</module> |         <module>spring-boot-mvc-2</module> | ||||||
|         <module>spring-boot-mvc-3</module> |         <module>spring-boot-mvc-3</module> | ||||||
|         <module>spring-boot-mvc-4</module> |         <module>spring-boot-mvc-4</module> | ||||||
|         <module>spring-boot-mvc-5</module> |         <!--        <module>spring-boot-mvc-5</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <module>spring-boot-mvc-birt</module> |         <module>spring-boot-mvc-birt</module> | ||||||
|         <module>spring-boot-mvc-jersey</module> |         <module>spring-boot-mvc-jersey</module> | ||||||
|         <module>spring-boot-nashorn</module> |         <module>spring-boot-nashorn</module> | ||||||
| @ -65,34 +65,34 @@ | |||||||
|         <module>spring-boot-performance</module> |         <module>spring-boot-performance</module> | ||||||
|         <module>spring-boot-property-exp</module> |         <module>spring-boot-property-exp</module> | ||||||
|         <module>spring-boot-request-params</module> |         <module>spring-boot-request-params</module> | ||||||
|         <module>spring-boot-runtime</module> | <!--        <module>spring-boot-runtime</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <module>spring-boot-runtime-2</module> | <!--        <module>spring-boot-runtime-2</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <module>spring-boot-security</module> |         <module>spring-boot-security</module> | ||||||
|         <module>spring-boot-security-2</module> |         <module>spring-boot-security-2</module> | ||||||
|         <module>spring-boot-ssl-bundles</module> |         <module>spring-boot-ssl-bundles</module> | ||||||
|         <module>spring-boot-telegram</module> |         <module>spring-boot-telegram</module> | ||||||
|         <module>spring-boot-springdoc</module> | <!--        <module>spring-boot-springdoc</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <module>spring-boot-swagger</module> | <!--        <module>spring-boot-swagger</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <module>spring-boot-swagger-2</module> | <!--        <module>spring-boot-swagger-2</module>--> <!-- failing after upgrading to spring boot 3. Swagger codegen yet not compatible?!--> | ||||||
|         <module>spring-boot-swagger-jwt</module> |         <module>spring-boot-swagger-jwt</module> | ||||||
|         <module>spring-boot-swagger-keycloak</module> |         <module>spring-boot-swagger-keycloak</module> | ||||||
|         <module>spring-boot-swagger-springfox</module> |         <module>spring-boot-swagger-springfox</module> | ||||||
|         <module>spring-boot-testing</module> |         <!--        <module>spring-boot-testing</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <module>spring-boot-testing-2</module> | <!--        <module>spring-boot-testing-2</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <module>spring-boot-testing-spock</module> |         <module>spring-boot-testing-spock</module> | ||||||
|         <module>spring-boot-vue</module> |         <module>spring-boot-vue</module> | ||||||
|         <module>spring-boot-actuator</module> |         <module>spring-boot-actuator</module> | ||||||
|         <module>spring-boot-data-2</module> |         <module>spring-boot-data-2</module> | ||||||
|         <module>spring-boot-validation</module> |         <module>spring-boot-validation</module> | ||||||
|         <module>spring-boot-data-3</module> | <!--        <module>spring-boot-data-3</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <module>spring-caching</module> | <!--        <module>spring-caching</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <module>spring-caching-2</module> | <!--        <module>spring-caching-2</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <module>spring-boot-redis</module> |         <!--        <module>spring-boot-redis</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <module>spring-boot-cassandre</module> |         <module>spring-boot-cassandre</module> | ||||||
|         <module>spring-boot-react</module> | <!--        <module>spring-boot-react</module>--> <!-- failing after upgrading to spring boot 3.2.x. very old node version which is not available now. --> | ||||||
|         <!-- <module>spring-boot-3</module> --> <!-- JAVA-20931 --> |         <!-- <module>spring-boot-3</module> --> <!-- JAVA-20931 --> | ||||||
|         <module>spring-boot-3-grpc</module> |         <module>spring-boot-3-grpc</module> | ||||||
|         <module>spring-boot-3-native</module> |         <!--        <module>spring-boot-3-native</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <module>spring-boot-3-observation</module> |         <module>spring-boot-3-observation</module> | ||||||
|         <module>spring-boot-3-test-pitfalls</module> |         <module>spring-boot-3-test-pitfalls</module> | ||||||
|         <module>spring-boot-3-testcontainers</module> |         <module>spring-boot-3-testcontainers</module> | ||||||
| @ -100,10 +100,10 @@ | |||||||
|         <module>spring-boot-resilience4j</module> |         <module>spring-boot-resilience4j</module> | ||||||
|         <module>spring-boot-properties</module> |         <module>spring-boot-properties</module> | ||||||
|         <module>spring-boot-properties-2</module> |         <module>spring-boot-properties-2</module> | ||||||
|         <module>spring-boot-properties-3</module> | <!--        <module>spring-boot-properties-3</module>--> <!-- failing after upgrading to spring boot 3.2.x --> | ||||||
|         <module>spring-boot-properties-4</module> |         <module>spring-boot-properties-4</module> | ||||||
|         <module>spring-boot-properties-migrator-demo</module> |         <module>spring-boot-properties-migrator-demo</module> | ||||||
|         <module>spring-boot-aws</module> |         <module>spring-boot-aws</module> <!-- This project is Spring Boot 2 and cannot be updated --> | ||||||
|         <module>spring-boot-keycloak-adapters</module> |         <module>spring-boot-keycloak-adapters</module> | ||||||
|         <module>spring-boot-mvc-legacy</module> |         <module>spring-boot-mvc-legacy</module> | ||||||
|         <module>spring-boot-springdoc-2</module> |         <module>spring-boot-springdoc-2</module> | ||||||
|  | |||||||
| @ -8,10 +8,9 @@ | |||||||
|     <name>helloworld-grpc-consumer</name> |     <name>helloworld-grpc-consumer</name> | ||||||
| 
 | 
 | ||||||
|     <parent> |     <parent> | ||||||
|         <groupId>com.baeldung</groupId> |         <groupId>com.baeldung.spring-boot-modules</groupId> | ||||||
|         <artifactId>parent-boot-3</artifactId> |         <artifactId>spring-boot-3-grpc</artifactId> | ||||||
|         <version>0.0.1-SNAPSHOT</version> |         <version>1.0.0-SNAPSHOT</version> | ||||||
|         <relativePath>../../../parent-boot-3</relativePath> |  | ||||||
|     </parent> |     </parent> | ||||||
| 
 | 
 | ||||||
|     <dependencies> |     <dependencies> | ||||||
| @ -28,7 +27,6 @@ | |||||||
|     </dependencies> |     </dependencies> | ||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <spring-boot.version>3.2.0</spring-boot.version> |  | ||||||
|         <grpc-spring-boot-starter.version>2.15.0.RELEASE</grpc-spring-boot-starter.version> |         <grpc-spring-boot-starter.version>2.15.0.RELEASE</grpc-spring-boot-starter.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -84,6 +84,7 @@ | |||||||
|         <os-maven-plugin.version>1.7.1</os-maven-plugin.version> |         <os-maven-plugin.version>1.7.1</os-maven-plugin.version> | ||||||
|         <protobuf-maven-plugin.version>0.6.1</protobuf-maven-plugin.version> |         <protobuf-maven-plugin.version>0.6.1</protobuf-maven-plugin.version> | ||||||
|         <annotation-api.version>1.3.2</annotation-api.version> |         <annotation-api.version>1.3.2</annotation-api.version> | ||||||
|  |         <spring-boot.repackage.skip>true</spring-boot.repackage.skip> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
| </project> | </project> | ||||||
| @ -8,10 +8,9 @@ | |||||||
|     <name>helloworld-grpc-provider</name> |     <name>helloworld-grpc-provider</name> | ||||||
| 
 | 
 | ||||||
|     <parent> |     <parent> | ||||||
|         <groupId>com.baeldung</groupId> |         <groupId>com.baeldung.spring-boot-modules</groupId> | ||||||
|         <artifactId>parent-boot-3</artifactId> |         <artifactId>spring-boot-3-grpc</artifactId> | ||||||
|         <version>0.0.1-SNAPSHOT</version> |         <version>1.0.0-SNAPSHOT</version> | ||||||
|         <relativePath>../../../parent-boot-3</relativePath> |  | ||||||
|     </parent> |     </parent> | ||||||
| 
 | 
 | ||||||
|     <dependencies> |     <dependencies> | ||||||
| @ -28,7 +27,6 @@ | |||||||
|     </dependencies> |     </dependencies> | ||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <spring-boot.version>3.2.0</spring-boot.version> |  | ||||||
|         <grpc-spring-boot-starter.version>2.15.0.RELEASE</grpc-spring-boot-starter.version> |         <grpc-spring-boot-starter.version>2.15.0.RELEASE</grpc-spring-boot-starter.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -3,17 +3,15 @@ | |||||||
|     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |     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"> |     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||||
|     <modelVersion>4.0.0</modelVersion> |     <modelVersion>4.0.0</modelVersion> | ||||||
|     <groupId>com.baeldung.spring-boot-modules</groupId> |  | ||||||
|     <artifactId>spring-boot-3-grpc</artifactId> |     <artifactId>spring-boot-3-grpc</artifactId> | ||||||
|     <version>1.0.0-SNAPSHOT</version> |     <version>1.0.0-SNAPSHOT</version> | ||||||
|     <name>spring-boot-3-grpc</name> |     <name>spring-boot-3-grpc</name> | ||||||
|     <packaging>pom</packaging> |     <packaging>pom</packaging> | ||||||
| 
 | 
 | ||||||
|     <parent> |     <parent> | ||||||
|         <groupId>com.baeldung</groupId> |         <groupId>com.baeldung.spring-boot-modules</groupId> | ||||||
|         <artifactId>parent-modules</artifactId> |         <artifactId>spring-boot-modules</artifactId> | ||||||
|         <version>1.0.0-SNAPSHOT</version> |         <version>1.0.0-SNAPSHOT</version> | ||||||
|         <relativePath>../../pom.xml</relativePath> |  | ||||||
|     </parent> |     </parent> | ||||||
| 
 | 
 | ||||||
|     <modules> |     <modules> | ||||||
|  | |||||||
| @ -9,10 +9,9 @@ | |||||||
|     <description>Demo project for Spring Boot</description> |     <description>Demo project for Spring Boot</description> | ||||||
| 
 | 
 | ||||||
|     <parent> |     <parent> | ||||||
|         <groupId>com.baeldung</groupId> |         <groupId>com.baeldung.spring-boot-modules</groupId> | ||||||
|         <artifactId>parent-boot-3</artifactId> |         <artifactId>spring-boot-modules</artifactId> | ||||||
|         <version>0.0.1-SNAPSHOT</version> |         <version>1.0.0-SNAPSHOT</version> | ||||||
|         <relativePath>../../parent-boot-3</relativePath> |  | ||||||
|     </parent> |     </parent> | ||||||
| 
 | 
 | ||||||
|     <dependencies> |     <dependencies> | ||||||
| @ -100,6 +99,7 @@ | |||||||
|         <springdoc.version>2.0.0</springdoc.version> |         <springdoc.version>2.0.0</springdoc.version> | ||||||
|         <maven-surefire-plugin.version>3.0.0-M7</maven-surefire-plugin.version> |         <maven-surefire-plugin.version>3.0.0-M7</maven-surefire-plugin.version> | ||||||
|         <native.maven.plugin.version>0.9.17</native.maven.plugin.version> |         <native.maven.plugin.version>0.9.17</native.maven.plugin.version> | ||||||
|  |         <java.version>17</java.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
| </project> | </project> | ||||||
| @ -8,10 +8,9 @@ | |||||||
|     <description>Demo project for Spring Boot 3 Observation</description> |     <description>Demo project for Spring Boot 3 Observation</description> | ||||||
| 
 | 
 | ||||||
|     <parent> |     <parent> | ||||||
|         <groupId>com.baeldung</groupId> |         <groupId>com.baeldung.spring-boot-modules</groupId> | ||||||
|         <artifactId>parent-boot-3</artifactId> |         <artifactId>spring-boot-modules</artifactId> | ||||||
|         <version>0.0.1-SNAPSHOT</version> |         <version>1.0.0-SNAPSHOT</version> | ||||||
|         <relativePath>../../parent-boot-3</relativePath> |  | ||||||
|     </parent> |     </parent> | ||||||
| 
 | 
 | ||||||
|     <dependencies> |     <dependencies> | ||||||
| @ -109,6 +108,7 @@ | |||||||
|     <properties> |     <properties> | ||||||
|         <start-class>com.baeldung.samples.SimpleObservationApplication</start-class> |         <start-class>com.baeldung.samples.SimpleObservationApplication</start-class> | ||||||
|         <p6spy-spring-boot-starter.version>1.9.0</p6spy-spring-boot-starter.version> |         <p6spy-spring-boot-starter.version>1.9.0</p6spy-spring-boot-starter.version> | ||||||
|  |         <java.version>17</java.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
| </project> | </project> | ||||||
|  | |||||||
| @ -9,10 +9,9 @@ | |||||||
|     <description>Demo project for Spring Boot Testing Pitfalls</description> |     <description>Demo project for Spring Boot Testing Pitfalls</description> | ||||||
| 
 | 
 | ||||||
|     <parent> |     <parent> | ||||||
|         <groupId>com.baeldung</groupId> |         <groupId>com.baeldung.spring-boot-modules</groupId> | ||||||
|         <artifactId>parent-boot-3</artifactId> |         <artifactId>spring-boot-modules</artifactId> | ||||||
|         <version>0.0.1-SNAPSHOT</version> |         <version>1.0.0-SNAPSHOT</version> | ||||||
|         <relativePath>../../parent-boot-3</relativePath> |  | ||||||
|     </parent> |     </parent> | ||||||
| 
 | 
 | ||||||
|     <dependencies> |     <dependencies> | ||||||
| @ -82,6 +81,7 @@ | |||||||
|         <org.mapstruct.version>1.5.3.Final</org.mapstruct.version> |         <org.mapstruct.version>1.5.3.Final</org.mapstruct.version> | ||||||
|         <lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version> |         <lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version> | ||||||
|         <maven-surefire-plugin.version>3.0.0-M7</maven-surefire-plugin.version> |         <maven-surefire-plugin.version>3.0.0-M7</maven-surefire-plugin.version> | ||||||
|  |         <java.version>17</java.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
| </project> | </project> | ||||||
|  | |||||||
| @ -9,10 +9,9 @@ | |||||||
|     <description>Testcontainer Improvements in Spring Boot 3</description> |     <description>Testcontainer Improvements in Spring Boot 3</description> | ||||||
| 
 | 
 | ||||||
|     <parent> |     <parent> | ||||||
|         <groupId>com.baeldung</groupId> |         <groupId>com.baeldung.spring-boot-modules</groupId> | ||||||
|         <artifactId>parent-boot-3</artifactId> |         <artifactId>spring-boot-modules</artifactId> | ||||||
|         <version>0.0.1-SNAPSHOT</version> |         <version>1.0.0-SNAPSHOT</version> | ||||||
|         <relativePath>../../parent-boot-3</relativePath> |  | ||||||
|     </parent> |     </parent> | ||||||
| 
 | 
 | ||||||
|     <dependencies> |     <dependencies> | ||||||
| @ -96,6 +95,7 @@ | |||||||
|         <maven-surefire-plugin.version>3.0.0-M7</maven-surefire-plugin.version> |         <maven-surefire-plugin.version>3.0.0-M7</maven-surefire-plugin.version> | ||||||
|         <testcontainers.version>1.18.3</testcontainers.version> |         <testcontainers.version>1.18.3</testcontainers.version> | ||||||
|         <rest-assured.version>5.3.1</rest-assured.version> |         <rest-assured.version>5.3.1</rest-assured.version> | ||||||
|  |         <java.version>17</java.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
| </project> | </project> | ||||||
| @ -9,10 +9,9 @@ | |||||||
|     <description>URL Matching in Spring Boot 3</description> |     <description>URL Matching in Spring Boot 3</description> | ||||||
| 
 | 
 | ||||||
|     <parent> |     <parent> | ||||||
|         <groupId>com.baeldung</groupId> |         <groupId>com.baeldung.spring-boot-modules</groupId> | ||||||
|         <artifactId>parent-boot-3</artifactId> |         <artifactId>spring-boot-modules</artifactId> | ||||||
|         <version>0.0.1-SNAPSHOT</version> |         <version>1.0.0-SNAPSHOT</version> | ||||||
|         <relativePath>../../parent-boot-3</relativePath> |  | ||||||
|     </parent> |     </parent> | ||||||
| 
 | 
 | ||||||
|     <dependencies> |     <dependencies> | ||||||
| @ -46,7 +45,6 @@ | |||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>org.springframework</groupId> |             <groupId>org.springframework</groupId> | ||||||
|             <artifactId>spring-test</artifactId> |             <artifactId>spring-test</artifactId> | ||||||
|             <version>${spring-test.version}</version> |  | ||||||
|             <scope>test</scope> |             <scope>test</scope> | ||||||
|         </dependency> |         </dependency> | ||||||
|         <dependency> |         <dependency> | ||||||
| @ -94,7 +92,6 @@ | |||||||
|     </build> |     </build> | ||||||
| 
 | 
 | ||||||
|     <properties> |     <properties> | ||||||
|         <spring-test.version>6.0.6</spring-test.version> |  | ||||||
|         <javax.servlet-api.version>3.1.0</javax.servlet-api.version> |         <javax.servlet-api.version>3.1.0</javax.servlet-api.version> | ||||||
|         <reactor-core.version>3.6.0</reactor-core.version> |         <reactor-core.version>3.6.0</reactor-core.version> | ||||||
|         <reactor-test.version>3.6.0></reactor-test.version> |         <reactor-test.version>3.6.0></reactor-test.version> | ||||||
|  | |||||||
| @ -9,10 +9,9 @@ | |||||||
|     <description>This is simple boot application for Spring boot actuator test</description> |     <description>This is simple boot application for Spring boot actuator test</description> | ||||||
| 
 | 
 | ||||||
|     <parent> |     <parent> | ||||||
|         <groupId>com.baeldung</groupId> |         <groupId>com.baeldung.spring-boot-modules</groupId> | ||||||
|         <artifactId>parent-boot-3</artifactId> |         <artifactId>spring-boot-modules</artifactId> | ||||||
|         <version>0.0.1-SNAPSHOT</version> |         <version>1.0.0-SNAPSHOT</version> | ||||||
|         <relativePath>../../parent-boot-3</relativePath> |  | ||||||
|     </parent> |     </parent> | ||||||
| 
 | 
 | ||||||
|     <dependencies> |     <dependencies> | ||||||
|  | |||||||
| @ -25,13 +25,13 @@ | |||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>de.codecentric</groupId> |             <groupId>de.codecentric</groupId> | ||||||
|             <artifactId>spring-boot-admin-starter-server</artifactId> |             <artifactId>spring-boot-admin-starter-server</artifactId> | ||||||
|             <version>${spring-boot-admin-server.version}</version> |             <version>${spring-boot.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|         <!--Add login page and logout feature --> |         <!--Add login page and logout feature --> | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>de.codecentric</groupId> |             <groupId>de.codecentric</groupId> | ||||||
|             <artifactId>spring-boot-admin-server-ui-login</artifactId> |             <artifactId>spring-boot-admin-server-ui</artifactId> | ||||||
|             <version>${spring-boot-admin-server-ui-login.version}</version> |             <version>${spring-boot.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>org.springframework.boot</groupId> |             <groupId>org.springframework.boot</groupId> | ||||||
| @ -45,7 +45,7 @@ | |||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>de.codecentric</groupId> |             <groupId>de.codecentric</groupId> | ||||||
|             <artifactId>spring-boot-admin-starter-client</artifactId> |             <artifactId>spring-boot-admin-starter-client</artifactId> | ||||||
|             <version>${spring-boot-admin-starter-client.version}</version> |             <version>${spring-boot.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|         <!--mail notifications --> |         <!--mail notifications --> | ||||||
|         <dependency> |         <dependency> | ||||||
| @ -69,16 +69,8 @@ | |||||||
|             <plugin> |             <plugin> | ||||||
|                 <groupId>org.springframework.boot</groupId> |                 <groupId>org.springframework.boot</groupId> | ||||||
|                 <artifactId>spring-boot-maven-plugin</artifactId> |                 <artifactId>spring-boot-maven-plugin</artifactId> | ||||||
|                 <version>${spring-boot-maven-plugin.version}</version> |  | ||||||
|             </plugin> |             </plugin> | ||||||
|         </plugins> |         </plugins> | ||||||
|     </build> |     </build> | ||||||
| 
 | 
 | ||||||
|     <properties> |  | ||||||
|         <spring-boot-admin-server.version>2.4.1</spring-boot-admin-server.version> |  | ||||||
|         <spring-boot-admin-starter-client.version>2.4.1</spring-boot-admin-starter-client.version> |  | ||||||
|         <spring-boot-admin-server-ui-login.version>1.5.7</spring-boot-admin-server-ui-login.version> |  | ||||||
|         <spring-boot-maven-plugin.version>2.0.4.RELEASE</spring-boot-maven-plugin.version> |  | ||||||
|     </properties> |  | ||||||
| 
 |  | ||||||
| </project> | </project> | ||||||
| @ -5,6 +5,7 @@ import java.util.UUID; | |||||||
| import org.springframework.context.annotation.Bean; | import org.springframework.context.annotation.Bean; | ||||||
| import org.springframework.context.annotation.Configuration; | import org.springframework.context.annotation.Configuration; | ||||||
| import org.springframework.http.HttpMethod; | import org.springframework.http.HttpMethod; | ||||||
|  | import org.springframework.security.config.Customizer; | ||||||
| import org.springframework.security.config.annotation.web.builders.HttpSecurity; | import org.springframework.security.config.annotation.web.builders.HttpSecurity; | ||||||
| import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; | import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; | ||||||
| import org.springframework.security.web.SecurityFilterChain; | import org.springframework.security.web.SecurityFilterChain; | ||||||
| @ -17,6 +18,7 @@ import de.codecentric.boot.admin.server.config.AdminServerProperties; | |||||||
| @Configuration | @Configuration | ||||||
| @EnableWebSecurity | @EnableWebSecurity | ||||||
| public class WebSecurityConfig { | public class WebSecurityConfig { | ||||||
|  | 
 | ||||||
|     private final AdminServerProperties adminServer; |     private final AdminServerProperties adminServer; | ||||||
| 
 | 
 | ||||||
|     public WebSecurityConfig(AdminServerProperties adminServer) { |     public WebSecurityConfig(AdminServerProperties adminServer) { | ||||||
| @ -29,32 +31,24 @@ public class WebSecurityConfig { | |||||||
|         successHandler.setTargetUrlParameter("redirectTo"); |         successHandler.setTargetUrlParameter("redirectTo"); | ||||||
|         successHandler.setDefaultTargetUrl(this.adminServer.getContextPath() + "/"); |         successHandler.setDefaultTargetUrl(this.adminServer.getContextPath() + "/"); | ||||||
| 
 | 
 | ||||||
|         http.authorizeRequests() |         http.authorizeHttpRequests(req -> req.requestMatchers(this.adminServer.getContextPath() + "/assets/**") | ||||||
|             .antMatchers(this.adminServer.getContextPath() + "/assets/**") |                 .permitAll() | ||||||
|             .permitAll() |                 .requestMatchers(this.adminServer.getContextPath() + "/login") | ||||||
|             .antMatchers(this.adminServer.getContextPath() + "/login") |                 .permitAll() | ||||||
|             .permitAll() |                 .anyRequest() | ||||||
|             .anyRequest() |                 .authenticated()) | ||||||
|             .authenticated() |             .formLogin(formLogin -> formLogin.loginPage(this.adminServer.getContextPath() + "/login") | ||||||
|             .and() |                 .successHandler(successHandler)) | ||||||
|             .formLogin() |             .logout((logout) -> logout.logoutUrl(this.adminServer.getContextPath() + "/logout")) | ||||||
|             .loginPage(this.adminServer.getContextPath() + "/login") |             .httpBasic(Customizer.withDefaults()) | ||||||
|             .successHandler(successHandler) |             .csrf(csrf -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) | ||||||
|             .and() |                 .ignoringRequestMatchers( | ||||||
|             .logout() |                     new AntPathRequestMatcher(this.adminServer.getContextPath() + "/instances", HttpMethod.POST.toString()), | ||||||
|             .logoutUrl(this.adminServer.getContextPath() + "/logout") |                     new AntPathRequestMatcher(this.adminServer.getContextPath() + "/instances/*", HttpMethod.DELETE.toString()), | ||||||
|             .and() |                     new AntPathRequestMatcher(this.adminServer.getContextPath() + "/actuator/**"))) | ||||||
|             .httpBasic() |             .rememberMe(rememberMe -> rememberMe.key(UUID.randomUUID() | ||||||
|             .and() |                     .toString()) | ||||||
|             .csrf() |                 .tokenValiditySeconds(1209600)); | ||||||
|             .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) |  | ||||||
|             .ignoringRequestMatchers(new AntPathRequestMatcher(this.adminServer.getContextPath() + "/instances", HttpMethod.POST.toString()), new AntPathRequestMatcher(this.adminServer.getContextPath() + "/instances/*", HttpMethod.DELETE.toString()), |  | ||||||
|                 new AntPathRequestMatcher(this.adminServer.getContextPath() + "/actuator/**")) |  | ||||||
|             .and() |  | ||||||
|             .rememberMe() |  | ||||||
|             .key(UUID.randomUUID() |  | ||||||
|                 .toString()) |  | ||||||
|             .tokenValiditySeconds(1209600); |  | ||||||
|         return http.build(); |         return http.build(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -52,7 +52,7 @@ public class WebSecurityConfigIntegrationTest { | |||||||
|           .password("admin")); |           .password("admin")); | ||||||
| 
 | 
 | ||||||
|         mockMvc |         mockMvc | ||||||
|           .perform(get("/applications/")) |           .perform(get("/applications")) | ||||||
|           .andExpect(status().is2xxSuccessful()); |           .andExpect(status().is2xxSuccessful()); | ||||||
| 
 | 
 | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -49,4 +49,8 @@ | |||||||
|         </plugins> |         </plugins> | ||||||
|     </build> |     </build> | ||||||
| 
 | 
 | ||||||
|  |     <properties> | ||||||
|  |         <start-class>com.baeldung.Application</start-class> | ||||||
|  |     </properties> | ||||||
|  | 
 | ||||||
| </project> | </project> | ||||||
| @ -1,9 +1,9 @@ | |||||||
| package com.baeldung.application.entities; | package com.baeldung.application.entities; | ||||||
| 
 | 
 | ||||||
| import javax.persistence.Entity; | import jakarta.persistence.Entity; | ||||||
| import javax.persistence.GeneratedValue; | import jakarta.persistence.GeneratedValue; | ||||||
| import javax.persistence.GenerationType; | import jakarta.persistence.GenerationType; | ||||||
| import javax.persistence.Id; | import jakarta.persistence.Id; | ||||||
| 
 | 
 | ||||||
| @Entity | @Entity | ||||||
| public class User { | public class User { | ||||||
|  | |||||||
| @ -1,5 +1,22 @@ | |||||||
| package com.baeldung.ecommerce.controller; | package com.baeldung.ecommerce.controller; | ||||||
| 
 | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Objects; | ||||||
|  | import java.util.stream.Collectors; | ||||||
|  | 
 | ||||||
|  | import org.springframework.http.HttpHeaders; | ||||||
|  | import org.springframework.http.HttpStatus; | ||||||
|  | import org.springframework.http.ResponseEntity; | ||||||
|  | import org.springframework.util.CollectionUtils; | ||||||
|  | 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.RequestMapping; | ||||||
|  | import org.springframework.web.bind.annotation.ResponseStatus; | ||||||
|  | import org.springframework.web.bind.annotation.RestController; | ||||||
|  | import org.springframework.web.servlet.support.ServletUriComponentsBuilder; | ||||||
|  | 
 | ||||||
| import com.baeldung.ecommerce.dto.OrderProductDto; | import com.baeldung.ecommerce.dto.OrderProductDto; | ||||||
| import com.baeldung.ecommerce.exception.ResourceNotFoundException; | import com.baeldung.ecommerce.exception.ResourceNotFoundException; | ||||||
| import com.baeldung.ecommerce.model.Order; | import com.baeldung.ecommerce.model.Order; | ||||||
| @ -8,18 +25,8 @@ import com.baeldung.ecommerce.model.OrderStatus; | |||||||
| import com.baeldung.ecommerce.service.OrderProductService; | import com.baeldung.ecommerce.service.OrderProductService; | ||||||
| import com.baeldung.ecommerce.service.OrderService; | import com.baeldung.ecommerce.service.OrderService; | ||||||
| import com.baeldung.ecommerce.service.ProductService; | import com.baeldung.ecommerce.service.ProductService; | ||||||
| import org.springframework.http.HttpHeaders; |  | ||||||
| import org.springframework.http.HttpStatus; |  | ||||||
| import org.springframework.http.ResponseEntity; |  | ||||||
| import org.springframework.util.CollectionUtils; |  | ||||||
| import org.springframework.web.bind.annotation.*; |  | ||||||
| import org.springframework.web.servlet.support.ServletUriComponentsBuilder; |  | ||||||
| 
 | 
 | ||||||
| import javax.validation.constraints.NotNull; | import jakarta.validation.constraints.NotNull; | ||||||
| import java.util.ArrayList; |  | ||||||
| import java.util.List; |  | ||||||
| import java.util.Objects; |  | ||||||
| import java.util.stream.Collectors; |  | ||||||
| 
 | 
 | ||||||
| @RestController | @RestController | ||||||
| @RequestMapping("/api/orders") | @RequestMapping("/api/orders") | ||||||
|  | |||||||
| @ -1,12 +1,13 @@ | |||||||
| package com.baeldung.ecommerce.controller; | package com.baeldung.ecommerce.controller; | ||||||
| 
 | 
 | ||||||
| import com.baeldung.ecommerce.model.Product; |  | ||||||
| import com.baeldung.ecommerce.service.ProductService; |  | ||||||
| import org.springframework.web.bind.annotation.GetMapping; | import org.springframework.web.bind.annotation.GetMapping; | ||||||
| import org.springframework.web.bind.annotation.RequestMapping; | import org.springframework.web.bind.annotation.RequestMapping; | ||||||
| import org.springframework.web.bind.annotation.RestController; | import org.springframework.web.bind.annotation.RestController; | ||||||
| 
 | 
 | ||||||
| import javax.validation.constraints.NotNull; | import com.baeldung.ecommerce.model.Product; | ||||||
|  | import com.baeldung.ecommerce.service.ProductService; | ||||||
|  | 
 | ||||||
|  | import jakarta.validation.constraints.NotNull; | ||||||
| 
 | 
 | ||||||
| @RestController | @RestController | ||||||
| @RequestMapping("/api/products") | @RequestMapping("/api/products") | ||||||
|  | |||||||
| @ -6,8 +6,8 @@ import org.springframework.http.ResponseEntity; | |||||||
| import org.springframework.web.bind.annotation.ExceptionHandler; | import org.springframework.web.bind.annotation.ExceptionHandler; | ||||||
| import org.springframework.web.bind.annotation.RestControllerAdvice; | import org.springframework.web.bind.annotation.RestControllerAdvice; | ||||||
| 
 | 
 | ||||||
| import javax.validation.ConstraintViolation; | import jakarta.validation.ConstraintViolation; | ||||||
| import javax.validation.ConstraintViolationException; | import jakarta.validation.ConstraintViolationException; | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,16 +1,22 @@ | |||||||
| package com.baeldung.ecommerce.model; | package com.baeldung.ecommerce.model; | ||||||
| 
 | 
 | ||||||
| import com.fasterxml.jackson.annotation.JsonFormat; |  | ||||||
| import com.fasterxml.jackson.annotation.JsonIdentityInfo; |  | ||||||
| import com.fasterxml.jackson.annotation.JsonManagedReference; |  | ||||||
| import com.fasterxml.jackson.annotation.ObjectIdGenerators; |  | ||||||
| 
 |  | ||||||
| import javax.persistence.*; |  | ||||||
| import javax.validation.Valid; |  | ||||||
| import java.time.LocalDate; | import java.time.LocalDate; | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| 
 | 
 | ||||||
|  | import com.fasterxml.jackson.annotation.JsonFormat; | ||||||
|  | import com.fasterxml.jackson.annotation.JsonIdentityInfo; | ||||||
|  | import com.fasterxml.jackson.annotation.ObjectIdGenerators; | ||||||
|  | 
 | ||||||
|  | import jakarta.persistence.Entity; | ||||||
|  | import jakarta.persistence.GeneratedValue; | ||||||
|  | import jakarta.persistence.GenerationType; | ||||||
|  | import jakarta.persistence.Id; | ||||||
|  | import jakarta.persistence.OneToMany; | ||||||
|  | import jakarta.persistence.Table; | ||||||
|  | import jakarta.persistence.Transient; | ||||||
|  | import jakarta.validation.Valid; | ||||||
|  | 
 | ||||||
| @Entity | @Entity | ||||||
| @Table(name = "orders") | @Table(name = "orders") | ||||||
| @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="orderProducts") | @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="orderProducts") | ||||||
|  | |||||||
| @ -2,10 +2,10 @@ package com.baeldung.ecommerce.model; | |||||||
| 
 | 
 | ||||||
| import com.fasterxml.jackson.annotation.JsonIgnore; | import com.fasterxml.jackson.annotation.JsonIgnore; | ||||||
| 
 | 
 | ||||||
| import javax.persistence.Column; | import jakarta.persistence.Column; | ||||||
| import javax.persistence.EmbeddedId; | import jakarta.persistence.EmbeddedId; | ||||||
| import javax.persistence.Entity; | import jakarta.persistence.Entity; | ||||||
| import javax.persistence.Transient; | import jakarta.persistence.Transient; | ||||||
| 
 | 
 | ||||||
| @Entity | @Entity | ||||||
| public class OrderProduct { | public class OrderProduct { | ||||||
|  | |||||||
| @ -1,13 +1,14 @@ | |||||||
| package com.baeldung.ecommerce.model; | package com.baeldung.ecommerce.model; | ||||||
| 
 | 
 | ||||||
|  | import java.io.Serializable; | ||||||
|  | 
 | ||||||
| import com.fasterxml.jackson.annotation.JsonIdentityInfo; | import com.fasterxml.jackson.annotation.JsonIdentityInfo; | ||||||
| import com.fasterxml.jackson.annotation.ObjectIdGenerators; | import com.fasterxml.jackson.annotation.ObjectIdGenerators; | ||||||
| 
 | 
 | ||||||
| import javax.persistence.Embeddable; | import jakarta.persistence.Embeddable; | ||||||
| import javax.persistence.FetchType; | import jakarta.persistence.FetchType; | ||||||
| import javax.persistence.JoinColumn; | import jakarta.persistence.JoinColumn; | ||||||
| import javax.persistence.ManyToOne; | import jakarta.persistence.ManyToOne; | ||||||
| import java.io.Serializable; |  | ||||||
| 
 | 
 | ||||||
| @Embeddable | @Embeddable | ||||||
| @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "order") | @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "order") | ||||||
|  | |||||||
| @ -1,7 +1,11 @@ | |||||||
| package com.baeldung.ecommerce.model; | package com.baeldung.ecommerce.model; | ||||||
| 
 | 
 | ||||||
| import javax.persistence.*; | import jakarta.persistence.Basic; | ||||||
| import javax.validation.constraints.NotNull; | import jakarta.persistence.Entity; | ||||||
|  | import jakarta.persistence.GeneratedValue; | ||||||
|  | import jakarta.persistence.GenerationType; | ||||||
|  | import jakarta.persistence.Id; | ||||||
|  | import jakarta.validation.constraints.NotNull; | ||||||
| 
 | 
 | ||||||
| @Entity | @Entity | ||||||
| public class Product { | public class Product { | ||||||
|  | |||||||
| @ -1,10 +1,11 @@ | |||||||
| package com.baeldung.ecommerce.service; | package com.baeldung.ecommerce.service; | ||||||
| 
 | 
 | ||||||
| import com.baeldung.ecommerce.model.OrderProduct; |  | ||||||
| import org.springframework.validation.annotation.Validated; | import org.springframework.validation.annotation.Validated; | ||||||
| 
 | 
 | ||||||
| import javax.validation.Valid; | import com.baeldung.ecommerce.model.OrderProduct; | ||||||
| import javax.validation.constraints.NotNull; | 
 | ||||||
|  | import jakarta.validation.Valid; | ||||||
|  | import jakarta.validation.constraints.NotNull; | ||||||
| 
 | 
 | ||||||
| @Validated | @Validated | ||||||
| public interface OrderProductService { | public interface OrderProductService { | ||||||
|  | |||||||
| @ -1,10 +1,11 @@ | |||||||
| package com.baeldung.ecommerce.service; | package com.baeldung.ecommerce.service; | ||||||
| 
 | 
 | ||||||
| import com.baeldung.ecommerce.model.Order; |  | ||||||
| import org.springframework.validation.annotation.Validated; | import org.springframework.validation.annotation.Validated; | ||||||
| 
 | 
 | ||||||
| import javax.validation.Valid; | import com.baeldung.ecommerce.model.Order; | ||||||
| import javax.validation.constraints.NotNull; | 
 | ||||||
|  | import jakarta.validation.Valid; | ||||||
|  | import jakarta.validation.constraints.NotNull; | ||||||
| 
 | 
 | ||||||
| @Validated | @Validated | ||||||
| public interface OrderService { | public interface OrderService { | ||||||
|  | |||||||
| @ -1,10 +1,11 @@ | |||||||
| package com.baeldung.ecommerce.service; | package com.baeldung.ecommerce.service; | ||||||
| 
 | 
 | ||||||
| import com.baeldung.ecommerce.model.Product; |  | ||||||
| import org.springframework.validation.annotation.Validated; | import org.springframework.validation.annotation.Validated; | ||||||
| 
 | 
 | ||||||
| import javax.validation.constraints.Min; | import com.baeldung.ecommerce.model.Product; | ||||||
| import javax.validation.constraints.NotNull; | 
 | ||||||
|  | import jakarta.validation.constraints.Min; | ||||||
|  | import jakarta.validation.constraints.NotNull; | ||||||
| 
 | 
 | ||||||
| @Validated | @Validated | ||||||
| public interface ProductService { | public interface ProductService { | ||||||
|  | |||||||
| @ -1,37 +1,37 @@ | |||||||
| package com.baeldung.ecommerce; | package com.baeldung.ecommerce; | ||||||
| 
 | 
 | ||||||
|  | import static org.hamcrest.CoreMatchers.is; | ||||||
|  | import static org.hamcrest.MatcherAssert.assertThat; | ||||||
|  | import static org.hamcrest.Matchers.hasItem; | ||||||
|  | import static org.hamcrest.Matchers.hasProperty; | ||||||
|  | import static org.junit.jupiter.api.Assertions.assertEquals; | ||||||
|  | 
 | ||||||
|  | import java.util.Collections; | ||||||
|  | 
 | ||||||
|  | import org.assertj.core.api.Assertions; | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | import org.springframework.beans.factory.annotation.Autowired; | ||||||
|  | import org.springframework.boot.test.context.SpringBootTest; | ||||||
|  | import org.springframework.boot.test.web.client.TestRestTemplate; | ||||||
|  | import org.springframework.boot.test.web.server.LocalServerPort; | ||||||
|  | import org.springframework.core.ParameterizedTypeReference; | ||||||
|  | import org.springframework.http.HttpMethod; | ||||||
|  | import org.springframework.http.HttpStatus; | ||||||
|  | import org.springframework.http.ResponseEntity; | ||||||
|  | 
 | ||||||
| import com.baeldung.ecommerce.controller.OrderController; | import com.baeldung.ecommerce.controller.OrderController; | ||||||
| import com.baeldung.ecommerce.controller.ProductController; | import com.baeldung.ecommerce.controller.ProductController; | ||||||
| import com.baeldung.ecommerce.dto.OrderProductDto; | import com.baeldung.ecommerce.dto.OrderProductDto; | ||||||
| import com.baeldung.ecommerce.model.Order; | import com.baeldung.ecommerce.model.Order; | ||||||
| import com.baeldung.ecommerce.model.Product; | import com.baeldung.ecommerce.model.Product; | ||||||
| import org.assertj.core.api.Assertions; |  | ||||||
| import org.junit.Test; |  | ||||||
| import org.junit.runner.RunWith; |  | ||||||
| import org.springframework.beans.factory.annotation.Autowired; |  | ||||||
| import org.springframework.boot.test.context.SpringBootTest; |  | ||||||
| import org.springframework.boot.test.web.client.TestRestTemplate; |  | ||||||
| import org.springframework.boot.web.server.LocalServerPort; |  | ||||||
| import org.springframework.core.ParameterizedTypeReference; |  | ||||||
| import org.springframework.http.HttpMethod; |  | ||||||
| import org.springframework.http.HttpStatus; |  | ||||||
| import org.springframework.http.ResponseEntity; |  | ||||||
| import org.springframework.test.context.junit4.SpringRunner; |  | ||||||
| 
 | 
 | ||||||
| import java.util.Collections; |  | ||||||
| 
 |  | ||||||
| import static org.hamcrest.CoreMatchers.is; |  | ||||||
| import static org.hamcrest.MatcherAssert.assertThat; |  | ||||||
| import static org.hamcrest.Matchers.hasItem; |  | ||||||
| import static org.hamcrest.Matchers.hasProperty; |  | ||||||
| 
 |  | ||||||
| @RunWith(SpringRunner.class) |  | ||||||
| @SpringBootTest(classes = { EcommerceApplication.class }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) | @SpringBootTest(classes = { EcommerceApplication.class }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) | ||||||
| public class EcommerceApplicationIntegrationTest { | public class EcommerceApplicationIntegrationTest { | ||||||
| 
 | 
 | ||||||
|     @Autowired private TestRestTemplate restTemplate; |     @Autowired private TestRestTemplate restTemplate; | ||||||
| 
 | 
 | ||||||
|     @LocalServerPort private int port; |     @LocalServerPort | ||||||
|  |     private int port; | ||||||
| 
 | 
 | ||||||
|     @Autowired private ProductController productController; |     @Autowired private ProductController productController; | ||||||
| 
 | 
 | ||||||
| @ -80,9 +80,7 @@ public class EcommerceApplicationIntegrationTest { | |||||||
|     public void givenPostOrder_whenBodyRequestMatcherJson_thenResponseContainsEqualObjectProperties() { |     public void givenPostOrder_whenBodyRequestMatcherJson_thenResponseContainsEqualObjectProperties() { | ||||||
|         final ResponseEntity<Order> postResponse = restTemplate.postForEntity("http://localhost:" + port + "/api/orders", prepareOrderForm(), Order.class); |         final ResponseEntity<Order> postResponse = restTemplate.postForEntity("http://localhost:" + port + "/api/orders", prepareOrderForm(), Order.class); | ||||||
|         Order order = postResponse.getBody(); |         Order order = postResponse.getBody(); | ||||||
|         Assertions |         assertEquals(HttpStatus.CREATED, postResponse.getStatusCode()); | ||||||
|           .assertThat(postResponse.getStatusCode()) |  | ||||||
|           .isEqualByComparingTo(HttpStatus.CREATED); |  | ||||||
| 
 | 
 | ||||||
|         assertThat(order, hasProperty("status", is("PAID"))); |         assertThat(order, hasProperty("status", is("PAID"))); | ||||||
|         assertThat(order.getOrderProducts(), hasItem(hasProperty("quantity", is(2)))); |         assertThat(order.getOrderProducts(), hasItem(hasProperty("quantity", is(2)))); | ||||||
|  | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user