Merge branch 'eugenp:master' into master
This commit is contained in:
		
						commit
						a0c85c2a5a
					
				| @ -12,7 +12,8 @@ This module contains articles about Apache Kafka. | ||||
| - [Kafka Connect Example with MQTT and MongoDB](https://www.baeldung.com/kafka-connect-mqtt-mongodb) | ||||
| - [Building a Data Pipeline with Flink and Kafka](https://www.baeldung.com/kafka-flink-data-pipeline) | ||||
| - [Exactly Once Processing in Kafka with Java](https://www.baeldung.com/kafka-exactly-once) | ||||
| - [Custom Serializers in Apache Kafka](https://www.baeldung.com/kafka-custom-serializer) | ||||
| 
 | ||||
| 
 | ||||
| ##### Building the project | ||||
| You can build the project from the command line using: *mvn clean install*, or in an IDE. | ||||
| You can build the project from the command line using: *mvn clean install*, or in an IDE. | ||||
|  | ||||
| @ -133,6 +133,11 @@ | ||||
|             <artifactId>jackson-databind</artifactId> | ||||
|             <version>${jackson.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>com.fasterxml.jackson.core</groupId> | ||||
|             <artifactId>jackson-annotations</artifactId> | ||||
|             <version>${jackson.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>com.jayway.awaitility</groupId> | ||||
|             <artifactId>awaitility</artifactId> | ||||
|  | ||||
							
								
								
									
										3181
									
								
								apache-libraries/src/main/resources/models/en-lemmatizer.dict
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3181
									
								
								apache-libraries/src/main/resources/models/en-lemmatizer.dict
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -10,7 +10,6 @@ import com.baeldung.apache.beam.intro.WordCount; | ||||
| public class WordCountUnitTest { | ||||
|      | ||||
|     @Test | ||||
|     // @Ignore | ||||
|     public void givenInputFile_whenWordCountRuns_thenJobFinishWithoutError() { | ||||
|         boolean jobDone = WordCount.wordCount("src/test/resources/wordcount.txt", "target/output"); | ||||
|         assertTrue(jobDone); | ||||
|  | ||||
| @ -2,3 +2,4 @@ | ||||
| 
 | ||||
| - [String API Updates in Java 12](https://www.baeldung.com/java12-string-api) | ||||
| - [New Features in Java 12](https://www.baeldung.com/java-12-new-features) | ||||
| - [Compare the Content of Two Files in Java](https://www.baeldung.com/java-compare-files) | ||||
|  | ||||
| @ -0,0 +1,49 @@ | ||||
| package com.baeldung.java_16_features.mapmulti; | ||||
| 
 | ||||
| import java.util.List; | ||||
| import java.util.function.Consumer; | ||||
| import java.util.stream.Collectors; | ||||
| 
 | ||||
| import org.apache.commons.lang3.tuple.ImmutablePair; | ||||
| import org.apache.commons.lang3.tuple.Pair; | ||||
| 
 | ||||
| public class Album { | ||||
| 
 | ||||
|     private String albumName; | ||||
|     private int albumCost; | ||||
|     private List<Artist> artists; | ||||
| 
 | ||||
|     Album(String name, int albumCost, List<Artist> artists) { | ||||
|         this.albumName = name; | ||||
|         this.artists = artists; | ||||
|         this.albumCost = albumCost; | ||||
|     } | ||||
| 
 | ||||
|     public void artistAlbumPairsToMajorLabels(Consumer<Pair<String, String>> consumer) { | ||||
| 
 | ||||
|         for (Artist artist : artists) { | ||||
|             if (artist.isAssociatedMajorLabels()) { | ||||
|                 String concatLabels = artist.getMajorLabels() | ||||
|                     .stream() | ||||
|                     .collect(Collectors.joining(",")); | ||||
|                 consumer.accept(new ImmutablePair<>(artist.getName() + ":" + albumName, concatLabels)); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public String getAlbumName() { | ||||
|         return albumName; | ||||
|     } | ||||
| 
 | ||||
|     public int getAlbumCost() { | ||||
|         return albumCost; | ||||
|     } | ||||
| 
 | ||||
|     List<Artist> getArtists() { | ||||
|         return artists; | ||||
|     } | ||||
| 
 | ||||
|     public String toString() { | ||||
|         return albumName; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,50 @@ | ||||
| package com.baeldung.java_16_features.mapmulti; | ||||
| 
 | ||||
| import java.util.List; | ||||
| import java.util.Objects; | ||||
| 
 | ||||
| public class Artist { | ||||
| 
 | ||||
|     private final String name; | ||||
|     private boolean associatedMajorLabels; | ||||
|     private List<String> majorLabels; | ||||
| 
 | ||||
|     Artist(String name, boolean associatedMajorLabels, List<String> majorLabels) { | ||||
|         this.name = name; | ||||
|         this.associatedMajorLabels = associatedMajorLabels; | ||||
|         this.majorLabels = majorLabels; | ||||
|     } | ||||
| 
 | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
| 
 | ||||
|     public boolean isAssociatedMajorLabels() { | ||||
|         return associatedMajorLabels; | ||||
|     } | ||||
| 
 | ||||
|     public List<String> getMajorLabels() { | ||||
|         return majorLabels; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public int hashCode() { | ||||
|         return Objects.hash(name); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public boolean equals(Object obj) { | ||||
|         if (this == obj) | ||||
|             return true; | ||||
|         if (obj == null) | ||||
|             return false; | ||||
|         if (getClass() != obj.getClass()) | ||||
|             return false; | ||||
|         Artist other = (Artist) obj; | ||||
|         return Objects.equals(name, other.name); | ||||
|     } | ||||
| 
 | ||||
|     public String toString() { | ||||
|         return name; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,134 @@ | ||||
| package com.baeldung.java_16_features.mapmulti; | ||||
| 
 | ||||
| import static java.util.stream.Collectors.toList; | ||||
| import static org.assertj.core.api.Assertions.assertThat; | ||||
| import static org.assertj.core.api.Assertions.offset; | ||||
| import static org.junit.jupiter.api.Assertions.assertTrue; | ||||
| 
 | ||||
| import java.util.Arrays; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import org.apache.commons.lang3.tuple.ImmutablePair; | ||||
| import org.apache.commons.lang3.tuple.Pair; | ||||
| import org.junit.jupiter.api.Test; | ||||
| 
 | ||||
| public class JavaStreamMapMultiUnitTest { | ||||
| 
 | ||||
|     private static final List<Album> albums = Arrays.asList(new Album("album1", 10, Arrays.asList(new Artist("bob", true, Arrays.asList("label1", "label3")), new Artist("tom", true, Arrays.asList("label2", "label3")))), | ||||
|         new Album("album2", 20, Arrays.asList(new Artist("bill", true, Arrays.asList("label2", "label3")), new Artist("tom", true, Arrays.asList("label2", "label4"))))); | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenAListOfintegers_whenMapMulti_thenGetListOfOfEvenDoublesPlusPercentage() { | ||||
| 
 | ||||
|         List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5); | ||||
|         double percentage = .01; | ||||
|         List<Double> evenDoubles = integers.stream() | ||||
|             .<Double> mapMulti((integer, consumer) -> { | ||||
|                 if (integer % 2 == 0) { | ||||
|                     consumer.accept((double) integer * (1 + percentage)); | ||||
|                 } | ||||
|             }) | ||||
|             .collect(toList()); | ||||
| 
 | ||||
|         assertThat(evenDoubles).containsAll(Arrays.asList(2.02D, 4.04D)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenAListOfintegers_whenFilterMap_thenGetListOfOfEvenDoublesPlusPercentage() { | ||||
| 
 | ||||
|         List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5); | ||||
|         double percentage = .01; | ||||
|         List<Double> evenDoubles = integers.stream() | ||||
|             .filter(integer -> integer % 2 == 0) | ||||
|             .<Double> map(integer -> ((double) integer * (1 + percentage))) | ||||
|             .collect(toList()); | ||||
| 
 | ||||
|         assertThat(evenDoubles).containsAll(Arrays.asList(2.02D, 4.04D)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenAListOfintegers_whenMapMultiToDouble_thenGetSumOfEvenNumbersAfterApplyPercentage() { | ||||
| 
 | ||||
|         List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6, 7); | ||||
|         double percentage = .01; | ||||
|         double sum = integers.stream() | ||||
|             .mapMultiToDouble((integer, consumer) -> { | ||||
|                 if (integer % 2 == 0) { | ||||
|                     consumer.accept(integer * (1 + percentage)); | ||||
|                 } | ||||
|             }) | ||||
|             .sum(); | ||||
| 
 | ||||
|         assertThat(sum).isEqualTo(12.12, offset(0.001d)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenAListOfAlbums_whenFlatMap_thenGetListOfArtistAlbumPairs() { | ||||
| 
 | ||||
|         List<Pair<String, String>> artistAlbum = albums.stream() | ||||
|             .flatMap(album -> album.getArtists() | ||||
|                 .stream() | ||||
|                 .map(artist -> new ImmutablePair<String, String>(artist.getName(), album.getAlbumName()))) | ||||
|             .collect(toList()); | ||||
| 
 | ||||
|         assertThat(artistAlbum).contains(new ImmutablePair<String, String>("bob", "album1"), new ImmutablePair<String,  | ||||
|             String>("tom", "album1"), new ImmutablePair<String, String>("bill", "album2"), new ImmutablePair<String, String>("tom", "album2")); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenAListOfAlbums_whenMapMulti_thenGetListOfPairsOfArtistAlbum() { | ||||
| 
 | ||||
|         List<Pair<String, String>> artistAlbum = albums.stream() | ||||
|             .<Pair<String, String>> mapMulti((album, consumer) -> { | ||||
|                 for (Artist artist : album.getArtists()) { | ||||
|                     consumer.accept(new ImmutablePair<String, String>(artist.getName(), album.getAlbumName())); | ||||
|                 } | ||||
|             }) | ||||
|             .collect(toList()); | ||||
| 
 | ||||
|         assertThat(artistAlbum).contains(new ImmutablePair<String, String>("bob", "album1"), new ImmutablePair<String, String>("tom", "album1"),  | ||||
|             new ImmutablePair<String, String>("bill", "album2"), new ImmutablePair<String, String>("tom", "album2")); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenAListOfAlbums_whenFlatMap_thenGetListOfArtistAlbumjPairsBelowGivenCost() { | ||||
| 
 | ||||
|         int upperCost = 9; | ||||
|         List<Pair<String, String>> artistAlbum = albums.stream() | ||||
|             .flatMap(album -> album.getArtists() | ||||
|                 .stream() | ||||
|                 .filter(artist -> upperCost > album.getAlbumCost()) | ||||
|                 .map(artist -> new ImmutablePair<String, String>(artist.getName(), album.getAlbumName()))) | ||||
|             .collect(toList()); | ||||
| 
 | ||||
|         assertTrue(artistAlbum.isEmpty()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenAListOfAlbums_whenMapMulti_thenGetListOfArtistAlbumPairsBelowGivenCost() { | ||||
| 
 | ||||
|         int upperCost = 9; | ||||
|         List<Pair<String, String>> artistAlbum = albums.stream() | ||||
|             .<Pair<String, String>> mapMulti((album, consumer) -> { | ||||
|                 if (album.getAlbumCost() < upperCost) { | ||||
|                     for (Artist artist : album.getArtists()) { | ||||
|                         consumer.accept(new ImmutablePair<String, String>(artist.getName(), album.getAlbumName())); | ||||
|                     } | ||||
|                 } | ||||
|             }) | ||||
|             .collect(toList()); | ||||
| 
 | ||||
|         assertTrue(artistAlbum.isEmpty()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenAListOfAlbums_whenMapMulti_thenGetPairsOfArtistMajorLabelsUsingMethodReference() { | ||||
| 
 | ||||
|         List<Pair<String, String>> artistLabels = albums.stream() | ||||
|             .mapMulti(Album::artistAlbumPairsToMajorLabels) | ||||
|             .collect(toList()); | ||||
| 
 | ||||
|         assertThat(artistLabels).contains(new ImmutablePair<String, String>("bob:album1", "label1,label3"), new ImmutablePair<String, String>("tom:album1", "label2,label3"),  | ||||
|             new ImmutablePair<String, String>("bill:album2", "label2,label3"), new ImmutablePair<String, String>("tom:album2", "label2,label4")); | ||||
|     } | ||||
| } | ||||
| @ -11,3 +11,4 @@ This module contains articles about parsing and formatting Java date and time ob | ||||
| - [Display All Time Zones With GMT And UTC in Java](http://www.baeldung.com/java-time-zones) | ||||
| - [Convert between String and Timestamp](https://www.baeldung.com/java-string-to-timestamp) | ||||
| - [Convert String to Date in Java](http://www.baeldung.com/java-string-to-date) | ||||
| - [Format a Milliseconds Duration to HH:MM:SS](https://www.baeldung.com/java-ms-to-hhmmss) | ||||
|  | ||||
| @ -75,7 +75,7 @@ | ||||
| 
 | ||||
|     <properties> | ||||
|         <commons-validator.version>1.6</commons-validator.version> | ||||
|         <joda-time.version>2.10</joda-time.version> | ||||
|         <joda-time.version>2.10.10</joda-time.version> | ||||
|         <!-- testing --> | ||||
|         <assertj.version>3.6.1</assertj.version> | ||||
|         <maven.compiler.source>1.9</maven.compiler.source> | ||||
|  | ||||
| @ -0,0 +1,54 @@ | ||||
| package com.baeldung.formatduration; | ||||
| 
 | ||||
| import org.apache.commons.lang3.time.DurationFormatUtils; | ||||
| import org.joda.time.Period; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| import java.time.Duration; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| 
 | ||||
| import static org.assertj.core.api.Assertions.assertThat; | ||||
| 
 | ||||
| public class FormatDurationUnitTest { | ||||
| 
 | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenInterval_WhenFormatInterval_formatDuration() { | ||||
|         long HH = TimeUnit.MILLISECONDS.toHours(38114000); | ||||
|         long MM = TimeUnit.MILLISECONDS.toMinutes(38114000) % 60; | ||||
|         long SS = TimeUnit.MILLISECONDS.toSeconds(38114000) % 60; | ||||
|         String timeInHHMMSS = String.format("%02d:%02d:%02d", HH, MM, SS); | ||||
| 
 | ||||
|         assertThat(timeInHHMMSS).isEqualTo("10:35:14"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenInterval_WhenFormatUsingDuration_formatDuration() { | ||||
|         Duration duration = Duration.ofMillis(38114000); | ||||
|         long seconds = duration.getSeconds(); | ||||
|         long HH = seconds / 3600; | ||||
|         long MM = (seconds % 3600) / 60; | ||||
|         long SS = seconds % 60; | ||||
|         String timeInHHMMSS =  String.format("%02d:%02d:%02d", HH, MM, SS); | ||||
|         assertThat(timeInHHMMSS).isEqualTo("10:35:14"); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenInterval_WhenFormatDurationUsingApacheCommons_formatDuration() { | ||||
|         assertThat(DurationFormatUtils.formatDuration(38114000, "HH:mm:ss")) | ||||
|           .isEqualTo("10:35:14"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenInterval_WhenFormatDurationUsingJodaTime_formatDuration() { | ||||
|         org.joda.time.Duration duration = new org.joda.time.Duration(38114000); | ||||
|         Period period = duration.toPeriod(); | ||||
|         long HH = period.getHours(); | ||||
|         long MM = period.getMinutes(); | ||||
|         long SS = period.getSeconds(); | ||||
| 
 | ||||
|         String timeInHHMMSS = String.format("%02d:%02d:%02d", HH, MM, SS); | ||||
|         assertThat(timeInHHMMSS).isEqualTo("10:35:14"); | ||||
|     } | ||||
| } | ||||
| @ -8,4 +8,5 @@ This module contains articles about networking in Java | ||||
| - [Downloading Email Attachments in Java](https://www.baeldung.com/java-download-email-attachments) | ||||
| - [Connection Timeout vs. Read Timeout for Java Sockets](https://www.baeldung.com/java-socket-connection-read-timeout) | ||||
| - [Find Whether an IP Address Is in the Specified Range or Not in Java](https://www.baeldung.com/java-check-ip-address-range) | ||||
| - [Find the IP Address of a Client Connected to a Server](https://www.baeldung.com/java-client-get-ip-address) | ||||
| - [[<-- Prev]](/core-java-modules/core-java-networking-2) | ||||
|  | ||||
| @ -0,0 +1,39 @@ | ||||
| package com.baeldung.clientaddress; | ||||
| 
 | ||||
| import java.io.BufferedReader; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStreamReader; | ||||
| import java.io.PrintWriter; | ||||
| import java.net.Socket; | ||||
| 
 | ||||
| public class ApplicationClient { | ||||
| 
 | ||||
|     private Socket clientSocket; | ||||
|     private PrintWriter out; | ||||
|     private BufferedReader in; | ||||
| 
 | ||||
|     public void connect(String ip, int port) throws IOException { | ||||
|         clientSocket = new Socket(ip, port); | ||||
|         out = new PrintWriter(clientSocket.getOutputStream(), true); | ||||
|         in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); | ||||
|     } | ||||
| 
 | ||||
|     public void sendGreetings(String msg) throws IOException { | ||||
|         out.println(msg); | ||||
|         String reply = in.readLine(); | ||||
|         System.out.println("Reply received from the server :: " + reply); | ||||
|     } | ||||
| 
 | ||||
|     public void disconnect() throws IOException { | ||||
|         in.close(); | ||||
|         out.close(); | ||||
|         clientSocket.close(); | ||||
|     } | ||||
| 
 | ||||
|     public static void main(String[] args) throws IOException { | ||||
|         ApplicationClient client = new ApplicationClient(); | ||||
|         client.connect(args[0], Integer.parseInt(args[1])); // IP address and port number of the server | ||||
|         client.sendGreetings(args[2]); // greetings message | ||||
|         client.disconnect(); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,51 @@ | ||||
| package com.baeldung.clientaddress; | ||||
| 
 | ||||
| import java.io.BufferedReader; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStreamReader; | ||||
| import java.io.PrintWriter; | ||||
| import java.net.InetSocketAddress; | ||||
| import java.net.ServerSocket; | ||||
| import java.net.Socket; | ||||
| 
 | ||||
| public class ApplicationServer { | ||||
| 
 | ||||
|     private ServerSocket serverSocket; | ||||
|     private Socket connectedSocket; | ||||
|     private PrintWriter out; | ||||
|     private BufferedReader in; | ||||
| 
 | ||||
|     public void startServer(int port) throws IOException { | ||||
|         serverSocket = new ServerSocket(port); | ||||
|         connectedSocket = serverSocket.accept(); | ||||
| 
 | ||||
|         InetSocketAddress socketAddress = (InetSocketAddress) connectedSocket.getRemoteSocketAddress(); | ||||
|         String clientIpAddress = socketAddress.getAddress() | ||||
|             .getHostAddress(); | ||||
|         System.out.println("IP address of the connected client :: " + clientIpAddress); | ||||
| 
 | ||||
|         out = new PrintWriter(connectedSocket.getOutputStream(), true); | ||||
|         in = new BufferedReader(new InputStreamReader(connectedSocket.getInputStream())); | ||||
|         String msg = in.readLine(); | ||||
|         System.out.println("Message received from the client :: " + msg); | ||||
|         out.println("Hello Client !!"); | ||||
| 
 | ||||
|         closeIO(); | ||||
|         stopServer(); | ||||
|     } | ||||
| 
 | ||||
|     private void closeIO() throws IOException { | ||||
|         in.close(); | ||||
|         out.close(); | ||||
|     } | ||||
| 
 | ||||
|     private void stopServer() throws IOException { | ||||
|         connectedSocket.close(); | ||||
|         serverSocket.close(); | ||||
|     } | ||||
| 
 | ||||
|     public static void main(String[] args) throws IOException { | ||||
|         ApplicationServer server = new ApplicationServer(); | ||||
|         server.startServer(5000); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,101 @@ | ||||
| package com.baeldung.java9.process; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.util.concurrent.CompletableFuture; | ||||
| import java.util.concurrent.ExecutionException; | ||||
| import java.util.stream.Stream; | ||||
| 
 | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| 
 | ||||
| public class ProcessAPIEnhancements { | ||||
| 
 | ||||
|     static Logger log = LoggerFactory.getLogger(ProcessAPIEnhancements.class); | ||||
| 
 | ||||
|     public static void main(String[] args) throws IOException, InterruptedException, ExecutionException { | ||||
|         infoOfCurrentProcess(); | ||||
|         infoOfLiveProcesses(); | ||||
|         infoOfSpawnProcess(); | ||||
|         infoOfExitCallback(); | ||||
|         infoOfChildProcess(); | ||||
|     } | ||||
| 
 | ||||
|     private static void infoOfCurrentProcess() { | ||||
|         ProcessHandle processHandle = ProcessHandle.current(); | ||||
|         ProcessHandle.Info processInfo = processHandle.info(); | ||||
| 
 | ||||
|         log.info("PID: " + processHandle.pid()); | ||||
|         log.info("Arguments: " + processInfo.arguments()); | ||||
|         log.info("Command: " + processInfo.command()); | ||||
|         log.info("Instant: " + processInfo.startInstant()); | ||||
|         log.info("Total CPU duration: " + processInfo.totalCpuDuration()); | ||||
|         log.info("User: " + processInfo.user()); | ||||
|     } | ||||
| 
 | ||||
|     private static void infoOfSpawnProcess() throws IOException { | ||||
| 
 | ||||
|         String javaCmd = ProcessUtils.getJavaCmd().getAbsolutePath(); | ||||
|         ProcessBuilder processBuilder = new ProcessBuilder(javaCmd, "-version"); | ||||
|         Process process = processBuilder.inheritIO().start(); | ||||
|         ProcessHandle processHandle = process.toHandle(); | ||||
|         ProcessHandle.Info processInfo = processHandle.info(); | ||||
| 
 | ||||
|         log.info("PID: " + processHandle.pid()); | ||||
|         log.info("Arguments: " + processInfo.arguments()); | ||||
|         log.info("Command: " + processInfo.command()); | ||||
|         log.info("Instant: " + processInfo.startInstant()); | ||||
|         log.info("Total CPU duration: " + processInfo.totalCpuDuration()); | ||||
|         log.info("User: " + processInfo.user()); | ||||
|     } | ||||
| 
 | ||||
|     private static void infoOfLiveProcesses() { | ||||
|         Stream<ProcessHandle> liveProcesses = ProcessHandle.allProcesses(); | ||||
|         liveProcesses.filter(ProcessHandle::isAlive) | ||||
|             .forEach(ph -> { | ||||
|                 log.info("PID: " + ph.pid()); | ||||
|                 log.info("Instance: " + ph.info().startInstant()); | ||||
|                 log.info("User: " + ph.info().user()); | ||||
|             }); | ||||
|     } | ||||
| 
 | ||||
|     private static void infoOfChildProcess() throws IOException { | ||||
|         int childProcessCount = 5; | ||||
|         for (int i = 0; i < childProcessCount; i++) { | ||||
|             String javaCmd = ProcessUtils.getJavaCmd() | ||||
|               .getAbsolutePath(); | ||||
|             ProcessBuilder processBuilder | ||||
|               = new ProcessBuilder(javaCmd, "-version"); | ||||
|             processBuilder.inheritIO().start(); | ||||
|         } | ||||
| 
 | ||||
|         Stream<ProcessHandle> children = ProcessHandle.current() | ||||
|           .children(); | ||||
|         children.filter(ProcessHandle::isAlive) | ||||
|           .forEach(ph -> log.info("PID: {}, Cmd: {}", ph.pid(), ph.info() | ||||
|             .command())); | ||||
|         Stream<ProcessHandle> descendants = ProcessHandle.current() | ||||
|           .descendants(); | ||||
|         descendants.filter(ProcessHandle::isAlive) | ||||
|           .forEach(ph -> log.info("PID: {}, Cmd: {}", ph.pid(), ph.info() | ||||
|             .command())); | ||||
|     } | ||||
| 
 | ||||
|     private static void infoOfExitCallback() throws IOException, InterruptedException, ExecutionException { | ||||
|         String javaCmd = ProcessUtils.getJavaCmd() | ||||
|           .getAbsolutePath(); | ||||
|         ProcessBuilder processBuilder | ||||
|           = new ProcessBuilder(javaCmd, "-version"); | ||||
|         Process process = processBuilder.inheritIO() | ||||
|           .start(); | ||||
|         ProcessHandle processHandle = process.toHandle(); | ||||
| 
 | ||||
|         log.info("PID: {} has started", processHandle.pid()); | ||||
|         CompletableFuture<ProcessHandle> onProcessExit = processHandle.onExit(); | ||||
|         onProcessExit.get(); | ||||
|         log.info("Alive: " + processHandle.isAlive()); | ||||
|         onProcessExit.thenAccept(ph -> { | ||||
|             log.info("PID: {} has stopped", ph.pid()); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -1,132 +0,0 @@ | ||||
| package com.baeldung.java9.process; | ||||
| 
 | ||||
| import static org.junit.Assert.assertEquals; | ||||
| import static org.junit.Assert.assertNotNull; | ||||
| import static org.junit.Assert.assertTrue; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.util.concurrent.CompletableFuture; | ||||
| import java.util.stream.Stream; | ||||
| 
 | ||||
| import org.junit.Test; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| 
 | ||||
| /** | ||||
|  * Created by sanaulla on 2/23/2017. | ||||
|  */ | ||||
| 
 | ||||
| public class ProcessAPIEnhancementsUnitTest { | ||||
| 
 | ||||
|     Logger log = LoggerFactory.getLogger(ProcessAPIEnhancementsUnitTest.class); | ||||
| 
 | ||||
|     // @Test | ||||
|     // OS / Java version dependent | ||||
|     public void givenCurrentProcess_whenInvokeGetInfo_thenSuccess() throws IOException { | ||||
|         ProcessHandle processHandle = ProcessHandle.current(); | ||||
|         ProcessHandle.Info processInfo = processHandle.info(); | ||||
|         assertNotNull(processHandle.pid()); | ||||
|         assertEquals(true, processInfo.arguments() | ||||
|           .isPresent()); | ||||
|         assertEquals(true, processInfo.command() | ||||
|           .isPresent()); | ||||
|         assertTrue(processInfo.command() | ||||
|           .get() | ||||
|           .contains("java")); | ||||
| 
 | ||||
|         assertEquals(true, processInfo.startInstant() | ||||
|           .isPresent()); | ||||
|         assertEquals(true, processInfo.totalCpuDuration() | ||||
|           .isPresent()); | ||||
|         assertEquals(true, processInfo.user() | ||||
|           .isPresent()); | ||||
|     } | ||||
| 
 | ||||
|     // @Test | ||||
|     // OS / Java version dependent | ||||
|     public void givenSpawnProcess_whenInvokeGetInfo_thenSuccess() throws IOException { | ||||
| 
 | ||||
|         String javaCmd = ProcessUtils.getJavaCmd() | ||||
|           .getAbsolutePath(); | ||||
|         ProcessBuilder processBuilder = new ProcessBuilder(javaCmd, "-version"); | ||||
|         Process process = processBuilder.inheritIO() | ||||
|           .start(); | ||||
|         ProcessHandle processHandle = process.toHandle(); | ||||
|         ProcessHandle.Info processInfo = processHandle.info(); | ||||
|         assertNotNull(processHandle.pid()); | ||||
|         assertEquals(true, processInfo.arguments() | ||||
|           .isPresent()); | ||||
|         assertEquals(true, processInfo.command() | ||||
|           .isPresent()); | ||||
|         assertTrue(processInfo.command() | ||||
|           .get() | ||||
|           .contains("java")); | ||||
|         assertEquals(true, processInfo.startInstant() | ||||
|           .isPresent()); | ||||
|         assertEquals(false, processInfo.totalCpuDuration() | ||||
|           .isPresent()); | ||||
|         assertEquals(true, processInfo.user() | ||||
|           .isPresent()); | ||||
|     } | ||||
| 
 | ||||
|     // @Test | ||||
|     // OS / Java version dependent | ||||
|     public void givenLiveProcesses_whenInvokeGetInfo_thenSuccess() { | ||||
|         Stream<ProcessHandle> liveProcesses = ProcessHandle.allProcesses(); | ||||
|         liveProcesses.filter(ProcessHandle::isAlive) | ||||
|             .forEach(ph -> { | ||||
|                 assertNotNull(ph.pid()); | ||||
|                 assertEquals(true, ph.info() | ||||
|                   .startInstant() | ||||
|                   .isPresent()); | ||||
|                 assertEquals(true, ph.info() | ||||
|                   .user() | ||||
|                   .isPresent()); | ||||
|             }); | ||||
|     } | ||||
| 
 | ||||
|     // @Test | ||||
|     // OS / Java version dependent | ||||
|     public void givenProcess_whenGetChildProcess_thenSuccess() throws IOException { | ||||
|         int childProcessCount = 5; | ||||
|         for (int i = 0; i < childProcessCount; i++) { | ||||
|             String javaCmd = ProcessUtils.getJavaCmd() | ||||
|               .getAbsolutePath(); | ||||
|             ProcessBuilder processBuilder | ||||
|               = new ProcessBuilder(javaCmd, "-version"); | ||||
|             processBuilder.inheritIO().start(); | ||||
|         } | ||||
| 
 | ||||
|         Stream<ProcessHandle> children = ProcessHandle.current() | ||||
|           .children(); | ||||
|         children.filter(ProcessHandle::isAlive) | ||||
|           .forEach(ph -> log.info("PID: {}, Cmd: {}", ph.pid(), ph.info() | ||||
|             .command())); | ||||
|         Stream<ProcessHandle> descendants = ProcessHandle.current() | ||||
|           .descendants(); | ||||
|         descendants.filter(ProcessHandle::isAlive) | ||||
|           .forEach(ph -> log.info("PID: {}, Cmd: {}", ph.pid(), ph.info() | ||||
|             .command())); | ||||
|     } | ||||
| 
 | ||||
|     // @Test | ||||
|     // OS / Java version dependent | ||||
|     public void givenProcess_whenAddExitCallback_thenSuccess() throws Exception { | ||||
|         String javaCmd = ProcessUtils.getJavaCmd() | ||||
|           .getAbsolutePath(); | ||||
|         ProcessBuilder processBuilder | ||||
|           = new ProcessBuilder(javaCmd, "-version"); | ||||
|         Process process = processBuilder.inheritIO() | ||||
|           .start(); | ||||
|         ProcessHandle processHandle = process.toHandle(); | ||||
| 
 | ||||
|         log.info("PID: {} has started", processHandle.pid()); | ||||
|         CompletableFuture<ProcessHandle> onProcessExit = processHandle.onExit(); | ||||
|         onProcessExit.get(); | ||||
|         assertEquals(false, processHandle.isAlive()); | ||||
|         onProcessExit.thenAccept(ph -> { | ||||
|             log.info("PID: {} has stopped", ph.pid()); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,17 @@ | ||||
| package com.baeldung.cryptography; | ||||
| 
 | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| import java.security.NoSuchAlgorithmException; | ||||
| 
 | ||||
| import static org.assertj.core.api.Assertions.assertThat; | ||||
| 
 | ||||
| public class CryptographyStrengthUnitTest { | ||||
|     private static final int UNLIMITED_KEY_SIZE = 2147483647; | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenDefaultCheck_thenUnlimitedReturned() throws NoSuchAlgorithmException { | ||||
|         int maxKeySize = javax.crypto.Cipher.getMaxAllowedKeyLength("AES"); | ||||
|         assertThat(maxKeySize).isEqualTo(UNLIMITED_KEY_SIZE); | ||||
|     } | ||||
| } | ||||
| @ -24,7 +24,7 @@ | ||||
|         <dependency> | ||||
|             <groupId>com.fasterxml.jackson.datatype</groupId> | ||||
|             <artifactId>jackson-datatype-jsr310</artifactId> | ||||
|             <version>${jackson-datatype.version}</version> | ||||
|             <version>${jackson.version}</version> | ||||
|         </dependency> | ||||
|         <!-- CSV --> | ||||
|         <dependency> | ||||
| @ -52,7 +52,6 @@ | ||||
| 
 | ||||
|     <properties> | ||||
|         <assertj.version>3.11.0</assertj.version> | ||||
|         <jackson-datatype.version>2.9.8</jackson-datatype.version> | ||||
|     </properties> | ||||
| 
 | ||||
| </project> | ||||
| @ -3,5 +3,6 @@ | ||||
| This module contains articles about JavaFX. | ||||
| 
 | ||||
| ### Relevant Articles: | ||||
| -[Introduction to JavaFX](https://www.baeldung.com/javafx) | ||||
| - [Introduction to JavaFX](https://www.baeldung.com/javafx) | ||||
| - [Display Custom Items in JavaFX ListView](https://www.baeldung.com/javafx-listview-display-custom-items) | ||||
| 
 | ||||
|  | ||||
| @ -17,7 +17,6 @@ | ||||
|     </prerequisites> | ||||
| 
 | ||||
|     <properties> | ||||
|         <lifecycle.mapping.version>1.0.0</lifecycle.mapping.version> | ||||
|         <argLine>-Djava.security.egd=file:/dev/./urandom -Xmx256m</argLine> | ||||
|         <assertj.version>3.6.2</assertj.version> | ||||
|         <awaitility.version>2.0.0</awaitility.version> | ||||
| @ -31,6 +30,7 @@ | ||||
|         <jcache.version>1.0.0</jcache.version> | ||||
|         <jhipster.server.version>1.1.0</jhipster.server.version> | ||||
|         <jjwt.version>0.7.0</jjwt.version> | ||||
|         <lifecycle.mapping.version>1.0.0</lifecycle.mapping.version> | ||||
|         <liquibase-hibernate5.version>3.6</liquibase-hibernate5.version> | ||||
|         <liquibase-slf4j.version>2.0.0</liquibase-slf4j.version> | ||||
|         <liquibase.version>3.6.2</liquibase.version> | ||||
| @ -59,14 +59,14 @@ | ||||
| 
 | ||||
|         <sonar.issue.ignore.multicriteria>S3437,UndocumentedApi,BoldAndItalicTagsCheck</sonar.issue.ignore.multicriteria> | ||||
| 
 | ||||
|         <!-- Rule https://sonarqube.com/coding_rules#rule_key=Web%3ABoldAndItalicTagsCheck is ignored. Even if we agree that using the "i" tag is an awful practice, this is what is  | ||||
|         <!-- Rule https://sonarqube.com/coding_rules#rule_key=Web%3ABoldAndItalicTagsCheck is ignored. Even if we agree that using the "i" tag is an awful practice, this is what is | ||||
|             recommended by http://fontawesome.io/examples/ --> | ||||
|         <sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.resourceKey>src/main/webapp/app/**/*.*</sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.resourceKey> | ||||
|         <sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.ruleKey>Web:BoldAndItalicTagsCheck</sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.ruleKey> | ||||
|         <!-- Rule https://sonarqube.com/coding_rules#rule_key=squid%3AS3437 is ignored, as a JPA-managed field cannot be transient --> | ||||
|         <sonar.issue.ignore.multicriteria.S3437.resourceKey>src/main/java/**/*</sonar.issue.ignore.multicriteria.S3437.resourceKey> | ||||
|         <sonar.issue.ignore.multicriteria.S3437.ruleKey>squid:S3437</sonar.issue.ignore.multicriteria.S3437.ruleKey> | ||||
|         <!-- Rule http://sonarqube.com/coding_rules#rule_key=squid%3AUndocumentedApi is ignored, as we want to follow "clean code" guidelines and classes, methods and arguments names  | ||||
|         <!-- Rule http://sonarqube.com/coding_rules#rule_key=squid%3AUndocumentedApi is ignored, as we want to follow "clean code" guidelines and classes, methods and arguments names | ||||
|             should be self-explanatory --> | ||||
|         <sonar.issue.ignore.multicriteria.UndocumentedApi.resourceKey>src/main/java/**/*</sonar.issue.ignore.multicriteria.UndocumentedApi.resourceKey> | ||||
|         <sonar.issue.ignore.multicriteria.UndocumentedApi.ruleKey>squid:UndocumentedApi</sonar.issue.ignore.multicriteria.UndocumentedApi.ruleKey> | ||||
| @ -349,7 +349,6 @@ | ||||
|         <dependency> | ||||
|             <groupId>org.springframework.boot</groupId> | ||||
|             <artifactId>spring-boot-starter-test</artifactId> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.springframework.boot</groupId> | ||||
| @ -365,11 +364,6 @@ | ||||
|                 </exclusion> | ||||
|             </exclusions> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.springframework.boot</groupId> | ||||
|             <artifactId>spring-boot-test</artifactId> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|         <!-- Spring Cloud --> | ||||
|         <dependency> | ||||
|             <groupId>org.springframework.cloud</groupId> | ||||
| @ -427,7 +421,7 @@ | ||||
|         <defaultGoal>spring-boot:run</defaultGoal> | ||||
|         <pluginManagement> | ||||
|             <plugins> | ||||
|                 <!-- This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself. Remove when the m2e plugin can correctly  | ||||
|                 <!-- This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself. Remove when the m2e plugin can correctly | ||||
|                     bind to Maven lifecycle --> | ||||
|                 <plugin> | ||||
|                     <groupId>org.eclipse.m2e</groupId> | ||||
| @ -580,14 +574,6 @@ | ||||
|                     </execution> | ||||
|                 </executions> | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-surefire-plugin</artifactId> | ||||
|                 <configuration> | ||||
|                     <!-- Force alphabetical order to have a reproducible build --> | ||||
|                     <runOrder>alphabetical</runOrder> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <groupId>org.jacoco</groupId> | ||||
|                 <artifactId>jacoco-maven-plugin</artifactId> | ||||
| @ -768,8 +754,8 @@ | ||||
|             </dependencies> | ||||
|         </profile> | ||||
|         <profile> | ||||
|             <!-- Profile for doing "continuous compilation" with the Scala Maven plugin. It allows automatic compilation of Java classes as soon as they are saved. To use it, run in  | ||||
|                 3 terminals: - './mvnw -Pcc scala:cc' for continous compilation of your classes - './mvnw -Pcc' for hot reload of Spring boot - 'gulp' for hot reload of the HTML/JavaScript assets Everything  | ||||
|             <!-- Profile for doing "continuous compilation" with the Scala Maven plugin. It allows automatic compilation of Java classes as soon as they are saved. To use it, run in | ||||
|                 3 terminals: - './mvnw -Pcc scala:cc' for continous compilation of your classes - './mvnw -Pcc' for hot reload of Spring boot - 'gulp' for hot reload of the HTML/JavaScript assets Everything | ||||
|                 should hot reload automatically! --> | ||||
|             <id>cc</id> | ||||
|             <build> | ||||
|  | ||||
| @ -21,6 +21,8 @@ eureka: | ||||
|         instanceId: carapp:${spring.application.instance_id:${random.value}} | ||||
| 
 | ||||
| spring: | ||||
|     main: | ||||
|         banner-mode: "off" | ||||
|     application: | ||||
|         name: carapp | ||||
|     jackson: | ||||
| @ -37,7 +39,7 @@ spring: | ||||
|         database-platform: io.github.jhipster.domain.util.FixedH2Dialect | ||||
|         database: H2 | ||||
|         open-in-view: false | ||||
|         show-sql: true | ||||
|         show-sql: false | ||||
|         hibernate: | ||||
|             ddl-auto: none | ||||
|             naming: | ||||
|  | ||||
| @ -3,7 +3,7 @@ | ||||
| <configuration scan="true"> | ||||
|     <include resource="org/springframework/boot/logging/logback/base.xml"/> | ||||
| 
 | ||||
|     <logger name="com.car.app" level="DEBUG"/> | ||||
|     <logger name="com.car.app" level="INFO"/> | ||||
|     <logger name="org.hibernate" level="WARN"/> | ||||
|     <logger name="org.hibernate.ejb.HibernatePersistence" level="OFF"/> | ||||
|     <logger name="org.apache.catalina.startup.DigesterFactory" level="OFF"/> | ||||
|  | ||||
| @ -29,6 +29,7 @@ | ||||
|         <jcache.version>1.0.0</jcache.version> | ||||
|         <jhipster.server.version>1.1.0</jhipster.server.version> | ||||
|         <jjwt.version>0.7.0</jjwt.version> | ||||
|         <lifecycle.mapping.version>1.0.0</lifecycle.mapping.version> | ||||
|         <liquibase-hibernate5.version>3.6</liquibase-hibernate5.version> | ||||
|         <liquibase-slf4j.version>2.0.0</liquibase-slf4j.version> | ||||
|         <liquibase.version>3.6.2</liquibase.version> | ||||
| @ -57,14 +58,14 @@ | ||||
| 
 | ||||
|         <sonar.issue.ignore.multicriteria>S3437,UndocumentedApi,BoldAndItalicTagsCheck</sonar.issue.ignore.multicriteria> | ||||
| 
 | ||||
|         <!-- Rule https://sonarqube.com/coding_rules#rule_key=Web%3ABoldAndItalicTagsCheck is ignored. Even if we agree that using the "i" tag is an awful practice, this is what is  | ||||
|         <!-- Rule https://sonarqube.com/coding_rules#rule_key=Web%3ABoldAndItalicTagsCheck is ignored. Even if we agree that using the "i" tag is an awful practice, this is what is | ||||
|             recommended by http://fontawesome.io/examples/ --> | ||||
|         <sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.resourceKey>src/main/webapp/app/**/*.*</sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.resourceKey> | ||||
|         <sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.ruleKey>Web:BoldAndItalicTagsCheck</sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.ruleKey> | ||||
|         <!-- Rule https://sonarqube.com/coding_rules#rule_key=squid%3AS3437 is ignored, as a JPA-managed field cannot be transient --> | ||||
|         <sonar.issue.ignore.multicriteria.S3437.resourceKey>src/main/java/**/*</sonar.issue.ignore.multicriteria.S3437.resourceKey> | ||||
|         <sonar.issue.ignore.multicriteria.S3437.ruleKey>squid:S3437</sonar.issue.ignore.multicriteria.S3437.ruleKey> | ||||
|         <!-- Rule http://sonarqube.com/coding_rules#rule_key=squid%3AUndocumentedApi is ignored, as we want to follow "clean code" guidelines and classes, methods and arguments names  | ||||
|         <!-- Rule http://sonarqube.com/coding_rules#rule_key=squid%3AUndocumentedApi is ignored, as we want to follow "clean code" guidelines and classes, methods and arguments names | ||||
|             should be self-explanatory --> | ||||
|         <sonar.issue.ignore.multicriteria.UndocumentedApi.resourceKey>src/main/java/**/*</sonar.issue.ignore.multicriteria.UndocumentedApi.resourceKey> | ||||
|         <sonar.issue.ignore.multicriteria.UndocumentedApi.ruleKey>squid:UndocumentedApi</sonar.issue.ignore.multicriteria.UndocumentedApi.ruleKey> | ||||
| @ -90,7 +91,6 @@ | ||||
|         <undertow.version>1.4.10.Final</undertow.version> | ||||
|         <validation-api.version>1.1.0.Final</validation-api.version> | ||||
|         <yarn.version>v0.21.3</yarn.version> | ||||
|         <lifecycle.mapping.version>1.0.0</lifecycle.mapping.version> | ||||
|     </properties> | ||||
| 
 | ||||
|     <dependencyManagement> | ||||
| @ -345,6 +345,10 @@ | ||||
|             <groupId>org.springframework.boot</groupId> | ||||
|             <artifactId>spring-boot-starter-security</artifactId> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.springframework.boot</groupId> | ||||
|             <artifactId>spring-boot-starter-test</artifactId> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.springframework.boot</groupId> | ||||
|             <artifactId>spring-boot-starter-thymeleaf</artifactId> | ||||
| @ -359,11 +363,6 @@ | ||||
|                 </exclusion> | ||||
|             </exclusions> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.springframework.boot</groupId> | ||||
|             <artifactId>spring-boot-test</artifactId> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|         <!-- Spring Cloud --> | ||||
|         <dependency> | ||||
|             <groupId>org.springframework.cloud</groupId> | ||||
| @ -421,7 +420,7 @@ | ||||
|         <defaultGoal>spring-boot:run</defaultGoal> | ||||
|         <pluginManagement> | ||||
|             <plugins> | ||||
|                 <!-- This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself. Remove when the m2e plugin can correctly  | ||||
|                 <!-- This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself. Remove when the m2e plugin can correctly | ||||
|                     bind to Maven lifecycle --> | ||||
|                 <plugin> | ||||
|                     <groupId>org.eclipse.m2e</groupId> | ||||
| @ -574,14 +573,6 @@ | ||||
|                     </execution> | ||||
|                 </executions> | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-surefire-plugin</artifactId> | ||||
|                 <configuration> | ||||
|                     <!-- Force alphabetical order to have a reproducible build --> | ||||
|                     <runOrder>alphabetical</runOrder> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <groupId>org.jacoco</groupId> | ||||
|                 <artifactId>jacoco-maven-plugin</artifactId> | ||||
| @ -762,8 +753,8 @@ | ||||
|             </dependencies> | ||||
|         </profile> | ||||
|         <profile> | ||||
|             <!-- Profile for doing "continuous compilation" with the Scala Maven plugin. It allows automatic compilation of Java classes as soon as they are saved. To use it, run in  | ||||
|                 3 terminals: - './mvnw -Pcc scala:cc' for continous compilation of your classes - './mvnw -Pcc' for hot reload of Spring boot - 'gulp' for hot reload of the HTML/JavaScript assets Everything  | ||||
|             <!-- Profile for doing "continuous compilation" with the Scala Maven plugin. It allows automatic compilation of Java classes as soon as they are saved. To use it, run in | ||||
|                 3 terminals: - './mvnw -Pcc scala:cc' for continous compilation of your classes - './mvnw -Pcc' for hot reload of Spring boot - 'gulp' for hot reload of the HTML/JavaScript assets Everything | ||||
|                 should hot reload automatically! --> | ||||
|             <id>cc</id> | ||||
|             <build> | ||||
|  | ||||
| @ -21,6 +21,8 @@ eureka: | ||||
|         instanceId: dealerapp:${spring.application.instance_id:${random.value}} | ||||
| 
 | ||||
| spring: | ||||
|     main: | ||||
|         banner-mode: "off" | ||||
|     application: | ||||
|         name: dealerapp | ||||
|     jackson: | ||||
| @ -37,7 +39,7 @@ spring: | ||||
|         database-platform: io.github.jhipster.domain.util.FixedH2Dialect | ||||
|         database: H2 | ||||
|         open-in-view: false | ||||
|         show-sql: true | ||||
|         show-sql: false | ||||
|         hibernate: | ||||
|             ddl-auto: none | ||||
|             naming: | ||||
|  | ||||
| @ -3,7 +3,7 @@ | ||||
| <configuration scan="true"> | ||||
|     <include resource="org/springframework/boot/logging/logback/base.xml"/> | ||||
| 
 | ||||
|     <logger name="com.dealer.app" level="DEBUG"/> | ||||
|     <logger name="com.dealer.app" level="INFO"/> | ||||
|     <logger name="org.hibernate" level="WARN"/> | ||||
|     <logger name="org.hibernate.ejb.HibernatePersistence" level="OFF"/> | ||||
|     <logger name="org.apache.catalina.startup.DigesterFactory" level="OFF"/> | ||||
|  | ||||
| @ -32,6 +32,7 @@ | ||||
|         <jcache.version>1.0.0</jcache.version> | ||||
|         <jhipster.server.version>1.1.0</jhipster.server.version> | ||||
|         <jjwt.version>0.7.0</jjwt.version> | ||||
|         <lifecycle.mapping.version>1.0.0</lifecycle.mapping.version> | ||||
|         <liquibase-hibernate5.version>3.6</liquibase-hibernate5.version> | ||||
|         <liquibase-slf4j.version>2.0.0</liquibase-slf4j.version> | ||||
|         <liquibase.version>3.6.2</liquibase.version> | ||||
| @ -61,14 +62,14 @@ | ||||
| 
 | ||||
|         <sonar.issue.ignore.multicriteria>S3437,UndocumentedApi,BoldAndItalicTagsCheck</sonar.issue.ignore.multicriteria> | ||||
| 
 | ||||
|         <!-- Rule https://sonarqube.com/coding_rules#rule_key=Web%3ABoldAndItalicTagsCheck is ignored. Even if we agree that using the "i" tag is an awful practice, this is what is  | ||||
|         <!-- Rule https://sonarqube.com/coding_rules#rule_key=Web%3ABoldAndItalicTagsCheck is ignored. Even if we agree that using the "i" tag is an awful practice, this is what is | ||||
|             recommended by http://fontawesome.io/examples/ --> | ||||
|         <sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.resourceKey>src/main/webapp/app/**/*.*</sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.resourceKey> | ||||
|         <sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.ruleKey>Web:BoldAndItalicTagsCheck</sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.ruleKey> | ||||
|         <!-- Rule https://sonarqube.com/coding_rules#rule_key=squid%3AS3437 is ignored, as a JPA-managed field cannot be transient --> | ||||
|         <sonar.issue.ignore.multicriteria.S3437.resourceKey>src/main/java/**/*</sonar.issue.ignore.multicriteria.S3437.resourceKey> | ||||
|         <sonar.issue.ignore.multicriteria.S3437.ruleKey>squid:S3437</sonar.issue.ignore.multicriteria.S3437.ruleKey> | ||||
|         <!-- Rule http://sonarqube.com/coding_rules#rule_key=squid%3AUndocumentedApi is ignored, as we want to follow "clean code" guidelines and classes, methods and arguments names  | ||||
|         <!-- Rule http://sonarqube.com/coding_rules#rule_key=squid%3AUndocumentedApi is ignored, as we want to follow "clean code" guidelines and classes, methods and arguments names | ||||
|             should be self-explanatory --> | ||||
|         <sonar.issue.ignore.multicriteria.UndocumentedApi.resourceKey>src/main/java/**/*</sonar.issue.ignore.multicriteria.UndocumentedApi.resourceKey> | ||||
|         <sonar.issue.ignore.multicriteria.UndocumentedApi.ruleKey>squid:UndocumentedApi</sonar.issue.ignore.multicriteria.UndocumentedApi.ruleKey> | ||||
| @ -94,7 +95,6 @@ | ||||
|         <undertow.version>1.4.10.Final</undertow.version> | ||||
|         <validation-api.version>1.1.0.Final</validation-api.version> | ||||
|         <yarn.version>v0.21.3</yarn.version> | ||||
|         <lifecycle.mapping.version>1.0.0</lifecycle.mapping.version> | ||||
|     </properties> | ||||
| 
 | ||||
|     <dependencyManagement> | ||||
| @ -383,6 +383,10 @@ | ||||
|             <artifactId>spring-boot-starter-test</artifactId> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.springframework.boot</groupId> | ||||
|             <artifactId>spring-boot-starter-test</artifactId> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.springframework.boot</groupId> | ||||
|             <artifactId>spring-boot-starter-thymeleaf</artifactId> | ||||
| @ -397,11 +401,6 @@ | ||||
|                 </exclusion> | ||||
|             </exclusions> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.springframework.boot</groupId> | ||||
|             <artifactId>spring-boot-test</artifactId> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.springframework.cloud</groupId> | ||||
|             <artifactId>spring-cloud-starter</artifactId> | ||||
| @ -463,7 +462,7 @@ | ||||
|         <defaultGoal>spring-boot:run</defaultGoal> | ||||
|         <pluginManagement> | ||||
|             <plugins> | ||||
|                 <!-- This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself. Remove when the m2e plugin can correctly  | ||||
|                 <!-- This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself. Remove when the m2e plugin can correctly | ||||
|                     bind to Maven lifecycle --> | ||||
|                 <plugin> | ||||
|                     <groupId>org.eclipse.m2e</groupId> | ||||
| @ -632,14 +631,6 @@ | ||||
|                     </execution> | ||||
|                 </executions> | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-surefire-plugin</artifactId> | ||||
|                 <configuration> | ||||
|                     <!-- Force alphabetical order to have a reproducible build --> | ||||
|                     <runOrder>alphabetical</runOrder> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <groupId>org.jacoco</groupId> | ||||
|                 <artifactId>jacoco-maven-plugin</artifactId> | ||||
| @ -878,8 +869,8 @@ | ||||
|             </dependencies> | ||||
|         </profile> | ||||
|         <profile> | ||||
|             <!-- Profile for doing "continuous compilation" with the Scala Maven plugin. It allows automatic compilation of Java classes as soon as they are saved. To use it, run in  | ||||
|                 3 terminals: - './mvnw -Pcc scala:cc' for continous compilation of your classes - './mvnw -Pcc' for hot reload of Spring boot - 'gulp' for hot reload of the HTML/JavaScript assets Everything  | ||||
|             <!-- Profile for doing "continuous compilation" with the Scala Maven plugin. It allows automatic compilation of Java classes as soon as they are saved. To use it, run in | ||||
|                 3 terminals: - './mvnw -Pcc scala:cc' for continous compilation of your classes - './mvnw -Pcc' for hot reload of Spring boot - 'gulp' for hot reload of the HTML/JavaScript assets Everything | ||||
|                 should hot reload automatically! --> | ||||
|             <id>cc</id> | ||||
|             <build> | ||||
|  | ||||
| @ -49,7 +49,7 @@ public class LogsResourceIntegrationTest { | ||||
|     public void changeLogs()throws Exception { | ||||
|         LoggerVM logger = new LoggerVM(); | ||||
|         logger.setLevel("INFO"); | ||||
|         logger.setName("ROOT"); | ||||
|         logger.setName("some.test.logger"); | ||||
| 
 | ||||
|         restLogsMockMvc.perform(put("/management/logs") | ||||
|             .contentType(TestUtil.APPLICATION_JSON_UTF8) | ||||
|  | ||||
| @ -21,6 +21,8 @@ eureka: | ||||
|         instanceId: gateway:${spring.application.instance_id:${random.value}} | ||||
| 
 | ||||
| spring: | ||||
|     main: | ||||
|         banner-mode: "off" | ||||
|     application: | ||||
|         name: gateway | ||||
|     autoconfigure: | ||||
| @ -39,7 +41,7 @@ spring: | ||||
|         database-platform: io.github.jhipster.domain.util.FixedH2Dialect | ||||
|         database: H2 | ||||
|         open-in-view: false | ||||
|         show-sql: true | ||||
|         show-sql: false | ||||
|         hibernate: | ||||
|             ddl-auto: none | ||||
|             naming: | ||||
|  | ||||
| @ -3,7 +3,7 @@ | ||||
| <configuration scan="true"> | ||||
|     <include resource="org/springframework/boot/logging/logback/base.xml"/> | ||||
| 
 | ||||
|     <logger name="com.gateway" level="DEBUG"/> | ||||
|     <logger name="com.gateway" level="INFO"/> | ||||
|     <logger name="org.hibernate" level="WARN"/> | ||||
|     <logger name="org.hibernate.ejb.HibernatePersistence" level="OFF"/> | ||||
|     <logger name="org.apache.catalina.startup.DigesterFactory" level="OFF"/> | ||||
|  | ||||
| @ -11,7 +11,7 @@ | ||||
|         <groupId>com.baeldung.jhipster</groupId> | ||||
|         <version>1.0.0-SNAPSHOT</version> | ||||
|     </parent> | ||||
|      | ||||
| 
 | ||||
|     <modules> | ||||
|         <module>car-app</module> | ||||
|         <module>dealer-app</module> | ||||
|  | ||||
| @ -277,8 +277,7 @@ | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.springframework.boot</groupId> | ||||
|             <artifactId>spring-boot-test</artifactId> | ||||
|             <scope>test</scope> | ||||
|             <artifactId>spring-boot-starter-test</artifactId> | ||||
|         </dependency> | ||||
|         <!-- security --> | ||||
|         <dependency> | ||||
| @ -297,7 +296,7 @@ | ||||
|         <defaultGoal>spring-boot:run</defaultGoal> | ||||
|         <pluginManagement> | ||||
|             <plugins> | ||||
|                 <!-- This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself. Remove when the m2e plugin can correctly  | ||||
|                 <!-- This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself. Remove when the m2e plugin can correctly | ||||
|                     bind to Maven lifecycle --> | ||||
|                 <plugin> | ||||
|                     <groupId>org.eclipse.m2e</groupId> | ||||
| @ -751,8 +750,8 @@ | ||||
|             </dependencies> | ||||
|         </profile> | ||||
|         <profile> | ||||
|             <!-- Profile for doing "continuous compilation" with the Scala Maven plugin. It allows automatic compilation of Java classes as soon as they are saved. To use it, run in  | ||||
|                 3 terminals: - './mvnw -Pcc scala:cc' for continous compilation of your classes - './mvnw -Pcc' for hot reload of Spring boot - 'gulp' for hot reload of the HTML/JavaScript assets Everything  | ||||
|             <!-- Profile for doing "continuous compilation" with the Scala Maven plugin. It allows automatic compilation of Java classes as soon as they are saved. To use it, run in | ||||
|                 3 terminals: - './mvnw -Pcc scala:cc' for continous compilation of your classes - './mvnw -Pcc' for hot reload of Spring boot - 'gulp' for hot reload of the HTML/JavaScript assets Everything | ||||
|                 should hot reload automatically! --> | ||||
|             <id>cc</id> | ||||
|             <build> | ||||
| @ -931,14 +930,14 @@ | ||||
| 
 | ||||
|         <sonar.issue.ignore.multicriteria>S3437,UndocumentedApi,BoldAndItalicTagsCheck</sonar.issue.ignore.multicriteria> | ||||
| 
 | ||||
|         <!-- Rule https://sonarqube.com/coding_rules#rule_key=Web%3ABoldAndItalicTagsCheck is ignored. Even if we agree that using the "i" tag is an awful practice, this is what is  | ||||
|         <!-- Rule https://sonarqube.com/coding_rules#rule_key=Web%3ABoldAndItalicTagsCheck is ignored. Even if we agree that using the "i" tag is an awful practice, this is what is | ||||
|             recommended by http://fontawesome.io/examples/ --> | ||||
|         <sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.resourceKey>src/main/webapp/app/**/*.*</sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.resourceKey> | ||||
|         <sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.ruleKey>Web:BoldAndItalicTagsCheck</sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.ruleKey> | ||||
|         <!-- Rule https://sonarqube.com/coding_rules#rule_key=squid%3AS3437 is ignored, as a JPA-managed field cannot be transient --> | ||||
|         <sonar.issue.ignore.multicriteria.S3437.resourceKey>src/main/java/**/*</sonar.issue.ignore.multicriteria.S3437.resourceKey> | ||||
|         <sonar.issue.ignore.multicriteria.S3437.ruleKey>squid:S3437</sonar.issue.ignore.multicriteria.S3437.ruleKey> | ||||
|         <!-- Rule http://sonarqube.com/coding_rules#rule_key=squid%3AUndocumentedApi is ignored, as we want to follow "clean code" guidelines and classes, methods and arguments names  | ||||
|         <!-- Rule http://sonarqube.com/coding_rules#rule_key=squid%3AUndocumentedApi is ignored, as we want to follow "clean code" guidelines and classes, methods and arguments names | ||||
|             should be self-explanatory --> | ||||
|         <sonar.issue.ignore.multicriteria.UndocumentedApi.resourceKey>src/main/java/**/*</sonar.issue.ignore.multicriteria.UndocumentedApi.resourceKey> | ||||
|         <sonar.issue.ignore.multicriteria.UndocumentedApi.ruleKey>squid:UndocumentedApi</sonar.issue.ignore.multicriteria.UndocumentedApi.ruleKey> | ||||
|  | ||||
| @ -49,7 +49,7 @@ public class LogsResourceIntegrationTest { | ||||
|     public void changeLogs()throws Exception { | ||||
|         LoggerVM logger = new LoggerVM(); | ||||
|         logger.setLevel("INFO"); | ||||
|         logger.setName("ROOT"); | ||||
|         logger.setName("some.test.logger"); | ||||
| 
 | ||||
|         restLogsMockMvc.perform(put("/management/logs") | ||||
|             .contentType(TestUtil.APPLICATION_JSON_UTF8) | ||||
|  | ||||
| @ -15,6 +15,8 @@ | ||||
| 
 | ||||
| 
 | ||||
| spring: | ||||
|     main: | ||||
|         banner-mode: "off" | ||||
|     application: | ||||
|         name: baeldung | ||||
|     jackson: | ||||
| @ -31,7 +33,7 @@ spring: | ||||
|         database-platform: io.github.jhipster.domain.util.FixedH2Dialect | ||||
|         database: H2 | ||||
|         open-in-view: false | ||||
|         show-sql: true | ||||
|         show-sql: false | ||||
|         hibernate: | ||||
|             ddl-auto: none | ||||
|             naming: | ||||
|  | ||||
| @ -3,7 +3,7 @@ | ||||
| <configuration scan="true"> | ||||
|     <include resource="org/springframework/boot/logging/logback/base.xml"/> | ||||
| 
 | ||||
|     <logger name="com.baeldung" level="DEBUG"/> | ||||
|     <logger name="com.baeldung" level="INFO"/> | ||||
|     <logger name="org.hibernate" level="WARN"/> | ||||
|     <logger name="org.hibernate.ejb.HibernatePersistence" level="OFF"/> | ||||
|     <logger name="org.apache.catalina.startup.DigesterFactory" level="OFF"/> | ||||
|  | ||||
| @ -1,6 +1,13 @@ | ||||
| <?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/maven-v4_0_0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
| 
 | ||||
|     <parent> | ||||
|         <artifactId>jhipster-uaa</artifactId> | ||||
|         <groupId>com.baeldung.jhipster</groupId> | ||||
|         <version>1.0.0-SNAPSHOT</version> | ||||
|     </parent> | ||||
| 
 | ||||
|     <groupId>com.baeldung.jhipster.gateway</groupId> | ||||
|     <artifactId>gateway</artifactId> | ||||
|     <version>0.0.1-SNAPSHOT</version> | ||||
| @ -415,15 +422,6 @@ | ||||
|                     </execution> | ||||
|                 </executions> | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-surefire-plugin</artifactId> | ||||
|                 <version>${maven-surefire-plugin.version}</version> | ||||
|                 <configuration> | ||||
|                     <!-- Force alphabetical order to have a reproducible build --> | ||||
|                     <runOrder>alphabetical</runOrder> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <groupId>org.jacoco</groupId> | ||||
|                 <artifactId>jacoco-maven-plugin</artifactId> | ||||
| @ -1010,7 +1008,7 @@ | ||||
|         </profile> | ||||
|         <!-- jhipster-needle-maven-add-profile --> | ||||
|     </profiles> | ||||
| 	 | ||||
| 
 | ||||
|     <properties> | ||||
|         <lifecycle.mapping.version>1.0.0</lifecycle.mapping.version> | ||||
|         <spring.web.version>0.24.0</spring.web.version> | ||||
| @ -1090,5 +1088,5 @@ | ||||
|         <sonar.tests>${project.basedir}/src/test/</sonar.tests> | ||||
| 
 | ||||
|         <!-- jhipster-needle-maven-property --> | ||||
|     </properties>	 | ||||
|     </properties> | ||||
| </project> | ||||
|  | ||||
| @ -40,7 +40,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. | ||||
|  * | ||||
|  * @see WebConfigurer | ||||
|  */ | ||||
| public class WebConfigurerTest { | ||||
| public class WebConfigurerUnitTest { | ||||
| 
 | ||||
|     private WebConfigurer webConfigurer; | ||||
| 
 | ||||
| @ -18,7 +18,7 @@ import static springfox.documentation.swagger2.web.Swagger2Controller.DEFAULT_UR | ||||
| /** | ||||
|  * Tests SwaggerBasePathRewritingFilter class. | ||||
|  */ | ||||
| public class SwaggerBasePathRewritingFilterTest { | ||||
| public class SwaggerBasePathRewritingFilterUnitTest { | ||||
| 
 | ||||
|     private SwaggerBasePathRewritingFilter filter = new SwaggerBasePathRewritingFilter(); | ||||
| 
 | ||||
| @ -16,7 +16,7 @@ import java.util.List; | ||||
|  * | ||||
|  * @see CookieCollection | ||||
|  */ | ||||
| public class CookieCollectionTest { | ||||
| public class CookieCollectionUnitTest { | ||||
|     public static final String COOKIE_NAME = "chocolate"; | ||||
|     public static final String COOKIE_VALUE = "yummy"; | ||||
|     public static final String BROWNIE_NAME = "brownie"; | ||||
| @ -12,7 +12,7 @@ import org.springframework.security.oauth2.common.OAuth2AccessToken; | ||||
|  * Test whether the CookieTokenExtractor can properly extract access tokens from | ||||
|  * Cookies and Headers. | ||||
|  */ | ||||
| public class CookieTokenExtractorTest { | ||||
| public class CookieTokenExtractorUnitTest { | ||||
|     private CookieTokenExtractor cookieTokenExtractor; | ||||
| 
 | ||||
|     @Before | ||||
| @ -22,24 +22,24 @@ public class CookieTokenExtractorTest { | ||||
| 
 | ||||
|     @Test | ||||
|     public void testExtractTokenCookie() { | ||||
|         MockHttpServletRequest request = OAuth2AuthenticationServiceTest.createMockHttpServletRequest(); | ||||
|         MockHttpServletRequest request = OAuth2AuthenticationServiceUnitTest.createMockHttpServletRequest(); | ||||
|         Authentication authentication = cookieTokenExtractor.extract(request); | ||||
|         Assert.assertEquals(OAuth2AuthenticationServiceTest.ACCESS_TOKEN_VALUE, authentication.getPrincipal().toString()); | ||||
|         Assert.assertEquals(OAuth2AuthenticationServiceUnitTest.ACCESS_TOKEN_VALUE, authentication.getPrincipal().toString()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void testExtractTokenHeader() { | ||||
|         MockHttpServletRequest request = new MockHttpServletRequest(HttpMethod.GET.name(), "http://www.test.com"); | ||||
|         request.addHeader("Authorization", OAuth2AccessToken.BEARER_TYPE + " " + OAuth2AuthenticationServiceTest.ACCESS_TOKEN_VALUE); | ||||
|         request.addHeader("Authorization", OAuth2AccessToken.BEARER_TYPE + " " + OAuth2AuthenticationServiceUnitTest.ACCESS_TOKEN_VALUE); | ||||
|         Authentication authentication = cookieTokenExtractor.extract(request); | ||||
|         Assert.assertEquals(OAuth2AuthenticationServiceTest.ACCESS_TOKEN_VALUE, authentication.getPrincipal().toString()); | ||||
|         Assert.assertEquals(OAuth2AuthenticationServiceUnitTest.ACCESS_TOKEN_VALUE, authentication.getPrincipal().toString()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void testExtractTokenParam() { | ||||
|         MockHttpServletRequest request = new MockHttpServletRequest(HttpMethod.GET.name(), "http://www.test.com"); | ||||
|         request.addParameter(OAuth2AccessToken.ACCESS_TOKEN, OAuth2AuthenticationServiceTest.ACCESS_TOKEN_VALUE); | ||||
|         request.addParameter(OAuth2AccessToken.ACCESS_TOKEN, OAuth2AuthenticationServiceUnitTest.ACCESS_TOKEN_VALUE); | ||||
|         Authentication authentication = cookieTokenExtractor.extract(request); | ||||
|         Assert.assertEquals(OAuth2AuthenticationServiceTest.ACCESS_TOKEN_VALUE, authentication.getPrincipal().toString()); | ||||
|         Assert.assertEquals(OAuth2AuthenticationServiceUnitTest.ACCESS_TOKEN_VALUE, authentication.getPrincipal().toString()); | ||||
|     } | ||||
| } | ||||
| @ -39,7 +39,7 @@ import static org.mockito.Mockito.when; | ||||
|  * @see OAuth2AuthenticationService | ||||
|  */ | ||||
| @RunWith(MockitoJUnitRunner.class) | ||||
| public class OAuth2AuthenticationServiceTest { | ||||
| public class OAuth2AuthenticationServiceUnitTest { | ||||
|     public static final String CLIENT_AUTHORIZATION = "Basic d2ViX2FwcDpjaGFuZ2VpdA=="; | ||||
|     public static final String ACCESS_TOKEN_VALUE = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQyNzI4NDQsInVzZXJfbmFtZSI6InVzZXIiLCJhdXRob3JpdGllcyI6WyJST0xFX1VTRVIiXSwianRpIjoiNzc1ZTJkYWUtYWYzZi00YTdhLWExOTktNzNiZTU1MmIxZDVkIiwiY2xpZW50X2lkIjoid2ViX2FwcCIsInNjb3BlIjpbIm9wZW5pZCJdfQ.gEK0YcX2IpkpxnkxXXHQ4I0xzTjcy7edqb89ukYE0LPe7xUcZVwkkCJF_nBxsGJh2jtA6NzNLfY5zuL6nP7uoAq3fmvsyrcyR2qPk8JuuNzGtSkICx3kPDRjAT4ST8SZdeh7XCbPVbySJ7ZmPlRWHyedzLA1wXN0NUf8yZYS4ELdUwVBYIXSjkNoKqfWm88cwuNr0g0teypjPtjDqCnXFt1pibwdfIXn479Y1neNAdvSpHcI4Ost-c7APCNxW2gqX-0BItZQearxRgKDdBQ7CGPAIky7dA0gPuKUpp_VCoqowKCXqkE9yKtRQGIISewtj2UkDRZePmzmYrUBXRzfYw"; | ||||
|     public static final String REFRESH_TOKEN_VALUE = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJ1c2VyIiwic2NvcGUiOlsib3BlbmlkIl0sImF0aSI6Ijc3NWUyZGFlLWFmM2YtNGE3YS1hMTk5LTczYmU1NTJiMWQ1ZCIsImV4cCI6MTQ5Njg2NDc0MywiYXV0aG9yaXRpZXMiOlsiUk9MRV9VU0VSIl0sImp0aSI6IjhmYjI2YTllLTdjYzQtNDFlMi1hNzBjLTk4MDc0N2U2YWFiOSIsImNsaWVudF9pZCI6IndlYl9hcHAifQ.q1-Df9_AFO6TJNiLKV2YwTjRbnd7qcXv52skXYnog5siHYRoR6cPtm6TNQ04iDAoIHljTSTNnD6DS3bHk41mV55gsSVxGReL8VCb_R8ZmhVL4-5yr90sfms0wFp6lgD2bPmZ-TXiS2Oe9wcbNWagy5RsEplZ-sbXu3tjmDao4FN35ojPsXmUs84XnNQH3Y_-PY9GjZG0JEfLQIvE0J5BkXS18Z015GKyA6GBIoLhAGBQQYyG9m10ld_a9fD5SmCyCF72Jad_pfP1u8Z_WyvO-wrlBvm2x-zBthreVrXU5mOb9795wJEP-xaw3dXYGjht_grcW4vKUFtj61JgZk98CQ"; | ||||
| @ -12,7 +12,7 @@ import org.springframework.test.util.ReflectionTestUtils; | ||||
|  * | ||||
|  * @see OAuth2CookieHelper | ||||
|  */ | ||||
| public class OAuth2CookieHelperTest { | ||||
| public class OAuth2CookieHelperUnitTest { | ||||
|     public static final String GET_COOKIE_DOMAIN_METHOD = "getCookieDomain"; | ||||
|     private OAuth2Properties oAuth2Properties; | ||||
|     private OAuth2CookieHelper cookieHelper; | ||||
| @ -51,7 +51,7 @@ public class LogsResourceIntTest { | ||||
|     public void changeLogs() throws Exception { | ||||
|         LoggerVM logger = new LoggerVM(); | ||||
|         logger.setLevel("INFO"); | ||||
|         logger.setName("ROOT"); | ||||
|         logger.setName("some.test.logger"); | ||||
| 
 | ||||
|         restLogsMockMvc.perform(put("/management/logs") | ||||
|             .contentType(TestUtil.APPLICATION_JSON_UTF8) | ||||
|  | ||||
| @ -21,6 +21,8 @@ eureka: | ||||
|         instanceId: gateway:${spring.application.instance-id:${random.value}} | ||||
| 
 | ||||
| spring: | ||||
|     main: | ||||
|         banner-mode: "off" | ||||
|     application: | ||||
|         name: gateway | ||||
|     cache: | ||||
| @ -93,7 +95,7 @@ jhipster: | ||||
|         authentication: | ||||
|             jwt: | ||||
|                 # This token must be encoded using Base64 (you can type `echo 'secret-key'|base64` on your command line) | ||||
|                 base64-secret:  | ||||
|                 base64-secret: | ||||
|                 # Token is valid 24 hours | ||||
|                 token-validity-in-seconds: 86400 | ||||
|     metrics: # DropWizard Metrics configuration, used by MetricsConfiguration | ||||
|  | ||||
| @ -1,6 +1,13 @@ | ||||
| <?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/maven-v4_0_0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
| 
 | ||||
|     <parent> | ||||
|         <artifactId>jhipster-uaa</artifactId> | ||||
|         <groupId>com.baeldung.jhipster</groupId> | ||||
|         <version>1.0.0-SNAPSHOT</version> | ||||
|     </parent> | ||||
| 
 | ||||
|     <groupId>com.baeldung.jhipster.quotes</groupId> | ||||
|     <artifactId>quotes</artifactId> | ||||
|     <version>0.0.1-SNAPSHOT</version> | ||||
| @ -399,15 +406,6 @@ | ||||
|                     </execution> | ||||
|                 </executions> | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-surefire-plugin</artifactId> | ||||
|                 <version>${maven-surefire-plugin.version}</version> | ||||
|                 <configuration> | ||||
|                     <!-- Force alphabetical order to have a reproducible build --> | ||||
|                     <runOrder>alphabetical</runOrder> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <groupId>org.jacoco</groupId> | ||||
|                 <artifactId>jacoco-maven-plugin</artifactId> | ||||
| @ -832,7 +830,7 @@ | ||||
|         </profile> | ||||
|         <!-- jhipster-needle-maven-add-profile --> | ||||
|     </profiles> | ||||
| 	 | ||||
| 
 | ||||
|     <properties> | ||||
|         <!-- Build properties --> | ||||
|         <maven.version>3.0.0</maven.version> | ||||
| @ -909,5 +907,5 @@ | ||||
| 
 | ||||
|         <!-- jhipster-needle-maven-property --> | ||||
|         <zalando.version>0.24.0</zalando.version> | ||||
|     </properties>	 | ||||
|     </properties> | ||||
| </project> | ||||
|  | ||||
| @ -38,7 +38,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. | ||||
|  * | ||||
|  * @see WebConfigurer | ||||
|  */ | ||||
| public class WebConfigurerTest { | ||||
| public class WebConfigurerUnitTest { | ||||
| 
 | ||||
|     private WebConfigurer webConfigurer; | ||||
| 
 | ||||
| @ -51,7 +51,7 @@ public class LogsResourceIntTest { | ||||
|     public void changeLogs() throws Exception { | ||||
|         LoggerVM logger = new LoggerVM(); | ||||
|         logger.setLevel("INFO"); | ||||
|         logger.setName("ROOT"); | ||||
|         logger.setName("some.test.logger"); | ||||
| 
 | ||||
|         restLogsMockMvc.perform(put("/management/logs") | ||||
|             .contentType(TestUtil.APPLICATION_JSON_UTF8) | ||||
|  | ||||
| @ -21,6 +21,8 @@ eureka: | ||||
|         instanceId: quotes:${spring.application.instance-id:${random.value}} | ||||
| 
 | ||||
| spring: | ||||
|     main: | ||||
|         banner-mode: "off" | ||||
|     application: | ||||
|         name: quotes | ||||
|     cache: | ||||
|  | ||||
| @ -1,6 +1,12 @@ | ||||
| <?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/maven-v4_0_0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <parent> | ||||
|         <artifactId>jhipster-uaa</artifactId> | ||||
|         <groupId>com.baeldung.jhipster</groupId> | ||||
|         <version>1.0.0-SNAPSHOT</version> | ||||
|     </parent> | ||||
| 
 | ||||
|     <groupId>com.baeldung.jhipster.uaa</groupId> | ||||
|     <artifactId>uaa</artifactId> | ||||
|     <version>0.0.1-SNAPSHOT</version> | ||||
| @ -399,15 +405,6 @@ | ||||
|                     </execution> | ||||
|                 </executions> | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-surefire-plugin</artifactId> | ||||
|                 <version>${maven-surefire-plugin.version}</version> | ||||
|                 <configuration> | ||||
|                     <!-- Force alphabetical order to have a reproducible build --> | ||||
|                     <runOrder>alphabetical</runOrder> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <groupId>org.jacoco</groupId> | ||||
|                 <artifactId>jacoco-maven-plugin</artifactId> | ||||
| @ -832,7 +829,7 @@ | ||||
|         </profile> | ||||
|         <!-- jhipster-needle-maven-add-profile --> | ||||
|     </profiles> | ||||
| 	 | ||||
| 
 | ||||
|     <properties> | ||||
|         <lifecycle.mapping.version>1.0.0</lifecycle.mapping.version> | ||||
|         <spring.web.version>0.24.0</spring.web.version> | ||||
| @ -911,5 +908,5 @@ | ||||
| 
 | ||||
|         <!-- jhipster-needle-maven-property --> | ||||
|     </properties> | ||||
| 	 | ||||
| 
 | ||||
| </project> | ||||
|  | ||||
| @ -38,7 +38,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. | ||||
|  * | ||||
|  * @see WebConfigurer | ||||
|  */ | ||||
| public class WebConfigurerTest { | ||||
| public class WebConfigurerUnitTest { | ||||
| 
 | ||||
|     private WebConfigurer webConfigurer; | ||||
| 
 | ||||
| @ -51,7 +51,7 @@ public class LogsResourceIntTest { | ||||
|     public void changeLogs() throws Exception { | ||||
|         LoggerVM logger = new LoggerVM(); | ||||
|         logger.setLevel("INFO"); | ||||
|         logger.setName("ROOT"); | ||||
|         logger.setName("some.test.logger"); | ||||
| 
 | ||||
|         restLogsMockMvc.perform(put("/management/logs") | ||||
|             .contentType(TestUtil.APPLICATION_JSON_UTF8) | ||||
|  | ||||
| @ -21,6 +21,8 @@ eureka: | ||||
|         instanceId: uaa:${spring.application.instance-id:${random.value}} | ||||
| 
 | ||||
| spring: | ||||
|     main: | ||||
|         banner-mode: "off" | ||||
|     application: | ||||
|         name: uaa | ||||
|     cache: | ||||
|  | ||||
| @ -9,7 +9,7 @@ | ||||
|     <packaging>pom</packaging> | ||||
| 
 | ||||
|     <parent> | ||||
|     <!-- Jhipster project is autogenerated and upgrading it will need a newly generated project.  | ||||
|     <!-- Jhipster project is autogenerated and upgrading it will need a newly generated project. | ||||
|         Also, we already have jhipster-5 which has new version of boot-2. So, this project should be left as a legacy version. --> | ||||
|         <artifactId>parent-boot-1</artifactId> | ||||
|         <groupId>com.baeldung</groupId> | ||||
| @ -17,11 +17,39 @@ | ||||
|         <relativePath>../parent-boot-1</relativePath> | ||||
|     </parent> | ||||
| 
 | ||||
|     <dependencyManagement> | ||||
|         <dependencies> | ||||
|             <dependency> | ||||
|                 <groupId>org.springframework.boot</groupId> | ||||
|                 <artifactId>spring-boot-starter-test</artifactId> | ||||
|                 <version>${spring-boot.version}</version> | ||||
|                 <exclusions> | ||||
|                     <exclusion> | ||||
|                         <groupId>com.vaadin.external.google</groupId> | ||||
|                         <artifactId>android-json</artifactId> | ||||
|                     </exclusion> | ||||
|                     <exclusion> | ||||
|                         <groupId>org.json</groupId> | ||||
|                         <artifactId>json</artifactId> | ||||
|                     </exclusion> | ||||
|                 </exclusions> | ||||
|                 <scope>test</scope> | ||||
|             </dependency> | ||||
|         </dependencies> | ||||
|     </dependencyManagement> | ||||
| 
 | ||||
|     <dependencies> | ||||
|         <dependency> | ||||
|             <groupId>org.hibernate</groupId> | ||||
|             <artifactId>hibernate-java8</artifactId> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>net.bytebuddy</groupId> | ||||
|             <artifactId>byte-buddy</artifactId> | ||||
|             <version>${byte-buddy.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
| 
 | ||||
|     <modules> | ||||
| @ -29,5 +57,5 @@ | ||||
|         <module>jhipster-microservice</module> | ||||
| 		<module>jhipster-uaa</module> | ||||
| 	</modules> | ||||
| 	 | ||||
| 
 | ||||
| </project> | ||||
|  | ||||
| @ -17,7 +17,22 @@ import com.sun.codemodel.JCodeModel; | ||||
| 
 | ||||
| public class JsonToJavaClassConversion { | ||||
| 
 | ||||
|     public Object convertJsonToJavaClass(URL inputJson, File outputJavaClassDirectory, String packageName, String className) throws IOException { | ||||
|     public static void main(String[] args) { | ||||
|         String packageName = "com.baeldung.jsontojavaclass.pojo"; | ||||
|         String basePath = "src/main/resources"; | ||||
|         File inputJson = new File(basePath + File.separator + "input.json"); | ||||
|         File outputPojoDirectory = new File(basePath + File.separator + "convertedPojo"); | ||||
|         outputPojoDirectory.mkdirs(); | ||||
|         try { | ||||
|             new JsonToJavaClassConversion().convertJsonToJavaClass(inputJson.toURI().toURL(), outputPojoDirectory, packageName, inputJson.getName().replace(".json", "")); | ||||
|         } catch (IOException e) { | ||||
|             System.out.println("Encountered issue while converting to pojo: " + e.getMessage()); | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     public void convertJsonToJavaClass(URL inputJsonUrl, File outputJavaClassDirectory, String packageName, String javaClassName) throws IOException { | ||||
|         JCodeModel jcodeModel = new JCodeModel(); | ||||
| 
 | ||||
|         GenerationConfig config = new DefaultGenerationConfig() { | ||||
| @ -33,10 +48,9 @@ public class JsonToJavaClassConversion { | ||||
|         }; | ||||
| 
 | ||||
|         SchemaMapper mapper = new SchemaMapper(new RuleFactory(config, new Jackson2Annotator(config), new SchemaStore()), new SchemaGenerator()); | ||||
|         mapper.generate(jcodeModel, className, packageName, inputJson); | ||||
|         mapper.generate(jcodeModel, javaClassName, packageName, inputJsonUrl); | ||||
| 
 | ||||
|         jcodeModel.build(outputJavaClassDirectory); | ||||
|         return mapper; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -5,9 +5,7 @@ import java.util.ArrayList; | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| import javax.annotation.Generated; | ||||
| 
 | ||||
| import com.fasterxml.jackson.annotation.JsonAnyGetter; | ||||
| import com.fasterxml.jackson.annotation.JsonAnySetter; | ||||
| import com.fasterxml.jackson.annotation.JsonIgnore; | ||||
| @ -16,7 +14,14 @@ import com.fasterxml.jackson.annotation.JsonProperty; | ||||
| import com.fasterxml.jackson.annotation.JsonPropertyOrder; | ||||
| 
 | ||||
| @JsonInclude(JsonInclude.Include.NON_NULL) | ||||
| @JsonPropertyOrder({ "name", "area", "author", "id", "salary", "topics" }) | ||||
| @JsonPropertyOrder({ | ||||
|     "name", | ||||
|     "area", | ||||
|     "author", | ||||
|     "id", | ||||
|     "salary", | ||||
|     "topics" | ||||
| }) | ||||
| @Generated("jsonschema2pojo") | ||||
| public class SamplePojo { | ||||
| 
 | ||||
| @ -143,40 +148,37 @@ public class SamplePojo { | ||||
|     @Override | ||||
|     public String toString() { | ||||
|         StringBuilder sb = new StringBuilder(); | ||||
|         sb.append(SamplePojo.class.getName()) | ||||
|             .append('@') | ||||
|             .append(Integer.toHexString(System.identityHashCode(this))) | ||||
|             .append('['); | ||||
|         sb.append(SamplePojo.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); | ||||
|         sb.append("name"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.name == null) ? "<null>" : this.name)); | ||||
|         sb.append(((this.name == null)?"<null>":this.name)); | ||||
|         sb.append(','); | ||||
|         sb.append("area"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.area == null) ? "<null>" : this.area)); | ||||
|         sb.append(((this.area == null)?"<null>":this.area)); | ||||
|         sb.append(','); | ||||
|         sb.append("author"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.author == null) ? "<null>" : this.author)); | ||||
|         sb.append(((this.author == null)?"<null>":this.author)); | ||||
|         sb.append(','); | ||||
|         sb.append("id"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.id == null) ? "<null>" : this.id)); | ||||
|         sb.append(((this.id == null)?"<null>":this.id)); | ||||
|         sb.append(','); | ||||
|         sb.append("salary"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.salary == null) ? "<null>" : this.salary)); | ||||
|         sb.append(((this.salary == null)?"<null>":this.salary)); | ||||
|         sb.append(','); | ||||
|         sb.append("topics"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.topics == null) ? "<null>" : this.topics)); | ||||
|         sb.append(((this.topics == null)?"<null>":this.topics)); | ||||
|         sb.append(','); | ||||
|         sb.append("additionalProperties"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.additionalProperties == null) ? "<null>" : this.additionalProperties)); | ||||
|         sb.append(((this.additionalProperties == null)?"<null>":this.additionalProperties)); | ||||
|         sb.append(','); | ||||
|         if (sb.charAt((sb.length() - 1)) == ',') { | ||||
|             sb.setCharAt((sb.length() - 1), ']'); | ||||
|         if (sb.charAt((sb.length()- 1)) == ',') { | ||||
|             sb.setCharAt((sb.length()- 1), ']'); | ||||
|         } else { | ||||
|             sb.append(']'); | ||||
|         } | ||||
| @ -186,13 +188,13 @@ public class SamplePojo { | ||||
|     @Override | ||||
|     public int hashCode() { | ||||
|         int result = 1; | ||||
|         result = ((result * 31) + ((this.area == null) ? 0 : this.area.hashCode())); | ||||
|         result = ((result * 31) + ((this.author == null) ? 0 : this.author.hashCode())); | ||||
|         result = ((result * 31) + ((this.topics == null) ? 0 : this.topics.hashCode())); | ||||
|         result = ((result * 31) + ((this.name == null) ? 0 : this.name.hashCode())); | ||||
|         result = ((result * 31) + ((this.id == null) ? 0 : this.id.hashCode())); | ||||
|         result = ((result * 31) + ((this.additionalProperties == null) ? 0 : this.additionalProperties.hashCode())); | ||||
|         result = ((result * 31) + ((this.salary == null) ? 0 : this.salary.hashCode())); | ||||
|         result = ((result* 31)+((this.area == null)? 0 :this.area.hashCode())); | ||||
|         result = ((result* 31)+((this.author == null)? 0 :this.author.hashCode())); | ||||
|         result = ((result* 31)+((this.topics == null)? 0 :this.topics.hashCode())); | ||||
|         result = ((result* 31)+((this.name == null)? 0 :this.name.hashCode())); | ||||
|         result = ((result* 31)+((this.id == null)? 0 :this.id.hashCode())); | ||||
|         result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode())); | ||||
|         result = ((result* 31)+((this.salary == null)? 0 :this.salary.hashCode())); | ||||
|         return result; | ||||
|     } | ||||
| 
 | ||||
| @ -205,10 +207,7 @@ public class SamplePojo { | ||||
|             return false; | ||||
|         } | ||||
|         SamplePojo rhs = ((SamplePojo) other); | ||||
|         return ((((((((this.area == rhs.area) || ((this.area != null) && this.area.equals(rhs.area))) && ((this.author == rhs.author) || ((this.author != null) && this.author.equals(rhs.author)))) | ||||
|             && ((this.topics == rhs.topics) || ((this.topics != null) && this.topics.equals(rhs.topics)))) && ((this.name == rhs.name) || ((this.name != null) && this.name.equals(rhs.name)))) | ||||
|             && ((this.id == rhs.id) || ((this.id != null) && this.id.equals(rhs.id)))) && ((this.additionalProperties == rhs.additionalProperties) || ((this.additionalProperties != null) && this.additionalProperties.equals(rhs.additionalProperties)))) | ||||
|             && ((this.salary == rhs.salary) || ((this.salary != null) && this.salary.equals(rhs.salary)))); | ||||
|         return ((((((((this.area == rhs.area)||((this.area!= null)&&this.area.equals(rhs.area)))&&((this.author == rhs.author)||((this.author!= null)&&this.author.equals(rhs.author))))&&((this.topics == rhs.topics)||((this.topics!= null)&&this.topics.equals(rhs.topics))))&&((this.name == rhs.name)||((this.name!= null)&&this.name.equals(rhs.name))))&&((this.id == rhs.id)||((this.id!= null)&&this.id.equals(rhs.id))))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties))))&&((this.salary == rhs.salary)||((this.salary!= null)&&this.salary.equals(rhs.salary)))); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -0,0 +1,119 @@ | ||||
| 
 | ||||
| package com.baeldung.jsontojavaclass.pojo; | ||||
| 
 | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
| import javax.annotation.Generated; | ||||
| import com.fasterxml.jackson.annotation.JsonAnyGetter; | ||||
| import com.fasterxml.jackson.annotation.JsonAnySetter; | ||||
| import com.fasterxml.jackson.annotation.JsonIgnore; | ||||
| import com.fasterxml.jackson.annotation.JsonInclude; | ||||
| import com.fasterxml.jackson.annotation.JsonProperty; | ||||
| import com.fasterxml.jackson.annotation.JsonPropertyOrder; | ||||
| 
 | ||||
| @JsonInclude(JsonInclude.Include.NON_NULL) | ||||
| @JsonPropertyOrder({ | ||||
|     "city", | ||||
|     "country" | ||||
| }) | ||||
| @Generated("jsonschema2pojo") | ||||
| public class Address { | ||||
| 
 | ||||
|     @JsonProperty("city") | ||||
|     private String city; | ||||
|     @JsonProperty("country") | ||||
|     private String country; | ||||
|     @JsonIgnore | ||||
|     private Map<String, Object> additionalProperties = new HashMap<String, Object>(); | ||||
| 
 | ||||
|     @JsonProperty("city") | ||||
|     public String getCity() { | ||||
|         return city; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("city") | ||||
|     public void setCity(String city) { | ||||
|         this.city = city; | ||||
|     } | ||||
| 
 | ||||
|     public Address withCity(String city) { | ||||
|         this.city = city; | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("country") | ||||
|     public String getCountry() { | ||||
|         return country; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("country") | ||||
|     public void setCountry(String country) { | ||||
|         this.country = country; | ||||
|     } | ||||
| 
 | ||||
|     public Address withCountry(String country) { | ||||
|         this.country = country; | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     @JsonAnyGetter | ||||
|     public Map<String, Object> getAdditionalProperties() { | ||||
|         return this.additionalProperties; | ||||
|     } | ||||
| 
 | ||||
|     @JsonAnySetter | ||||
|     public void setAdditionalProperty(String name, Object value) { | ||||
|         this.additionalProperties.put(name, value); | ||||
|     } | ||||
| 
 | ||||
|     public Address withAdditionalProperty(String name, Object value) { | ||||
|         this.additionalProperties.put(name, value); | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public String toString() { | ||||
|         StringBuilder sb = new StringBuilder(); | ||||
|         sb.append(Address.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); | ||||
|         sb.append("city"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.city == null)?"<null>":this.city)); | ||||
|         sb.append(','); | ||||
|         sb.append("country"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.country == null)?"<null>":this.country)); | ||||
|         sb.append(','); | ||||
|         sb.append("additionalProperties"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.additionalProperties == null)?"<null>":this.additionalProperties)); | ||||
|         sb.append(','); | ||||
|         if (sb.charAt((sb.length()- 1)) == ',') { | ||||
|             sb.setCharAt((sb.length()- 1), ']'); | ||||
|         } else { | ||||
|             sb.append(']'); | ||||
|         } | ||||
|         return sb.toString(); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public int hashCode() { | ||||
|         int result = 1; | ||||
|         result = ((result* 31)+((this.country == null)? 0 :this.country.hashCode())); | ||||
|         result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode())); | ||||
|         result = ((result* 31)+((this.city == null)? 0 :this.city.hashCode())); | ||||
|         return result; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public boolean equals(Object other) { | ||||
|         if (other == this) { | ||||
|             return true; | ||||
|         } | ||||
|         if ((other instanceof Address) == false) { | ||||
|             return false; | ||||
|         } | ||||
|         Address rhs = ((Address) other); | ||||
|         return ((((this.country == rhs.country)||((this.country!= null)&&this.country.equals(rhs.country)))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties))))&&((this.city == rhs.city)||((this.city!= null)&&this.city.equals(rhs.city)))); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,213 @@ | ||||
| 
 | ||||
| package com.baeldung.jsontojavaclass.pojo; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import javax.annotation.Generated; | ||||
| import com.fasterxml.jackson.annotation.JsonAnyGetter; | ||||
| import com.fasterxml.jackson.annotation.JsonAnySetter; | ||||
| import com.fasterxml.jackson.annotation.JsonIgnore; | ||||
| import com.fasterxml.jackson.annotation.JsonInclude; | ||||
| import com.fasterxml.jackson.annotation.JsonProperty; | ||||
| import com.fasterxml.jackson.annotation.JsonPropertyOrder; | ||||
| 
 | ||||
| @JsonInclude(JsonInclude.Include.NON_NULL) | ||||
| @JsonPropertyOrder({ | ||||
|     "name", | ||||
|     "area", | ||||
|     "author", | ||||
|     "id", | ||||
|     "topics", | ||||
|     "address" | ||||
| }) | ||||
| @Generated("jsonschema2pojo") | ||||
| public class Input { | ||||
| 
 | ||||
|     @JsonProperty("name") | ||||
|     private String name; | ||||
|     @JsonProperty("area") | ||||
|     private String area; | ||||
|     @JsonProperty("author") | ||||
|     private String author; | ||||
|     @JsonProperty("id") | ||||
|     private Integer id; | ||||
|     @JsonProperty("topics") | ||||
|     private List<String> topics = new ArrayList<String>(); | ||||
|     @JsonProperty("address") | ||||
|     private Address address; | ||||
|     @JsonIgnore | ||||
|     private Map<String, Object> additionalProperties = new HashMap<String, Object>(); | ||||
| 
 | ||||
|     @JsonProperty("name") | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("name") | ||||
|     public void setName(String name) { | ||||
|         this.name = name; | ||||
|     } | ||||
| 
 | ||||
|     public Input withName(String name) { | ||||
|         this.name = name; | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("area") | ||||
|     public String getArea() { | ||||
|         return area; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("area") | ||||
|     public void setArea(String area) { | ||||
|         this.area = area; | ||||
|     } | ||||
| 
 | ||||
|     public Input withArea(String area) { | ||||
|         this.area = area; | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("author") | ||||
|     public String getAuthor() { | ||||
|         return author; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("author") | ||||
|     public void setAuthor(String author) { | ||||
|         this.author = author; | ||||
|     } | ||||
| 
 | ||||
|     public Input withAuthor(String author) { | ||||
|         this.author = author; | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("id") | ||||
|     public Integer getId() { | ||||
|         return id; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("id") | ||||
|     public void setId(Integer id) { | ||||
|         this.id = id; | ||||
|     } | ||||
| 
 | ||||
|     public Input withId(Integer id) { | ||||
|         this.id = id; | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("topics") | ||||
|     public List<String> getTopics() { | ||||
|         return topics; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("topics") | ||||
|     public void setTopics(List<String> topics) { | ||||
|         this.topics = topics; | ||||
|     } | ||||
| 
 | ||||
|     public Input withTopics(List<String> topics) { | ||||
|         this.topics = topics; | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("address") | ||||
|     public Address getAddress() { | ||||
|         return address; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("address") | ||||
|     public void setAddress(Address address) { | ||||
|         this.address = address; | ||||
|     } | ||||
| 
 | ||||
|     public Input withAddress(Address address) { | ||||
|         this.address = address; | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     @JsonAnyGetter | ||||
|     public Map<String, Object> getAdditionalProperties() { | ||||
|         return this.additionalProperties; | ||||
|     } | ||||
| 
 | ||||
|     @JsonAnySetter | ||||
|     public void setAdditionalProperty(String name, Object value) { | ||||
|         this.additionalProperties.put(name, value); | ||||
|     } | ||||
| 
 | ||||
|     public Input withAdditionalProperty(String name, Object value) { | ||||
|         this.additionalProperties.put(name, value); | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public String toString() { | ||||
|         StringBuilder sb = new StringBuilder(); | ||||
|         sb.append(Input.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); | ||||
|         sb.append("name"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.name == null)?"<null>":this.name)); | ||||
|         sb.append(','); | ||||
|         sb.append("area"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.area == null)?"<null>":this.area)); | ||||
|         sb.append(','); | ||||
|         sb.append("author"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.author == null)?"<null>":this.author)); | ||||
|         sb.append(','); | ||||
|         sb.append("id"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.id == null)?"<null>":this.id)); | ||||
|         sb.append(','); | ||||
|         sb.append("topics"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.topics == null)?"<null>":this.topics)); | ||||
|         sb.append(','); | ||||
|         sb.append("address"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.address == null)?"<null>":this.address)); | ||||
|         sb.append(','); | ||||
|         sb.append("additionalProperties"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.additionalProperties == null)?"<null>":this.additionalProperties)); | ||||
|         sb.append(','); | ||||
|         if (sb.charAt((sb.length()- 1)) == ',') { | ||||
|             sb.setCharAt((sb.length()- 1), ']'); | ||||
|         } else { | ||||
|             sb.append(']'); | ||||
|         } | ||||
|         return sb.toString(); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public int hashCode() { | ||||
|         int result = 1; | ||||
|         result = ((result* 31)+((this.area == null)? 0 :this.area.hashCode())); | ||||
|         result = ((result* 31)+((this.address == null)? 0 :this.address.hashCode())); | ||||
|         result = ((result* 31)+((this.author == null)? 0 :this.author.hashCode())); | ||||
|         result = ((result* 31)+((this.topics == null)? 0 :this.topics.hashCode())); | ||||
|         result = ((result* 31)+((this.name == null)? 0 :this.name.hashCode())); | ||||
|         result = ((result* 31)+((this.id == null)? 0 :this.id.hashCode())); | ||||
|         result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode())); | ||||
|         return result; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public boolean equals(Object other) { | ||||
|         if (other == this) { | ||||
|             return true; | ||||
|         } | ||||
|         if ((other instanceof Input) == false) { | ||||
|             return false; | ||||
|         } | ||||
|         Input rhs = ((Input) other); | ||||
|         return ((((((((this.area == rhs.area)||((this.area!= null)&&this.area.equals(rhs.area)))&&((this.address == rhs.address)||((this.address!= null)&&this.address.equals(rhs.address))))&&((this.author == rhs.author)||((this.author!= null)&&this.author.equals(rhs.author))))&&((this.topics == rhs.topics)||((this.topics!= null)&&this.topics.equals(rhs.topics))))&&((this.name == rhs.name)||((this.name!= null)&&this.name.equals(rhs.name))))&&((this.id == rhs.id)||((this.id!= null)&&this.id.equals(rhs.id))))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties)))); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										16
									
								
								json-2/src/main/resources/input.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								json-2/src/main/resources/input.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | ||||
| { | ||||
|   "name": "Baeldung", | ||||
|   "area": "tech blogs", | ||||
|   "author": "Eugen", | ||||
|   "id": 32134, | ||||
|   "topics": [ | ||||
|     "java", | ||||
|     "kotlin", | ||||
|     "cs", | ||||
|     "linux" | ||||
|   ], | ||||
|   "address": { | ||||
|     "city": "Bucharest", | ||||
|     "country": "Romania" | ||||
|   } | ||||
| } | ||||
| @ -3,6 +3,7 @@ package com.baeldung.jsontojavaclass; | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
| import java.net.MalformedURLException; | ||||
| import java.util.Arrays; | ||||
| 
 | ||||
| import org.junit.jupiter.api.Assertions; | ||||
| import org.junit.jupiter.api.Test; | ||||
| @ -21,17 +22,16 @@ class JsonToJavaClassConversionUnitTest { | ||||
|         File inputJson = new File(jsonPath + "sample_input.json"); | ||||
| 
 | ||||
|         // create the local directory for generating the Java Class file | ||||
|         String outputPath = "src/main/java/"; | ||||
|         String outputPath = "src/test/resources/"; | ||||
|         File outputJavaClassDirectory = new File(outputPath); | ||||
|         outputJavaClassDirectory.mkdirs(); | ||||
| 
 | ||||
|         String className = "SamplePojo"; | ||||
|         String javaClassName = "SamplePojo"; | ||||
| 
 | ||||
|         Object object = jsonToJavaConversion.convertJsonToJavaClass(inputJson.toURI() | ||||
|             .toURL(), outputJavaClassDirectory, packageName, className); | ||||
|         System.out.println(object); | ||||
|         jsonToJavaConversion.convertJsonToJavaClass(inputJson.toURI() | ||||
|                 .toURL(), outputJavaClassDirectory, packageName, javaClassName); | ||||
| 
 | ||||
|         Assertions.assertNotNull(object); | ||||
|         File outputJavaClassPath = new File(outputPath + packageName.replace(".", "/")); | ||||
|         Assertions.assertTrue(Arrays.stream(outputJavaClassPath.listFiles()).peek(System.out::println).anyMatch(file -> (javaClassName+".java").equalsIgnoreCase(file.getName()))); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -0,0 +1,213 @@ | ||||
| 
 | ||||
| package com.baeldung.jsontojavaclass.pojo; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import javax.annotation.Generated; | ||||
| import com.fasterxml.jackson.annotation.JsonAnyGetter; | ||||
| import com.fasterxml.jackson.annotation.JsonAnySetter; | ||||
| import com.fasterxml.jackson.annotation.JsonIgnore; | ||||
| import com.fasterxml.jackson.annotation.JsonInclude; | ||||
| import com.fasterxml.jackson.annotation.JsonProperty; | ||||
| import com.fasterxml.jackson.annotation.JsonPropertyOrder; | ||||
| 
 | ||||
| @JsonInclude(JsonInclude.Include.NON_NULL) | ||||
| @JsonPropertyOrder({ | ||||
|     "name", | ||||
|     "area", | ||||
|     "author", | ||||
|     "id", | ||||
|     "salary", | ||||
|     "topics" | ||||
| }) | ||||
| @Generated("jsonschema2pojo") | ||||
| public class SamplePojo { | ||||
| 
 | ||||
|     @JsonProperty("name") | ||||
|     private String name; | ||||
|     @JsonProperty("area") | ||||
|     private String area; | ||||
|     @JsonProperty("author") | ||||
|     private String author; | ||||
|     @JsonProperty("id") | ||||
|     private Integer id; | ||||
|     @JsonProperty("salary") | ||||
|     private Integer salary; | ||||
|     @JsonProperty("topics") | ||||
|     private List<String> topics = new ArrayList<String>(); | ||||
|     @JsonIgnore | ||||
|     private Map<String, Object> additionalProperties = new HashMap<String, Object>(); | ||||
| 
 | ||||
|     @JsonProperty("name") | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("name") | ||||
|     public void setName(String name) { | ||||
|         this.name = name; | ||||
|     } | ||||
| 
 | ||||
|     public SamplePojo withName(String name) { | ||||
|         this.name = name; | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("area") | ||||
|     public String getArea() { | ||||
|         return area; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("area") | ||||
|     public void setArea(String area) { | ||||
|         this.area = area; | ||||
|     } | ||||
| 
 | ||||
|     public SamplePojo withArea(String area) { | ||||
|         this.area = area; | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("author") | ||||
|     public String getAuthor() { | ||||
|         return author; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("author") | ||||
|     public void setAuthor(String author) { | ||||
|         this.author = author; | ||||
|     } | ||||
| 
 | ||||
|     public SamplePojo withAuthor(String author) { | ||||
|         this.author = author; | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("id") | ||||
|     public Integer getId() { | ||||
|         return id; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("id") | ||||
|     public void setId(Integer id) { | ||||
|         this.id = id; | ||||
|     } | ||||
| 
 | ||||
|     public SamplePojo withId(Integer id) { | ||||
|         this.id = id; | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("salary") | ||||
|     public Integer getSalary() { | ||||
|         return salary; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("salary") | ||||
|     public void setSalary(Integer salary) { | ||||
|         this.salary = salary; | ||||
|     } | ||||
| 
 | ||||
|     public SamplePojo withSalary(Integer salary) { | ||||
|         this.salary = salary; | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("topics") | ||||
|     public List<String> getTopics() { | ||||
|         return topics; | ||||
|     } | ||||
| 
 | ||||
|     @JsonProperty("topics") | ||||
|     public void setTopics(List<String> topics) { | ||||
|         this.topics = topics; | ||||
|     } | ||||
| 
 | ||||
|     public SamplePojo withTopics(List<String> topics) { | ||||
|         this.topics = topics; | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     @JsonAnyGetter | ||||
|     public Map<String, Object> getAdditionalProperties() { | ||||
|         return this.additionalProperties; | ||||
|     } | ||||
| 
 | ||||
|     @JsonAnySetter | ||||
|     public void setAdditionalProperty(String name, Object value) { | ||||
|         this.additionalProperties.put(name, value); | ||||
|     } | ||||
| 
 | ||||
|     public SamplePojo withAdditionalProperty(String name, Object value) { | ||||
|         this.additionalProperties.put(name, value); | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public String toString() { | ||||
|         StringBuilder sb = new StringBuilder(); | ||||
|         sb.append(SamplePojo.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); | ||||
|         sb.append("name"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.name == null)?"<null>":this.name)); | ||||
|         sb.append(','); | ||||
|         sb.append("area"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.area == null)?"<null>":this.area)); | ||||
|         sb.append(','); | ||||
|         sb.append("author"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.author == null)?"<null>":this.author)); | ||||
|         sb.append(','); | ||||
|         sb.append("id"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.id == null)?"<null>":this.id)); | ||||
|         sb.append(','); | ||||
|         sb.append("salary"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.salary == null)?"<null>":this.salary)); | ||||
|         sb.append(','); | ||||
|         sb.append("topics"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.topics == null)?"<null>":this.topics)); | ||||
|         sb.append(','); | ||||
|         sb.append("additionalProperties"); | ||||
|         sb.append('='); | ||||
|         sb.append(((this.additionalProperties == null)?"<null>":this.additionalProperties)); | ||||
|         sb.append(','); | ||||
|         if (sb.charAt((sb.length()- 1)) == ',') { | ||||
|             sb.setCharAt((sb.length()- 1), ']'); | ||||
|         } else { | ||||
|             sb.append(']'); | ||||
|         } | ||||
|         return sb.toString(); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public int hashCode() { | ||||
|         int result = 1; | ||||
|         result = ((result* 31)+((this.area == null)? 0 :this.area.hashCode())); | ||||
|         result = ((result* 31)+((this.author == null)? 0 :this.author.hashCode())); | ||||
|         result = ((result* 31)+((this.topics == null)? 0 :this.topics.hashCode())); | ||||
|         result = ((result* 31)+((this.name == null)? 0 :this.name.hashCode())); | ||||
|         result = ((result* 31)+((this.id == null)? 0 :this.id.hashCode())); | ||||
|         result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode())); | ||||
|         result = ((result* 31)+((this.salary == null)? 0 :this.salary.hashCode())); | ||||
|         return result; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public boolean equals(Object other) { | ||||
|         if (other == this) { | ||||
|             return true; | ||||
|         } | ||||
|         if ((other instanceof SamplePojo) == false) { | ||||
|             return false; | ||||
|         } | ||||
|         SamplePojo rhs = ((SamplePojo) other); | ||||
|         return ((((((((this.area == rhs.area)||((this.area!= null)&&this.area.equals(rhs.area)))&&((this.author == rhs.author)||((this.author!= null)&&this.author.equals(rhs.author))))&&((this.topics == rhs.topics)||((this.topics!= null)&&this.topics.equals(rhs.topics))))&&((this.name == rhs.name)||((this.name!= null)&&this.name.equals(rhs.name))))&&((this.id == rhs.id)||((this.id!= null)&&this.id.equals(rhs.id))))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties))))&&((this.salary == rhs.salary)||((this.salary!= null)&&this.salary.equals(rhs.salary)))); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										3
									
								
								ksqldb/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								ksqldb/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| ### Relevant Articles: | ||||
| 
 | ||||
| - [Introduction to ksqlDB](https://www.baeldung.com/ksqldb) | ||||
| @ -1,3 +1,4 @@ | ||||
| ## Relevant Articles: | ||||
| 
 | ||||
| - [Creating a Kubertes Admission Controller in Java](https://www.baeldung.com/java-kubernetes-admission-controller) | ||||
| - [Access Control Models](https://www.baeldung.com/java-access-control-models) | ||||
|  | ||||
| @ -78,6 +78,29 @@ | ||||
|             <artifactId>sshd-core</artifactId> | ||||
|             <version>${apache-mina.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.xacml4j</groupId> | ||||
|             <artifactId>xacml-core</artifactId> | ||||
|             <version>${xacml4j.version}</version> | ||||
|             <exclusions> | ||||
|                 <exclusion> | ||||
|                     <groupId>org.slf4j</groupId> | ||||
|                     <artifactId>slf4j-log4j12</artifactId> | ||||
|                 </exclusion> | ||||
|             </exclusions> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.xacml4j</groupId> | ||||
|             <artifactId>xacml-test</artifactId> | ||||
|             <version>${xacml4j.version}</version> | ||||
|             <scope>test</scope> | ||||
|             <exclusions> | ||||
|                 <exclusion> | ||||
|                     <groupId>org.slf4j</groupId> | ||||
|                     <artifactId>slf4j-log4j12</artifactId> | ||||
|                 </exclusion> | ||||
|             </exclusions> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
| 
 | ||||
|     <properties> | ||||
| @ -90,6 +113,7 @@ | ||||
|         <jsch.version>0.1.55</jsch.version> | ||||
|         <apache-mina.version>2.5.1</apache-mina.version> | ||||
|         <spring-security-oauth2.version>2.4.0.RELEASE</spring-security-oauth2.version> | ||||
|         <xacml4j.version>1.4.0</xacml4j.version> | ||||
|     </properties> | ||||
| 
 | ||||
| </project> | ||||
| @ -2,9 +2,11 @@ package com.baeldung.scribejava; | ||||
| 
 | ||||
| import org.springframework.boot.SpringApplication; | ||||
| import org.springframework.boot.autoconfigure.SpringBootApplication; | ||||
| import org.springframework.boot.web.servlet.ServletComponentScan; | ||||
| 
 | ||||
| 
 | ||||
| @SpringBootApplication | ||||
| @ServletComponentScan | ||||
| public class ScribejavaApplication { | ||||
| 
 | ||||
|     public static void main(String[] args) { | ||||
|  | ||||
| @ -0,0 +1,27 @@ | ||||
| package com.baeldung.scribejava.controller; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| 
 | ||||
| import javax.annotation.security.DeclareRoles; | ||||
| import javax.annotation.security.RolesAllowed; | ||||
| import javax.servlet.ServletException; | ||||
| import javax.servlet.annotation.HttpConstraint; | ||||
| import javax.servlet.annotation.ServletSecurity; | ||||
| import javax.servlet.annotation.WebServlet; | ||||
| import javax.servlet.http.HttpServlet; | ||||
| import javax.servlet.http.HttpServletRequest; | ||||
| import javax.servlet.http.HttpServletResponse; | ||||
| 
 | ||||
| @WebServlet(name="rbac", urlPatterns = {"/protected"}) | ||||
| @DeclareRoles("USER") | ||||
| @ServletSecurity( | ||||
|     @HttpConstraint(rolesAllowed = "USER") | ||||
| ) | ||||
| public class RBACController  extends HttpServlet { | ||||
| 
 | ||||
|     private static final long serialVersionUID = 1L; | ||||
| 
 | ||||
|     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { | ||||
|         resp.getWriter().println("Hello, USER"); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,233 @@ | ||||
| package com.baeldung.xacml4j; | ||||
| 
 | ||||
| import static org.junit.Assert.assertEquals; | ||||
| import static org.junit.Assert.assertNotNull; | ||||
| import static org.junit.Assert.assertTrue; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import org.junit.Test; | ||||
| import org.xacml4j.v20.Xacml20TestUtility; | ||||
| import org.xacml4j.v30.Attribute; | ||||
| import org.xacml4j.v30.Categories; | ||||
| import org.xacml4j.v30.Category; | ||||
| import org.xacml4j.v30.CompositeDecisionRule; | ||||
| import org.xacml4j.v30.Decision; | ||||
| import org.xacml4j.v30.Entity; | ||||
| import org.xacml4j.v30.RequestContext; | ||||
| import org.xacml4j.v30.ResponseContext; | ||||
| import org.xacml4j.v30.Result; | ||||
| import org.xacml4j.v30.XacmlPolicyTestSupport; | ||||
| import org.xacml4j.v30.pdp.PolicyDecisionPoint; | ||||
| import org.xacml4j.v30.pdp.PolicyDecisionPointBuilder; | ||||
| import org.xacml4j.v30.spi.combine.DecisionCombiningAlgorithmProviderBuilder; | ||||
| import org.xacml4j.v30.spi.function.FunctionProviderBuilder; | ||||
| import org.xacml4j.v30.spi.pip.PolicyInformationPointBuilder; | ||||
| import org.xacml4j.v30.spi.repository.InMemoryPolicyRepository; | ||||
| import org.xacml4j.v30.spi.repository.PolicyRepository; | ||||
| import org.xacml4j.v30.types.DoubleExp; | ||||
| import org.xacml4j.v30.types.StringExp; | ||||
| import org.xacml4j.v30.types.TimeExp; | ||||
| 
 | ||||
| public class NightlyWithdrawalPolicyUnitTest extends XacmlPolicyTestSupport { | ||||
|      | ||||
|     private static final String POLICY_SET = "xacml4j/NightlyWithdrawalsPolicy.xml"; | ||||
| 
 | ||||
|     @Test | ||||
|     public void testWhenNightlyWithdrawalOver500_thenFail() throws Exception { | ||||
| 
 | ||||
|         PolicyDecisionPoint pdp = buildPDP(POLICY_SET); | ||||
| 
 | ||||
|         // Action category | ||||
|         Attribute actionAttribute = Attribute.builder("urn:oasis:names:tc:xacml:1.0:action:action-id") | ||||
|             .value(StringExp.of("withdrawal")) | ||||
|             .build(); | ||||
|         Entity actionEntity = Entity.builder() | ||||
|             .attribute(actionAttribute) | ||||
|             .build(); | ||||
|         Category actionCategory = Category.builder(Categories.ACTION) | ||||
|             .entity(actionEntity) | ||||
|             .build(); | ||||
| 
 | ||||
|         // Environment Category | ||||
|         Attribute timeAttribute = Attribute.builder("urn:oasis:names:tc:xacml:1.0:environment:current-time") | ||||
|             .includeInResult(false) | ||||
|             .value(TimeExp.of("21:00:00")) | ||||
|             .build(); | ||||
|         Entity timeEntity = Entity.builder() | ||||
|             .attribute(timeAttribute) | ||||
|             .build(); | ||||
| 
 | ||||
|         Category environmentCategory = Category.builder(Categories.ENVIRONMENT) | ||||
|             .entity(timeEntity) | ||||
|             .build(); | ||||
| 
 | ||||
|         // ATM category | ||||
|         Attribute amountAttribute = Attribute.builder("urn:baeldung:atm:withdrawal:amount") | ||||
|             .value(DoubleExp.of("1200.00")) | ||||
|             .build(); | ||||
|         Entity atmEntity = Entity.builder() | ||||
|             .attribute(amountAttribute) | ||||
|             .build(); | ||||
| 
 | ||||
|         Category atmCategory = Category.builder(Categories.parse("urn:baeldung:atm:withdrawal")) | ||||
|             .entity(atmEntity) | ||||
|             .build(); | ||||
| 
 | ||||
|         RequestContext request = RequestContext.builder() | ||||
|             .attributes(actionCategory, environmentCategory, atmCategory) | ||||
|             .build(); | ||||
| 
 | ||||
|         ResponseContext response = pdp.decide(request); | ||||
|         assertNotNull(response); | ||||
|         assertTrue("Shoud have at least one result", response.getResults() != null && !response.getResults() | ||||
|             .isEmpty()); | ||||
| 
 | ||||
|         Result result = response.getResults() | ||||
|             .iterator() | ||||
|             .next(); | ||||
|         assertTrue("Evaluation should succeed", result.getStatus() | ||||
|             .isSuccess()); | ||||
|         assertEquals("Should DENY withdrawal", Decision.DENY, result.getDecision()); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void testWhenNightlyWithdrawalUnder500_thenSuccess() throws Exception { | ||||
| 
 | ||||
|         PolicyDecisionPoint pdp = buildPDP(POLICY_SET); | ||||
| 
 | ||||
|         // Action category | ||||
|         Attribute actionAttribute = Attribute.builder("urn:oasis:names:tc:xacml:1.0:action:action-id") | ||||
|             .includeInResult(false) | ||||
|             .value(StringExp.of("withdrawal")) | ||||
|             .build(); | ||||
|         Entity actionEntity = Entity.builder() | ||||
|             .attribute(actionAttribute) | ||||
|             .build(); | ||||
|         Category actionCategory = Category.builder(Categories.ACTION) | ||||
|             .entity(actionEntity) | ||||
|             .build(); | ||||
| 
 | ||||
|         // Environment Category | ||||
|         Attribute timeAttribute = Attribute.builder("urn:oasis:names:tc:xacml:1.0:environment:current-time") | ||||
|             .includeInResult(false) | ||||
|             .value(TimeExp.of("21:00:00")) | ||||
|             .build(); | ||||
|         Entity timeEntity = Entity.builder() | ||||
|             .attribute(timeAttribute) | ||||
|             .build(); | ||||
|         Category environmentCategory = Category.builder(Categories.ENVIRONMENT) | ||||
|             .entity(timeEntity) | ||||
|             .build(); | ||||
| 
 | ||||
|         // ATM category | ||||
|         Attribute amountAttribute = Attribute.builder("urn:baeldung:atm:withdrawal:amount") | ||||
|             .value(DoubleExp.of("499.00")) | ||||
|             .build(); | ||||
|         Entity atmEntity = Entity.builder() | ||||
|           .attribute(amountAttribute) | ||||
|           .build(); | ||||
|         Category atmCategory = Category.builder(Categories.parse("urn:baeldung:atm:withdrawal")) | ||||
|           .entity(atmEntity) | ||||
|           .build(); | ||||
| 
 | ||||
|         RequestContext request = RequestContext.builder() | ||||
|           .attributes(actionCategory, environmentCategory, atmCategory) | ||||
|           .build(); | ||||
| 
 | ||||
|         ResponseContext response = pdp.decide(request); | ||||
|         assertNotNull(response); | ||||
|         assertTrue("Shoud have at least one result",  | ||||
|           response.getResults() != null && !response.getResults().isEmpty()); | ||||
| 
 | ||||
|         Result result = response.getResults().iterator().next(); | ||||
|         assertTrue("Evaluation should succeed", result.getStatus().isSuccess()); | ||||
|         assertEquals("Should PERMIT withdrawal", Decision.PERMIT, result.getDecision()); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void testWhenBusinessHoursWithdrawalOver500_thenSuccess() throws Exception { | ||||
| 
 | ||||
|         PolicyDecisionPoint pdp = buildPDP(POLICY_SET); | ||||
| 
 | ||||
|         // Action category | ||||
|         Attribute actionAttribute = Attribute.builder("urn:oasis:names:tc:xacml:1.0:action:action-id") | ||||
|           .includeInResult(false) | ||||
|           .value(StringExp.of("withdrawal")) | ||||
|           .build(); | ||||
|         Entity actionEntity = Entity.builder() | ||||
|           .attribute(actionAttribute) | ||||
|           .build(); | ||||
|         Category actionCategory = Category.builder(Categories.ACTION) | ||||
|           .entity(actionEntity) | ||||
|           .build(); | ||||
| 
 | ||||
|         // Environment Category | ||||
|         Attribute timeAttribute = Attribute.builder("urn:oasis:names:tc:xacml:1.0:environment:current-time") | ||||
|           .includeInResult(false) | ||||
|           .value(TimeExp.of("12:00:00")) | ||||
|           .build(); | ||||
|         Entity timeEntity = Entity.builder() | ||||
|           .attribute(timeAttribute) | ||||
|           .build(); | ||||
|         Category environmentCategory = Category.builder(Categories.ENVIRONMENT) | ||||
|           .entity(timeEntity) | ||||
|           .build(); | ||||
| 
 | ||||
|         // ATM category | ||||
|         Attribute amountAttribute = Attribute.builder("urn:baeldung:atm:withdrawal:amount") | ||||
|           .value(DoubleExp.of("2000.00")) | ||||
|           .build(); | ||||
|         Entity atmEntity = Entity.builder() | ||||
|           .attribute(amountAttribute) | ||||
|           .build(); | ||||
| 
 | ||||
|         Category atmCategory = Category.builder(Categories.parse("urn:baeldung:atm:withdrawal")) | ||||
|           .entity(atmEntity) | ||||
|           .build(); | ||||
| 
 | ||||
|         RequestContext request = RequestContext.builder() | ||||
|           .attributes(actionCategory, environmentCategory, atmCategory) | ||||
|           .build(); | ||||
| 
 | ||||
|         ResponseContext response = pdp.decide(request); | ||||
|         assertNotNull(response); | ||||
|         assertTrue("Shoud have at least one result", response.getResults() != null && !response.getResults() | ||||
|           .isEmpty()); | ||||
| 
 | ||||
|         Result result = response.getResults() | ||||
|           .iterator() | ||||
|           .next(); | ||||
|         assertTrue("Evaluation should succeed", result.getStatus().isSuccess()); | ||||
|         assertEquals("Should PERMIT withdrawal", Decision.PERMIT, result.getDecision()); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     private PolicyDecisionPoint buildPDP(String... policyResources) throws Exception { | ||||
|         PolicyRepository repository = new InMemoryPolicyRepository("tes-repository", FunctionProviderBuilder.builder() | ||||
|           .defaultFunctions() | ||||
|           .build(), | ||||
|         DecisionCombiningAlgorithmProviderBuilder.builder() | ||||
|             .withDefaultAlgorithms() | ||||
|             .create()); | ||||
| 
 | ||||
|         List<CompositeDecisionRule> policies = new ArrayList<CompositeDecisionRule>(policyResources.length); | ||||
|         for (String policyResource : policyResources) { | ||||
|             CompositeDecisionRule policy = repository.importPolicy(Xacml20TestUtility.getClasspathResource(policyResource)); | ||||
|             log.info("Policy: {}", policy); | ||||
|             policies.add(policy); | ||||
|         } | ||||
| 
 | ||||
|         return PolicyDecisionPointBuilder.builder("testPdp") | ||||
|           .policyRepository(repository) | ||||
|           .pip(PolicyInformationPointBuilder.builder("testPip") | ||||
|           .defaultResolvers() | ||||
|           .build()) | ||||
|           .rootPolicy(policies.get(0)) | ||||
|           .build(); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,137 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <Policy xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17"  | ||||
|   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  | ||||
|   xsi:schemaLocation="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17 http://docs.oasis-open.org/xacml/3.0/xacml-core-v3-schema-wd-17.xsd"  | ||||
|   PolicyId="urn:baeldung:atm:WithdrawalPolicy" | ||||
|   Version="1.0"  | ||||
|   RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:deny-overrides"> | ||||
|     <Description> | ||||
|        Withdrawal policy example | ||||
|     </Description> | ||||
|     <Target/> | ||||
|     <Rule RuleId="urn:oasis:names:tc:baeldung:WithDrawalPolicy:Rule1" Effect="Deny"> | ||||
|         <Description> | ||||
| Deny withdrawals over $500 between 20:00 and 08:00 | ||||
|         </Description> | ||||
|         <Target> | ||||
|             <AnyOf> | ||||
|                 <AllOf> | ||||
|                     <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal"> | ||||
|                         <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">withdrawal</AttributeValue> | ||||
|                         <AttributeDesignator  | ||||
|                             DataType="http://www.w3.org/2001/XMLSchema#string"  | ||||
|                             MustBePresent="true"  | ||||
|                             Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action"  | ||||
|                             AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id"/> | ||||
|                     </Match> | ||||
|                 </AllOf> | ||||
|             </AnyOf> | ||||
|         </Target> | ||||
|         <Condition> | ||||
|             <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:and"> | ||||
|                 <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:not"> | ||||
|                     <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:time-in-range"> | ||||
|                         <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:time-one-and-only"> | ||||
|                             <AttributeDesignator | ||||
|                                 DataType="http://www.w3.org/2001/XMLSchema#time" | ||||
|                                 MustBePresent="true" | ||||
|                                 Category="urn:oasis:names:tc:xacml:3.0:attribute-category:environment" | ||||
|                                 AttributeId="urn:oasis:names:tc:xacml:1.0:environment:current-time"/> | ||||
|                         </Apply> | ||||
|                         <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#time">08:00:00</AttributeValue> | ||||
|                         <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#time">20:00:00</AttributeValue> | ||||
|                     </Apply> | ||||
|                 </Apply> | ||||
|                 <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:double-greater-than"> | ||||
|                     <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:double-one-and-only"> | ||||
|                         <AttributeDesignator | ||||
|                             DataType="http://www.w3.org/2001/XMLSchema#double" | ||||
|                             MustBePresent="true" | ||||
|                             Category="urn:baeldung:atm:withdrawal" | ||||
|                             AttributeId="urn:baeldung:atm:withdrawal:amount"/> | ||||
|                     </Apply> | ||||
|                     <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#double">500.00</AttributeValue> | ||||
|                 </Apply> | ||||
|             </Apply> | ||||
|         </Condition> | ||||
|     </Rule> | ||||
|     <Rule RuleId="urn:oasis:names:tc:baeldung:WithDrawalPolicy:Rule2" Effect="Permit"> | ||||
|         <Description> | ||||
| Permit withdrawals under $500 between 20:00 and 08:00 | ||||
|         </Description> | ||||
|         <Target> | ||||
|             <AnyOf> | ||||
|                 <AllOf> | ||||
|                     <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal"> | ||||
|                         <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">withdrawal</AttributeValue> | ||||
|                         <AttributeDesignator  | ||||
|                             DataType="http://www.w3.org/2001/XMLSchema#string"  | ||||
|                             MustBePresent="true"  | ||||
|                             Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action"  | ||||
|                             AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id"/> | ||||
|                     </Match> | ||||
|                 </AllOf> | ||||
|             </AnyOf> | ||||
|         </Target> | ||||
|         <Condition> | ||||
|             <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:and"> | ||||
|                 <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:not"> | ||||
|                     <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:time-in-range"> | ||||
|                         <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:time-one-and-only"> | ||||
|                             <AttributeDesignator | ||||
|                                 DataType="http://www.w3.org/2001/XMLSchema#time" | ||||
|                                 MustBePresent="true" | ||||
|                                 Category="urn:oasis:names:tc:xacml:3.0:attribute-category:environment" | ||||
|                                 AttributeId="urn:oasis:names:tc:xacml:1.0:environment:current-time"/> | ||||
|                         </Apply> | ||||
|                         <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#time">08:00:00</AttributeValue> | ||||
|                         <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#time">20:00:00</AttributeValue> | ||||
|                     </Apply> | ||||
|                 </Apply> | ||||
|                 <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:double-less-than-or-equal"> | ||||
|                     <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:double-one-and-only"> | ||||
|                         <AttributeDesignator | ||||
|                             DataType="http://www.w3.org/2001/XMLSchema#double" | ||||
|                             MustBePresent="true" | ||||
|                             Category="urn:baeldung:atm:withdrawal" | ||||
|                             AttributeId="urn:baeldung:atm:withdrawal:amount"/> | ||||
|                     </Apply> | ||||
|                     <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#double">500.00</AttributeValue> | ||||
|                 </Apply> | ||||
|             </Apply> | ||||
|         </Condition> | ||||
|     </Rule> | ||||
|     <Rule RuleId="urn:oasis:names:tc:baeldung:WithDrawalPolicy:Rule3" Effect="Permit"> | ||||
|         <Description> | ||||
| Permit withdrawals of any value between 08:00 and 20:00 | ||||
|         </Description> | ||||
|         <Target> | ||||
|             <AnyOf> | ||||
|                 <AllOf> | ||||
|                     <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal"> | ||||
|                         <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">withdrawal</AttributeValue> | ||||
|                         <AttributeDesignator  | ||||
|                             DataType="http://www.w3.org/2001/XMLSchema#string"  | ||||
|                             MustBePresent="true"  | ||||
|                             Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action"  | ||||
|                             AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id"/> | ||||
|                     </Match> | ||||
|                 </AllOf> | ||||
|             </AnyOf> | ||||
|         </Target> | ||||
|         <Condition> | ||||
|             <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:time-in-range"> | ||||
|                 <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:time-one-and-only"> | ||||
|                     <AttributeDesignator | ||||
|                         DataType="http://www.w3.org/2001/XMLSchema#time" | ||||
|                         MustBePresent="true" | ||||
|                         Category="urn:oasis:names:tc:xacml:3.0:attribute-category:environment" | ||||
|                         AttributeId="urn:oasis:names:tc:xacml:1.0:environment:current-time"/> | ||||
|                 </Apply> | ||||
|                 <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#time">08:00:00</AttributeValue> | ||||
|                 <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#time">20:00:00</AttributeValue> | ||||
|             </Apply> | ||||
|         </Condition> | ||||
|     </Rule> | ||||
|      | ||||
| </Policy> | ||||
							
								
								
									
										30
									
								
								libraries-security/src/test/resources/xacml4j/Request.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								libraries-security/src/test/resources/xacml4j/Request.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <Request  | ||||
|     xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" | ||||
|     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|     xsi:schemaLocation="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17 http://docs.oasis-open.org/xacml/3.0/xacml-core-v3-schema-wd-17.xsd" | ||||
|     CombinedDecision="true" | ||||
|     ReturnPolicyIdList="false"> | ||||
|      | ||||
|     <Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action"> | ||||
|         <Attribute  | ||||
|             IncludeInResult="false"  | ||||
|             AttributeId="urn:oasis:names:tc:xacml:3.0:attribute-category:action"> | ||||
|             <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">withdrawal</AttributeValue> | ||||
|         </Attribute> | ||||
|     </Attributes> | ||||
|     <Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action"> | ||||
|         <Attribute  | ||||
|             IncludeInResult="false"  | ||||
|             AttributeId="urn:oasis:names:tc:xacml:1.0:environment:current-time"> | ||||
|             <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#time">21:00:00</AttributeValue> | ||||
|         </Attribute> | ||||
|     </Attributes> | ||||
|     <Attributes Category="urn:baeldung:atm:withdrawal"> | ||||
|         <Attribute  | ||||
|             IncludeInResult="false"  | ||||
|             AttributeId="urn:baeldung:atm:withdrawal:amount"> | ||||
|             <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#decimal">1200</AttributeValue> | ||||
|         </Attribute> | ||||
|     </Attributes> | ||||
| </Request> | ||||
| @ -0,0 +1,9 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <Response xmlns="urn:oasis:names:tc:xacml:2.0:context:schema:os" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:names:tc:xacml:2.0:context:schema:os http://docs.oasis-open.org/xacml/access_control-xacml-2.0-context-schema-os.xsd"> | ||||
| 	<Result> | ||||
| 		<Decision>NotApplicable</Decision> | ||||
| 		<Status> | ||||
| 			<StatusCode Value="urn:oasis:names:tc:xacml:1.0:status:ok"/> | ||||
| 		</Status> | ||||
| 	</Result> | ||||
| </Response> | ||||
| @ -40,6 +40,11 @@ | ||||
|             <artifactId>javatuples</artifactId> | ||||
|             <version>${javatuples.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.javassist</groupId> | ||||
|             <artifactId>javassist</artifactId> | ||||
|             <version>${javaassist.version}</version> | ||||
|         </dependency> | ||||
|         <!-- https://mvnrepository.com/artifact/org.assertj/assertj-core --> | ||||
|         <dependency> | ||||
|             <groupId>org.assertj</groupId> | ||||
| @ -51,42 +56,6 @@ | ||||
|             <artifactId>javers-core</artifactId> | ||||
|             <version>${javers.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>net.serenity-bdd</groupId> | ||||
|             <artifactId>serenity-core</artifactId> | ||||
|             <version>${serenity.version}</version> | ||||
|             <scope>test</scope> | ||||
|             <exclusions> | ||||
|                 <exclusion> | ||||
|                     <groupId>org.asciidoctor</groupId> | ||||
|                     <artifactId>asciidoctorj</artifactId> | ||||
|                 </exclusion> | ||||
|             </exclusions> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>net.serenity-bdd</groupId> | ||||
|             <artifactId>serenity-junit</artifactId> | ||||
|             <version>${serenity.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>net.serenity-bdd</groupId> | ||||
|             <artifactId>serenity-jbehave</artifactId> | ||||
|             <version>${serenity.jbehave.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>net.serenity-bdd</groupId> | ||||
|             <artifactId>serenity-rest-assured</artifactId> | ||||
|             <version>${serenity.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>net.serenity-bdd</groupId> | ||||
|             <artifactId>serenity-jira-requirements-provider</artifactId> | ||||
|             <version>${serenity.jira.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|         <!-- JDO --> | ||||
|         <dependency> | ||||
|             <groupId>org.datanucleus</groupId> | ||||
| @ -139,30 +108,6 @@ | ||||
|             <artifactId>spring-web</artifactId> | ||||
|             <version>${spring.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>net.serenity-bdd</groupId> | ||||
|             <artifactId>serenity-spring</artifactId> | ||||
|             <version>${serenity.version}</version> | ||||
|             <scope>test</scope> | ||||
|             <exclusions> | ||||
|                 <exclusion> | ||||
|                     <groupId>org.springframework</groupId> | ||||
|                     <artifactId>spring-test</artifactId> | ||||
|                 </exclusion> | ||||
|             </exclusions> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>net.serenity-bdd</groupId> | ||||
|             <artifactId>serenity-screenplay</artifactId> | ||||
|             <version>${serenity.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>net.serenity-bdd</groupId> | ||||
|             <artifactId>serenity-screenplay-webdriver</artifactId> | ||||
|             <version>${serenity.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|         <!-- JetS3t --> | ||||
|         <dependency> | ||||
|             <groupId>org.lucee</groupId> | ||||
| @ -253,29 +198,6 @@ | ||||
| 
 | ||||
|     <build> | ||||
|         <plugins> | ||||
|             <plugin> | ||||
|                 <artifactId>maven-failsafe-plugin</artifactId> | ||||
|                 <version>${maven-failsafe-plugin.version}</version> | ||||
|                 <configuration> | ||||
|                     <systemProperties> | ||||
|                         <webdriver.chrome.driver>chromedriver</webdriver.chrome.driver> | ||||
|                     </systemProperties> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <groupId>net.serenity-bdd.maven.plugins</groupId> | ||||
|                 <artifactId>serenity-maven-plugin</artifactId> | ||||
|                 <version>${serenity.plugin.version}</version> | ||||
|                 <executions> | ||||
|                     <execution> | ||||
|                         <id>serenity-reports</id> | ||||
|                         <phase>post-integration-test</phase> | ||||
|                         <goals> | ||||
|                             <goal>aggregate</goal> | ||||
|                         </goals> | ||||
|                     </execution> | ||||
|                 </executions> | ||||
|             </plugin> | ||||
|             <!-- JDO Plugin --> | ||||
|             <plugin> | ||||
|                 <groupId>org.datanucleus</groupId> | ||||
| @ -380,6 +302,7 @@ | ||||
|         <spring.version>4.3.8.RELEASE</spring.version> | ||||
|         <spring-mock-mvc.version>3.0.3</spring-mock-mvc.version> | ||||
|         <quartz.version>2.3.0</quartz.version> | ||||
|         <javaassist.version>3.21.0-GA</javaassist.version> | ||||
|         <jool.version>0.9.12</jool.version> | ||||
|         <maven-jar-plugin.version>3.0.2</maven-jar-plugin.version> | ||||
|         <commons-net.version>3.6</commons-net.version> | ||||
|  | ||||
| @ -1,4 +0,0 @@ | ||||
| jira.url=<jira-url> | ||||
| jira.project=<jira-project> | ||||
| jira.username=<jira-username> | ||||
| jira.password=<jira-password> | ||||
							
								
								
									
										3
									
								
								maven-modules/maven-parent-pom-resolution/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								maven-modules/maven-parent-pom-resolution/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| ### Relevant Articles: | ||||
| 
 | ||||
| - [Understanding the "relativePath" Tag - Maven Parent POM Resolution At A Glance](https://www.baeldung.com/maven-relativepath) | ||||
| @ -0,0 +1,15 @@ | ||||
| <?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> | ||||
|     <artifactId>module1</artifactId> | ||||
|     <parent> | ||||
|         <groupId>com.baeldung.maven-parent-pom-resolution</groupId> | ||||
|         <artifactId>aggregator</artifactId> | ||||
|         <version>1.0.0-SNAPSHOT</version> | ||||
|         <!-- The parent pom is resolved to project a's pom.xml --> | ||||
|     </parent> | ||||
|     <packaging>pom</packaging> | ||||
| 
 | ||||
| </project> | ||||
| @ -0,0 +1,17 @@ | ||||
| <?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> | ||||
|     <artifactId>module3</artifactId> | ||||
|     <parent> | ||||
|         <groupId>com.baeldung.maven-parent-pom-resolution</groupId> | ||||
|         <artifactId>aggregator</artifactId> | ||||
|         <version>1.0.0-SNAPSHOT</version> | ||||
|         <!-- removing relativePath won't work even if project-a is the aggregator project --> | ||||
|         <!-- it only works in IntelliJ IDEA when project-a is registered as a Maven Project --> | ||||
|         <relativePath>../../pom.xml</relativePath> | ||||
|     </parent> | ||||
|     <packaging>pom</packaging> | ||||
| 
 | ||||
| </project> | ||||
| @ -0,0 +1,20 @@ | ||||
| <?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> | ||||
|     <artifactId>module2</artifactId> | ||||
|     <parent> | ||||
|         <groupId>com.baeldung.maven-parent-pom-resolution</groupId> | ||||
|         <artifactId>module1</artifactId> | ||||
|         <version>1.0.0-SNAPSHOT</version> | ||||
|         <relativePath>../module1/pom.xml</relativePath> | ||||
|         <!-- The parent pom is resolved to project a's pom.xml --> | ||||
|     </parent> | ||||
|     <packaging>pom</packaging> | ||||
| 
 | ||||
|     <modules> | ||||
|         <module>module3</module> | ||||
|     </modules> | ||||
| 
 | ||||
| </project> | ||||
							
								
								
									
										21
									
								
								maven-modules/maven-parent-pom-resolution/aggregator/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								maven-modules/maven-parent-pom-resolution/aggregator/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | ||||
| <?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> | ||||
|     <groupId>com.baeldung.maven-parent-pom-resolution</groupId> | ||||
|     <artifactId>aggregator</artifactId> | ||||
|     <parent> | ||||
|         <groupId>com.baeldung</groupId> | ||||
|         <artifactId>maven-parent-pom-resolution</artifactId> | ||||
|         <version>1.0.0-SNAPSHOT</version> | ||||
|         <!-- The parent pom is resolved to ../pom.xml --> | ||||
|     </parent> | ||||
|     <packaging>pom</packaging> | ||||
| 
 | ||||
|     <modules> | ||||
|         <module>module1</module> | ||||
|         <module>module2</module> | ||||
|     </modules> | ||||
| 
 | ||||
| </project> | ||||
							
								
								
									
										28
									
								
								maven-modules/maven-parent-pom-resolution/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								maven-modules/maven-parent-pom-resolution/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| <?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> | ||||
|     <groupId>com.baeldung</groupId> | ||||
|     <artifactId>maven-parent-pom-resolution</artifactId> | ||||
|     <version>1.0.0-SNAPSHOT</version> | ||||
|     <packaging>pom</packaging> | ||||
| 
 | ||||
|     <modules> | ||||
|         <module>aggregator</module> | ||||
|     </modules> | ||||
| 
 | ||||
|     <!-- to detect the POM hierarchy, just type "mvn dependency:display-ancestors" --> | ||||
|     <build> | ||||
|         <pluginManagement> | ||||
|             <plugins> | ||||
|                 <plugin> | ||||
|                     <groupId>org.apache.maven.plugins</groupId> | ||||
|                     <artifactId>maven-dependency-plugin</artifactId> | ||||
|                     <version>3.2.0</version> | ||||
|                 </plugin> | ||||
|             </plugins> | ||||
|         </pluginManagement> | ||||
|     </build> | ||||
| 
 | ||||
| </project> | ||||
| @ -13,12 +13,12 @@ | ||||
|         <version>1.0.0-SNAPSHOT</version> | ||||
|         <relativePath>../..</relativePath> | ||||
|     </parent> | ||||
| 
 | ||||
| 	     | ||||
|     <dependencies> | ||||
|         <dependency> | ||||
|             <groupId>junit</groupId> | ||||
|             <artifactId>junit</artifactId> | ||||
|             <version>4.13</version> | ||||
| 	    <version>${junit.version}</version> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
| 
 | ||||
| @ -46,6 +46,7 @@ | ||||
|     <properties> | ||||
|         <name>${project.name}</name> | ||||
|         <my.awesome.property>property-from-pom</my.awesome.property> | ||||
|         <junit.version>4.13</junit.version>  | ||||
|     </properties> | ||||
| 
 | ||||
| </project> | ||||
| </project> | ||||
|  | ||||
							
								
								
									
										3
									
								
								maven-modules/maven-surefire-plugin/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								maven-modules/maven-surefire-plugin/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| ## Relevant Articles: | ||||
| 
 | ||||
| - [Running a Single Test or Method With Maven](https://www.baeldung.com/maven-run-single-test) | ||||
| @ -36,6 +36,7 @@ | ||||
|         <module>host-maven-repo-example</module> | ||||
|         <module>plugin-management</module> | ||||
|         <module>maven-surefire-plugin</module> | ||||
|         <module>maven-parent-pom-resolution</module> | ||||
|     </modules> | ||||
| 
 | ||||
| </project> | ||||
|  | ||||
| @ -30,7 +30,7 @@ | ||||
|     </dependencies> | ||||
| 
 | ||||
|     <properties> | ||||
|         <spring.version>5.3.7</spring.version> | ||||
|         <spring.version>5.3.9</spring.version> | ||||
|         <spring-security.version>5.2.3.RELEASE</spring-security.version> | ||||
|         <spring-boot-starter-test.version>1.5.10.RELEASE</spring-boot-starter-test.version> | ||||
|     </properties> | ||||
|  | ||||
| @ -3,3 +3,4 @@ | ||||
| - [The DAO Pattern in Java](https://www.baeldung.com/java-dao-pattern) | ||||
| - [DAO vs Repository Patterns](https://www.baeldung.com/java-dao-vs-repository) | ||||
| - [Difference Between MVC and MVP Patterns](https://www.baeldung.com/mvc-vs-mvp-pattern) | ||||
| - [The DTO Pattern (Data Transfer Object)](https://www.baeldung.com/java-dto-pattern) | ||||
|  | ||||
| @ -15,6 +15,21 @@ | ||||
|     </parent> | ||||
| 
 | ||||
|     <dependencies> | ||||
|         <dependency> | ||||
|             <groupId>org.springframework.boot</groupId> | ||||
|             <artifactId>spring-boot-starter-web</artifactId> | ||||
|             <version>${spring-boot.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.springframework.boot</groupId> | ||||
|             <artifactId>spring-boot-starter-test</artifactId> | ||||
|             <version>${spring-boot.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>io.rest-assured</groupId> | ||||
|             <artifactId>rest-assured</artifactId> | ||||
|             <version>${rest-assured.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.assertj</groupId> | ||||
|             <artifactId>assertj-core</artifactId> | ||||
| @ -38,6 +53,9 @@ | ||||
|         <assertj-core.version>3.9.1</assertj-core.version> | ||||
|         <hibernate-core.version>5.2.16.Final</hibernate-core.version> | ||||
|         <mysql-connector.version>6.0.6</mysql-connector.version> | ||||
|         <spring-boot.version>2.5.3</spring-boot.version> | ||||
|         <rest-assured.version>3.3.0</rest-assured.version> | ||||
| 
 | ||||
|     </properties> | ||||
| 
 | ||||
| </project> | ||||
| @ -0,0 +1,12 @@ | ||||
| package com.baeldung.dtopattern; | ||||
| 
 | ||||
| import org.springframework.boot.SpringApplication; | ||||
| import org.springframework.boot.autoconfigure.SpringBootApplication; | ||||
| 
 | ||||
| @SpringBootApplication | ||||
| public class Main { | ||||
|     public static void main(String[] args) { | ||||
|         SpringApplication.run(Main.class, args); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -0,0 +1,28 @@ | ||||
| package com.baeldung.dtopattern.api; | ||||
| 
 | ||||
| import com.baeldung.dtopattern.domain.Role; | ||||
| import com.baeldung.dtopattern.domain.User; | ||||
| import org.springframework.stereotype.Component; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import static java.util.stream.Collectors.toList; | ||||
| 
 | ||||
| @Component | ||||
| class Mapper { | ||||
|     public UserDTO toDto(User user) { | ||||
|         String name = user.getName(); | ||||
|         List<String> roles = user | ||||
|                 .getRoles() | ||||
|                 .stream() | ||||
|                 .map(Role::getName) | ||||
|                 .collect(toList()); | ||||
| 
 | ||||
|         return new UserDTO(name, roles); | ||||
|     } | ||||
| 
 | ||||
|     public User toUser(UserCreationDTO userDTO) { | ||||
|         return new User(userDTO.getName(), userDTO.getPassword(), new ArrayList<>()); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,51 @@ | ||||
| package com.baeldung.dtopattern.api; | ||||
| 
 | ||||
| import com.baeldung.dtopattern.domain.RoleService; | ||||
| import com.baeldung.dtopattern.domain.User; | ||||
| import com.baeldung.dtopattern.domain.UserService; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| 
 | ||||
| import java.util.List; | ||||
| 
 | ||||
| import static java.util.stream.Collectors.toList; | ||||
| 
 | ||||
| @RestController | ||||
| @RequestMapping("/users") | ||||
| class UserController { | ||||
| 
 | ||||
|     private UserService userService; | ||||
|     private RoleService roleService; | ||||
|     private Mapper mapper; | ||||
| 
 | ||||
|     public UserController(UserService userService,  RoleService roleService, Mapper mapper) { | ||||
|         this.userService = userService; | ||||
|         this.roleService = roleService; | ||||
|         this.mapper = mapper; | ||||
|     } | ||||
| 
 | ||||
|     @GetMapping | ||||
|     @ResponseBody | ||||
|     public List<UserDTO> getUsers() { | ||||
|         return userService.getAll() | ||||
|             .stream() | ||||
|             .map(mapper::toDto) | ||||
|             .collect(toList()); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     @PostMapping | ||||
|     @ResponseBody | ||||
|     public UserIdDTO create(@RequestBody UserCreationDTO userDTO) { | ||||
|         User user = mapper.toUser(userDTO); | ||||
| 
 | ||||
|         userDTO.getRoles() | ||||
|                 .stream() | ||||
|                 .map(role -> roleService.getOrCreate(role)) | ||||
|                 .forEach(user::addRole); | ||||
| 
 | ||||
|         userService.save(user); | ||||
| 
 | ||||
|         return new UserIdDTO(user.getId()); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,36 @@ | ||||
| package com.baeldung.dtopattern.api; | ||||
| 
 | ||||
| import java.util.List; | ||||
| 
 | ||||
| public class UserCreationDTO { | ||||
| 
 | ||||
|     private String name; | ||||
|     private String password; | ||||
|     private List<String> roles; | ||||
| 
 | ||||
|     UserCreationDTO() {} | ||||
| 
 | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
| 
 | ||||
|     public String getPassword() { | ||||
|         return password; | ||||
|     } | ||||
| 
 | ||||
|     public List<String> getRoles() { | ||||
|         return roles; | ||||
|     } | ||||
| 
 | ||||
|     void setName(String name) { | ||||
|         this.name = name; | ||||
|     } | ||||
| 
 | ||||
|     void setPassword(String password) { | ||||
|         this.password = password; | ||||
|     } | ||||
| 
 | ||||
|     void setRoles(List<String> roles) { | ||||
|         this.roles = roles; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,22 @@ | ||||
| package com.baeldung.dtopattern.api; | ||||
| 
 | ||||
| import java.util.List; | ||||
| 
 | ||||
| public class UserDTO { | ||||
|     private String name; | ||||
|     private List<String> roles; | ||||
| 
 | ||||
|     public UserDTO(String name, List<String> roles) { | ||||
|         this.name = name; | ||||
|         this.roles = roles; | ||||
|     } | ||||
| 
 | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
| 
 | ||||
|     public List<String> getRoles() { | ||||
|         return roles; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,14 @@ | ||||
| package com.baeldung.dtopattern.api; | ||||
| 
 | ||||
| public class UserIdDTO { | ||||
| 
 | ||||
|     private String id; | ||||
| 
 | ||||
|     public UserIdDTO(String id) { | ||||
|         this.id = id; | ||||
|     } | ||||
| 
 | ||||
|     public String getId() { | ||||
|         return id; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,49 @@ | ||||
| package com.baeldung.dtopattern.domain; | ||||
| 
 | ||||
| import org.springframework.stereotype.Service; | ||||
| 
 | ||||
| import java.util.*; | ||||
| 
 | ||||
| @Service | ||||
| class InMemoryRepository implements UserRepository, RoleRepository { | ||||
| 
 | ||||
|     private Map<String, User> users = new LinkedHashMap<>(); | ||||
|     private Map<String, Role> roles = new LinkedHashMap<>(); | ||||
| 
 | ||||
|     @Override | ||||
|     public List<User> getAll() { | ||||
|         return new ArrayList<>(users.values()); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void save(User user) { | ||||
|         user.setId(UUID.randomUUID().toString()); | ||||
|         users.put(user.getId(), user); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void save(Role role) { | ||||
|         role.setId(UUID.randomUUID().toString()); | ||||
|         roles.put(role.getId(), role); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public Role getRoleById(String id) { | ||||
|         return roles.get(id); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public Role getRoleByName(String name) { | ||||
|         return roles.values() | ||||
|             .stream() | ||||
|             .filter(role -> role.getName().equalsIgnoreCase(name)) | ||||
|             .findFirst() | ||||
|             .orElse(null); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void deleteAll() { | ||||
|         users.clear(); | ||||
|         roles.clear(); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,28 @@ | ||||
| package com.baeldung.dtopattern.domain; | ||||
| 
 | ||||
| import java.util.Objects; | ||||
| 
 | ||||
| public class Role { | ||||
|     private String id; | ||||
|     private String name; | ||||
| 
 | ||||
|     public Role(String name) { | ||||
|         this.name = Objects.requireNonNull(name); | ||||
|     } | ||||
| 
 | ||||
|     public String getId() { | ||||
|         return id; | ||||
|     } | ||||
| 
 | ||||
|     void setId(String id) { | ||||
|         this.id = Objects.requireNonNull(id); | ||||
|     } | ||||
| 
 | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
| 
 | ||||
|     public void setName(String name) { | ||||
|         this.name = Objects.requireNonNull(name); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,7 @@ | ||||
| package com.baeldung.dtopattern.domain; | ||||
| 
 | ||||
| public interface RoleRepository { | ||||
|     Role getRoleById(String id); | ||||
|     Role getRoleByName(String name); | ||||
|     void save(Role role); | ||||
| } | ||||
| @ -0,0 +1,32 @@ | ||||
| package com.baeldung.dtopattern.domain; | ||||
| 
 | ||||
| import org.springframework.stereotype.Service; | ||||
| 
 | ||||
| import java.util.Objects; | ||||
| 
 | ||||
| @Service | ||||
| public class RoleService { | ||||
| 
 | ||||
|     private RoleRepository repository; | ||||
| 
 | ||||
|     public RoleService(RoleRepository repository) { | ||||
|         this.repository = repository; | ||||
|     } | ||||
| 
 | ||||
|     public Role getOrCreate(String name) { | ||||
|         Role role = repository.getRoleByName(name); | ||||
| 
 | ||||
|         if (role == null) { | ||||
|             role = new Role(name); | ||||
|             repository.save(role); | ||||
|         } | ||||
| 
 | ||||
|         return role; | ||||
|     } | ||||
| 
 | ||||
|     public void save(Role role) { | ||||
|         Objects.requireNonNull(role); | ||||
|         repository.save(role); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,80 @@ | ||||
| package com.baeldung.dtopattern.domain; | ||||
| 
 | ||||
| import javax.crypto.*; | ||||
| import javax.crypto.spec.SecretKeySpec; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.security.InvalidKeyException; | ||||
| import java.security.NoSuchAlgorithmException; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| import java.util.Objects; | ||||
| 
 | ||||
| public class User { | ||||
| 
 | ||||
|     private static SecretKeySpec KEY = initKey(); | ||||
| 
 | ||||
|     static SecretKeySpec initKey(){ | ||||
|         try { | ||||
|             SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey(); | ||||
|             return new SecretKeySpec(secretKey.getEncoded(), "AES"); | ||||
|         } catch (NoSuchAlgorithmException ex) { | ||||
|             return null; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private String id; | ||||
|     private String name; | ||||
|     private String password; | ||||
|     private List<Role> roles; | ||||
| 
 | ||||
|     public User(String name, String password, List<Role> roles) { | ||||
|         this.name = Objects.requireNonNull(name); | ||||
|         this.password = this.encrypt(password); | ||||
|         this.roles = Objects.requireNonNull(roles); | ||||
|     } | ||||
| 
 | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
| 
 | ||||
|     public void setName(String name) { | ||||
|         this.name = name; | ||||
|     } | ||||
| 
 | ||||
|     public String getPassword() { | ||||
|         return password; | ||||
|     } | ||||
| 
 | ||||
|     public void setPassword(String password) { | ||||
|         this.password = password; | ||||
|     } | ||||
| 
 | ||||
|     public void addRole(Role role) { | ||||
|         roles.add(role); | ||||
|     } | ||||
| 
 | ||||
|     public List<Role> getRoles() { | ||||
|         return Collections.unmodifiableList(roles); | ||||
|     } | ||||
| 
 | ||||
|     public String getId() { | ||||
|         return id; | ||||
|     } | ||||
| 
 | ||||
|     void setId(String id) { | ||||
|         this.id = id; | ||||
|     } | ||||
| 
 | ||||
|     String encrypt(String password) { | ||||
|         Objects.requireNonNull(password); | ||||
|         try { | ||||
|             Cipher cipher = Cipher.getInstance("AES"); | ||||
|             cipher.init(Cipher.ENCRYPT_MODE, KEY); | ||||
|             final byte[] encryptedBytes = cipher.doFinal(password.getBytes(StandardCharsets.UTF_8)); | ||||
|             return new String(encryptedBytes, StandardCharsets.UTF_8); | ||||
|         } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) { | ||||
|             // do nothing | ||||
|             return ""; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,9 @@ | ||||
| package com.baeldung.dtopattern.domain; | ||||
| 
 | ||||
| import java.util.List; | ||||
| 
 | ||||
| public interface UserRepository { | ||||
|     List<User> getAll(); | ||||
|     void save(User user); | ||||
|     void deleteAll(); | ||||
| } | ||||
| @ -0,0 +1,25 @@ | ||||
| package com.baeldung.dtopattern.domain; | ||||
| 
 | ||||
| import org.springframework.stereotype.Service; | ||||
| 
 | ||||
| import java.util.List; | ||||
| import java.util.Objects; | ||||
| 
 | ||||
| @Service | ||||
| public class UserService { | ||||
| 
 | ||||
|     private UserRepository repository; | ||||
| 
 | ||||
|     public UserService(UserRepository repository) { | ||||
|         this.repository = repository; | ||||
|     } | ||||
| 
 | ||||
|     public List<User> getAll() { | ||||
|         return repository.getAll(); | ||||
|     } | ||||
| 
 | ||||
|     public void save(User user) { | ||||
|         Objects.requireNonNull(user); | ||||
|         repository.save(user); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,56 @@ | ||||
| package com.baeldung.dtopattern.api; | ||||
| 
 | ||||
| import com.baeldung.dtopattern.domain.Role; | ||||
| import com.baeldung.dtopattern.domain.User; | ||||
| import org.junit.jupiter.api.Test; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.*; | ||||
| 
 | ||||
| class MapperUnitTest { | ||||
| 
 | ||||
|     @Test | ||||
|     void toDto_shouldMapFromDomainToDTO() { | ||||
|         String name = "Test"; | ||||
|         String password = "test"; | ||||
|         Role admin = new Role("admin"); | ||||
|         List<String> expectedRoles = Collections.singletonList("admin"); | ||||
| 
 | ||||
|         List<Role> roles = new ArrayList<>(); | ||||
|         roles.add(admin); | ||||
| 
 | ||||
|         User user = new User(name, password, roles); | ||||
|         Mapper mapper = new Mapper(); | ||||
| 
 | ||||
|         UserDTO dto = mapper.toDto(user); | ||||
| 
 | ||||
|         assertEquals(name, dto.getName()); | ||||
|         assertEquals(expectedRoles, dto.getRoles()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void toUser_shouldMapFromDTOToDomain() { | ||||
|         String name = "Test"; | ||||
|         String password = "test"; | ||||
|         String role = "admin"; | ||||
| 
 | ||||
|         UserCreationDTO dto = new UserCreationDTO(); | ||||
|         dto.setName(name); | ||||
|         dto.setPassword(password); | ||||
|         dto.setRoles(Collections.singletonList("admin")); | ||||
| 
 | ||||
|         User expectedUser = new User(name, password, new ArrayList<>()); | ||||
| 
 | ||||
|         Mapper mapper = new Mapper(); | ||||
| 
 | ||||
|         User user = mapper.toUser(dto); | ||||
| 
 | ||||
|         assertEquals(name, user.getName()); | ||||
|         assertEquals(expectedUser.getPassword(), user.getPassword()); | ||||
|         assertEquals(Collections.emptyList(), user.getRoles()); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,80 @@ | ||||
| package com.baeldung.dtopattern.api; | ||||
| 
 | ||||
| import com.baeldung.dtopattern.domain.Role; | ||||
| import com.baeldung.dtopattern.domain.RoleRepository; | ||||
| import com.baeldung.dtopattern.domain.User; | ||||
| import com.baeldung.dtopattern.domain.UserRepository; | ||||
| import com.fasterxml.jackson.databind.ObjectMapper; | ||||
| import io.restassured.http.ContentType; | ||||
| 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.web.server.LocalServerPort; | ||||
| 
 | ||||
| import java.util.Collections; | ||||
| 
 | ||||
| import static io.restassured.RestAssured.given; | ||||
| import static org.hamcrest.CoreMatchers.*; | ||||
| import static org.springframework.http.HttpStatus.OK; | ||||
| 
 | ||||
| @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) | ||||
| class UserControllerIntegrationTest { | ||||
| 
 | ||||
|     @Autowired | ||||
|     private TestRestTemplate restTemplate; | ||||
| 
 | ||||
|     @Autowired | ||||
|     private UserRepository userRepository; | ||||
| 
 | ||||
|     @Autowired | ||||
|     private RoleRepository roleRepository; | ||||
| 
 | ||||
|     @LocalServerPort | ||||
|     int port; | ||||
| 
 | ||||
|     @Autowired | ||||
|     private ObjectMapper objectMapper; | ||||
| 
 | ||||
|     @Test | ||||
|     void create_shouldReturnUseId() throws Exception { | ||||
|         UserCreationDTO request = new UserCreationDTO(); | ||||
|         request.setName("User 1"); | ||||
|         request.setPassword("Test@123456"); | ||||
|         request.setRoles(Collections.singletonList("admin")); | ||||
| 
 | ||||
|         given() | ||||
|             .contentType(ContentType.JSON) | ||||
|             .body(objectMapper.writeValueAsString(request)) | ||||
|         .when() | ||||
|             .port(port) | ||||
|             .post("/users") | ||||
|         .then() | ||||
|             .statusCode(OK.value()) | ||||
|             .body("id", notNullValue()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void getAll_shouldReturnUseDTO() { | ||||
| 
 | ||||
|         userRepository.deleteAll(); | ||||
| 
 | ||||
|         String roleName = "admin"; | ||||
|         Role admin = new Role(roleName); | ||||
|         roleRepository.save(admin); | ||||
| 
 | ||||
|         String name = "User 1"; | ||||
|         User user = new User(name, "Test@123456", Collections.singletonList(admin)); | ||||
|         userRepository.save(user); | ||||
| 
 | ||||
|         given() | ||||
|             .port(port) | ||||
|         .when() | ||||
|             .get("/users") | ||||
|         .then() | ||||
|             .statusCode(OK.value()) | ||||
|             .body("size()", is(1)) | ||||
|             .body("[0].name", equalTo(name)) | ||||
|             .body("[0].roles", hasItem(roleName)); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,83 @@ | ||||
| package com.baeldung.dtopattern.domain; | ||||
| 
 | ||||
| import org.junit.jupiter.api.Test; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertNotNull; | ||||
| 
 | ||||
| class InMemoryRepositoryUnitTest { | ||||
| 
 | ||||
|     @Test | ||||
|     void getAll_shouldReturnAllUsers() { | ||||
| 
 | ||||
|         String name = "Test"; | ||||
|         String password = "test123"; | ||||
|         List<Role> roles = new ArrayList<>(); | ||||
| 
 | ||||
|         User user = new User(name, password, roles); | ||||
|         List<User> expectedUsers = Collections.singletonList(user); | ||||
| 
 | ||||
|         InMemoryRepository repository = new InMemoryRepository(); | ||||
|         repository.save(user); | ||||
| 
 | ||||
|         List<User> users = repository.getAll(); | ||||
| 
 | ||||
|         assertEquals(expectedUsers, users); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void save_whenSavingUser_shouldSetId() { | ||||
|         String name = "Test"; | ||||
|         String password = "test123"; | ||||
|         List<Role> roles = new ArrayList<>(); | ||||
| 
 | ||||
|         User user = new User(name, password, roles); | ||||
| 
 | ||||
|         InMemoryRepository repository = new InMemoryRepository(); | ||||
|         repository.save(user); | ||||
| 
 | ||||
|         assertNotNull(user.getId()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void save_whenSavingRole_shouldSetId() { | ||||
|         String name = "Test"; | ||||
|         Role role = new Role(name); | ||||
| 
 | ||||
|         InMemoryRepository repository = new InMemoryRepository(); | ||||
|         repository.save(role); | ||||
| 
 | ||||
|         assertNotNull(role.getId()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void getRoleById_shouldReturnRoleById() { | ||||
|         String name = "Test"; | ||||
|         Role expectedRole = new Role(name); | ||||
| 
 | ||||
|         InMemoryRepository repository = new InMemoryRepository(); | ||||
|         repository.save(expectedRole); | ||||
| 
 | ||||
|         Role role = repository.getRoleById(expectedRole.getId()); | ||||
| 
 | ||||
|         assertEquals(expectedRole, role); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void getRoleByName_shouldReturnRoleByName() { | ||||
|         String name = "Test"; | ||||
|         Role expectedRole = new Role(name); | ||||
| 
 | ||||
|         InMemoryRepository repository = new InMemoryRepository(); | ||||
|         repository.save(expectedRole); | ||||
| 
 | ||||
|         Role role = repository.getRoleByName(name); | ||||
| 
 | ||||
|         assertEquals(expectedRole, role); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,38 @@ | ||||
| package com.baeldung.dtopattern.domain; | ||||
| 
 | ||||
| import org.junit.jupiter.api.Test; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.*; | ||||
| 
 | ||||
| class UserUnitTest { | ||||
| 
 | ||||
| 
 | ||||
|     @Test | ||||
|     void whenUserIsCreated_shouldEncryptPassword() { | ||||
|         User user = new User("Test", "test", new ArrayList<>()); | ||||
| 
 | ||||
|         assertEquals(user.encrypt("test"), user.getPassword()); | ||||
|         assertNotEquals(user.encrypt("Test"), user.getPassword()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void whenUserIsCreated_shouldFailIfNameIsNull() { | ||||
|         assertThrows(NullPointerException.class, () -> | ||||
|             new User(null, "test", new ArrayList<>())); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void whenUserIsCreated_shouldFailIfPasswordIsNull() { | ||||
|         assertThrows(NullPointerException.class, () -> | ||||
|             new User("Test", null, new ArrayList<>())); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void whenUserIsCreated_shouldFailIfRolesIsNull() { | ||||
|         assertThrows(NullPointerException.class, () -> | ||||
|             new User("Test", "Test", null)); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -13,3 +13,5 @@ This module contains articles about the Java Persistence API (JPA) in Java. | ||||
| - [Returning an Auto-Generated Id with JPA](https://www.baeldung.com/jpa-get-auto-generated-id) | ||||
| - [How to Return Multiple Entities In JPA Query](https://www.baeldung.com/jpa-return-multiple-entities) | ||||
| - [Defining Unique Constraints in JPA](https://www.baeldung.com/jpa-unique-constraints) | ||||
| - [How to Check Field Existence in MongoDB?](https://www.baeldung.com/mongodb-check-field-exists) | ||||
| - [Connecting to a Specific Schema in JDBC](https://www.baeldung.com/jdbc-connect-to-schema) | ||||
|  | ||||
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