Merge branch 'eugenp:master' into master
This commit is contained in:
		
						commit
						bf1e9aa588
					
				| @ -13,4 +13,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring | ||||
| - [How To Get Cookies From the Apache HttpClient Response](https://www.baeldung.com/java-apache-httpclient-cookies) | ||||
| - [Enabling Logging for Apache HttpClient](https://www.baeldung.com/apache-httpclient-enable-logging) | ||||
| - [Apache HttpClient vs. CloseableHttpClient](https://www.baeldung.com/apache-httpclient-vs-closeablehttpclient) | ||||
| - [Expand Shortened URLs with Apache HttpClient](https://www.baeldung.com/apache-httpclient-expand-url) | ||||
| - More articles: [[<-- prev]](../apache-httpclient) | ||||
|  | ||||
| @ -0,0 +1,126 @@ | ||||
| package com.baeldung.httpclient.expandUrl; | ||||
| 
 | ||||
| import static org.hamcrest.MatcherAssert.assertThat; | ||||
| import static org.hamcrest.Matchers.equalTo; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import com.google.common.base.Preconditions; | ||||
| import com.google.common.collect.Lists; | ||||
| 
 | ||||
| import org.apache.commons.lang3.tuple.ImmutablePair; | ||||
| import org.apache.commons.lang3.tuple.Pair; | ||||
| 
 | ||||
| import org.apache.hc.client5.http.classic.methods.HttpHead; | ||||
| import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; | ||||
| 
 | ||||
| import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; | ||||
| import org.apache.hc.core5.http.Header; | ||||
| import org.apache.hc.core5.http.HttpHeaders; | ||||
| 
 | ||||
| import org.junit.jupiter.api.AfterAll; | ||||
| import org.junit.jupiter.api.BeforeAll; | ||||
| import org.junit.jupiter.api.Test; | ||||
| 
 | ||||
| class HttpClientExpandUrlLiveTest { | ||||
| 
 | ||||
|     private static CloseableHttpClient httpClient; | ||||
| 
 | ||||
|     @BeforeAll | ||||
|     static void setup() { | ||||
|         httpClient = HttpClientBuilder.create() | ||||
|             .disableRedirectHandling() | ||||
|             .build(); | ||||
|     } | ||||
| 
 | ||||
|     @AfterAll | ||||
|     static void tearDown() throws IOException { | ||||
|         if (httpClient != null) { | ||||
|             httpClient.close(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenShortenedOnce_whenUrlIsExpanded_thenCorrectResult() throws IOException { | ||||
|         final String expectedResult = "https://www.baeldung.com/rest-versioning"; | ||||
|         final String actualResult = expandSingleLevel("http://bit.ly/3LScTri"); | ||||
|         assertThat(actualResult, equalTo(expectedResult)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenShortenedMultiple_whenUrlIsExpanded_thenCorrectResult() throws IOException { | ||||
|         final String expectedResult = "https://www.baeldung.com/rest-versioning"; | ||||
|         final String actualResult = expand("http://t.co/e4rDDbnzmk"); | ||||
|         assertThat(actualResult, equalTo(expectedResult)); | ||||
|     } | ||||
| 
 | ||||
|     private String expand(final String urlArg) throws IOException { | ||||
|         String originalUrl = urlArg; | ||||
|         String newUrl = expandSingleLevel(originalUrl); | ||||
|         while (!originalUrl.equals(newUrl)) { | ||||
|             originalUrl = newUrl; | ||||
|             newUrl = expandSingleLevel(originalUrl); | ||||
|         } | ||||
| 
 | ||||
|         return newUrl; | ||||
|     } | ||||
| 
 | ||||
|     final String expandSafe(final String urlArg) throws IOException { | ||||
|         String originalUrl = urlArg; | ||||
|         String newUrl = expandSingleLevelSafe(originalUrl).getRight(); | ||||
|         final List<String> alreadyVisited = Lists.newArrayList(originalUrl, newUrl); | ||||
|         while (!originalUrl.equals(newUrl)) { | ||||
|             originalUrl = newUrl; | ||||
|             final Pair<Integer, String> statusAndUrl = expandSingleLevelSafe(originalUrl); | ||||
|             newUrl = statusAndUrl.getRight(); | ||||
|             final boolean isRedirect = statusAndUrl.getLeft() == 301 || statusAndUrl.getLeft() == 302; | ||||
|             if (isRedirect && alreadyVisited.contains(newUrl)) { | ||||
|                 throw new IllegalStateException("Likely a redirect loop"); | ||||
|             } | ||||
|             alreadyVisited.add(newUrl); | ||||
|         } | ||||
| 
 | ||||
|         return newUrl; | ||||
|     } | ||||
| 
 | ||||
|     private Pair<Integer, String> expandSingleLevelSafe(final String url) throws IOException { | ||||
|         try { | ||||
|             HttpHead request = new HttpHead(url); | ||||
|             Pair<Integer, String> resp = httpClient.execute(request, response -> { | ||||
|                 final int statusCode = response.getCode(); | ||||
|                 if (statusCode != 301 && statusCode != 302) { | ||||
|                     return new ImmutablePair<>(statusCode, url); | ||||
|                 } | ||||
|                 final Header[] headers = response.getHeaders(HttpHeaders.LOCATION); | ||||
|                 Preconditions.checkState(headers.length == 1); | ||||
|                 final String newUrl = headers[0].getValue(); | ||||
| 
 | ||||
|                 return new ImmutablePair<>(statusCode, newUrl); | ||||
|             }); | ||||
|             return resp; | ||||
|         } catch (final IllegalArgumentException uriEx) { | ||||
|             return new ImmutablePair<>(500, url); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private String expandSingleLevel(final String url) throws IOException { | ||||
|         try { | ||||
|             HttpHead request = new HttpHead(url); | ||||
|             String expandedUrl = httpClient.execute(request, response -> { | ||||
|                 final int statusCode = response.getCode(); | ||||
|                 if (statusCode != 301 && statusCode != 302) { | ||||
|                     return url; | ||||
|                 } | ||||
|                 final Header[] headers = response.getHeaders(HttpHeaders.LOCATION); | ||||
|                 Preconditions.checkState(headers.length == 1); | ||||
| 
 | ||||
|                 return headers[0].getValue(); | ||||
|             }); | ||||
|             return expandedUrl; | ||||
|         } catch (final IllegalArgumentException uriEx) { | ||||
|             return url; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,40 @@ | ||||
| package com.baeldung.httpclient; | ||||
| 
 | ||||
| import static org.assertj.core.api.Assertions.assertThat; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| 
 | ||||
| import org.apache.hc.client5.http.classic.methods.HttpGet; | ||||
| import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; | ||||
| import org.apache.hc.client5.http.impl.classic.HttpClients; | ||||
| import org.apache.hc.core5.http.HttpEntity; | ||||
| import org.apache.hc.core5.http.HttpStatus; | ||||
| import org.junit.jupiter.api.Test; | ||||
| 
 | ||||
| class HttpClientCancelRequestLiveTest { | ||||
| 
 | ||||
|     private static final String SAMPLE_URL = "http://www.github.com"; | ||||
| 
 | ||||
|     @Test | ||||
|     void whenRequestIsCanceled_thenCorrect() throws IOException { | ||||
|         HttpGet request = new HttpGet(SAMPLE_URL); | ||||
|         try (CloseableHttpClient httpClient = HttpClients.createDefault()) { | ||||
|                 httpClient.execute(request, response -> { | ||||
|                 HttpEntity entity = response.getEntity(); | ||||
| 
 | ||||
|                 System.out.println("----------------------------------------"); | ||||
|                 System.out.println(response.getCode()); | ||||
|                 if (entity != null) { | ||||
|                     System.out.println("Response content length: " + entity.getContentLength()); | ||||
|                 } | ||||
|                 System.out.println("----------------------------------------"); | ||||
|                 // Do not feel like reading the response body | ||||
|                 // Call abort on the request object | ||||
|                 request.abort(); | ||||
| 
 | ||||
|                 assertThat(response.getCode()).isEqualTo(HttpStatus.SC_OK); | ||||
|                 return response; | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -1,8 +1,8 @@ | ||||
| package com.baeldung.httpclient.base; | ||||
| 
 | ||||
| import com.baeldung.httpclient.ResponseUtil; | ||||
| 
 | ||||
| import org.apache.http.Header; | ||||
| import org.apache.http.HttpEntity; | ||||
| import org.apache.http.HttpHeaders; | ||||
| import org.apache.http.client.config.RequestConfig; | ||||
| import org.apache.http.client.methods.CloseableHttpResponse; | ||||
| @ -10,7 +10,6 @@ import org.apache.http.client.methods.HttpGet; | ||||
| import org.apache.http.conn.ConnectTimeoutException; | ||||
| import org.apache.http.impl.client.CloseableHttpClient; | ||||
| import org.apache.http.impl.client.HttpClientBuilder; | ||||
| import org.apache.http.impl.client.HttpClients; | ||||
| import org.apache.http.impl.conn.BasicHttpClientConnectionManager; | ||||
| import org.junit.After; | ||||
| import org.junit.Before; | ||||
| @ -73,30 +72,4 @@ public class HttpClientLiveTest { | ||||
|         assertThat(headers, not(emptyArray())); | ||||
|     } | ||||
| 
 | ||||
|     // tests - cancel request | ||||
| 
 | ||||
|     @Test | ||||
|     public final void whenRequestIsCanceled_thenCorrect() throws IOException { | ||||
|         instance = HttpClients.custom().build(); | ||||
|         final HttpGet request = new HttpGet(SAMPLE_URL); | ||||
|         response = instance.execute(request); | ||||
| 
 | ||||
|         try { | ||||
|             final HttpEntity entity = response.getEntity(); | ||||
| 
 | ||||
|             System.out.println("----------------------------------------"); | ||||
|             System.out.println(response.getStatusLine()); | ||||
|             if (entity != null) { | ||||
|                 System.out.println("Response content length: " + entity.getContentLength()); | ||||
|             } | ||||
|             System.out.println("----------------------------------------"); | ||||
| 
 | ||||
|             // Do not feel like reading the response body | ||||
|             // Call abort on the request object | ||||
|             request.abort(); | ||||
|         } finally { | ||||
|             response.close(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -4,6 +4,7 @@ This module contains articles about Apache HttpClient 4.5 | ||||
| 
 | ||||
| ### Relevant Articles | ||||
| 
 | ||||
| - [Apache HttpClient – Cancel Request](https://www.baeldung.com/httpclient-cancel-request) | ||||
| - [Apache HttpClient with SSL](https://www.baeldung.com/httpclient-ssl) | ||||
| - [Apache HttpClient Timeout](https://www.baeldung.com/httpclient-timeout) | ||||
| - [Custom HTTP Header with the Apache HttpClient](https://www.baeldung.com/httpclient-custom-http-header) | ||||
|  | ||||
| @ -0,0 +1,57 @@ | ||||
| package com.baeldung.httpclient; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| 
 | ||||
| import org.apache.http.HttpEntity; | ||||
| import org.apache.http.client.methods.CloseableHttpResponse; | ||||
| import org.apache.http.client.methods.HttpGet; | ||||
| import org.apache.http.impl.client.CloseableHttpClient; | ||||
| import org.apache.http.impl.client.HttpClientBuilder; | ||||
| import org.apache.http.impl.client.HttpClients; | ||||
| 
 | ||||
| import org.junit.After; | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| public class HttpClientCancelRequestV4LiveTest { | ||||
| 
 | ||||
|     private static final String SAMPLE_URL = "http://www.github.com"; | ||||
| 
 | ||||
|     private CloseableHttpClient instance; | ||||
| 
 | ||||
|     private CloseableHttpResponse response; | ||||
| 
 | ||||
|     @Before | ||||
|     public final void before() { | ||||
|         instance = HttpClientBuilder.create().build(); | ||||
|     } | ||||
| 
 | ||||
|     @After | ||||
|     public final void after() throws IllegalStateException, IOException { | ||||
|         ResponseUtil.closeResponse(response); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public final void whenRequestIsCanceled_thenCorrect() throws IOException { | ||||
|         instance = HttpClients.custom().build(); | ||||
|         final HttpGet request = new HttpGet(SAMPLE_URL); | ||||
|         response = instance.execute(request); | ||||
| 
 | ||||
|         try { | ||||
|             final HttpEntity entity = response.getEntity(); | ||||
| 
 | ||||
|             System.out.println("----------------------------------------"); | ||||
|             System.out.println(response.getStatusLine()); | ||||
|             if (entity != null) { | ||||
|                 System.out.println("Response content length: " + entity.getContentLength()); | ||||
|             } | ||||
|             System.out.println("----------------------------------------"); | ||||
| 
 | ||||
|             // Do not feel like reading the response body | ||||
|             // Call abort on the request object | ||||
|             request.abort(); | ||||
|         } finally { | ||||
|             response.close(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -24,7 +24,7 @@ import org.junit.jupiter.api.AfterEach; | ||||
| import org.junit.jupiter.api.BeforeEach; | ||||
| import org.junit.jupiter.api.Test; | ||||
| 
 | ||||
| public class ApacheHttpClientRetryIntegrationTest { | ||||
| public class ApacheHttpClientRetryLiveTest { | ||||
| 
 | ||||
|     private Integer requestCounter; | ||||
|     private CloseableHttpClient httpClient; | ||||
| @ -3,14 +3,14 @@ | ||||
|     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>lambda</artifactId> | ||||
|     <artifactId>lambda-function</artifactId> | ||||
|     <version>0.1.0-SNAPSHOT</version> | ||||
|     <name>lambda</name> | ||||
|     <name>lambda-function</name> | ||||
|     <packaging>jar</packaging> | ||||
| 
 | ||||
|     <parent> | ||||
|         <groupId>com.baeldung</groupId> | ||||
|         <artifactId>aws-lambda</artifactId> | ||||
|         <artifactId>aws-lambda-modules</artifactId> | ||||
|         <version>1.0.0-SNAPSHOT</version> | ||||
|     </parent> | ||||
| 
 | ||||
| @ -3,8 +3,8 @@ | ||||
|     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>aws-lambda</artifactId> | ||||
|     <name>aws-lambda</name> | ||||
|     <artifactId>aws-lambda-modules</artifactId> | ||||
|     <name>aws-lambda-modules</name> | ||||
|     <packaging>pom</packaging> | ||||
| 
 | ||||
|     <parent> | ||||
| @ -14,9 +14,9 @@ | ||||
|     </parent> | ||||
| 
 | ||||
|     <modules> | ||||
|         <module>lambda</module> | ||||
|         <module>shipping-tracker/ShippingFunction</module> | ||||
|         <module>todo-reminder/ToDoFunction</module> | ||||
|         <module>lambda-function</module> | ||||
|         <module>shipping-tracker-lambda/ShippingFunction</module> | ||||
|         <module>todo-reminder-lambda/ToDoFunction</module> | ||||
|     </modules> | ||||
| 
 | ||||
| </project> | ||||
| @ -9,7 +9,7 @@ | ||||
| 
 | ||||
|     <parent> | ||||
|         <groupId>com.baeldung</groupId> | ||||
|         <artifactId>aws-lambda</artifactId> | ||||
|         <artifactId>aws-lambda-modules</artifactId> | ||||
|         <version>1.0.0-SNAPSHOT</version> | ||||
|         <relativePath>../../</relativePath> | ||||
|     </parent> | ||||
| @ -8,6 +8,13 @@ | ||||
|     <name>ToDoFunction</name> | ||||
|     <packaging>jar</packaging> | ||||
| 
 | ||||
|     <parent> | ||||
|         <groupId>com.baeldung</groupId> | ||||
|         <artifactId>aws-lambda-modules</artifactId> | ||||
|         <version>1.0.0-SNAPSHOT</version> | ||||
|         <relativePath>../../</relativePath> | ||||
|     </parent> | ||||
| 
 | ||||
|     <dependencies> | ||||
|         <dependency> | ||||
|             <groupId>com.amazonaws</groupId> | ||||
| @ -21,7 +21,7 @@ import static org.assertj.core.api.Assertions.assertThat; | ||||
| import static org.mockito.Mockito.verify; | ||||
| 
 | ||||
| @RunWith(MockitoJUnitRunner.class) | ||||
| public class AppTest { | ||||
| public class AppUnitTest { | ||||
| 
 | ||||
|     @Mock(answer = Answers.RETURNS_DEEP_STUBS) | ||||
|     private Context mockContext; | ||||
| @ -7,7 +7,7 @@ import uk.org.webcompere.systemstubs.rules.SystemOutRule; | ||||
| 
 | ||||
| import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; | ||||
| 
 | ||||
| public class ToDoReaderServiceTest { | ||||
| public class ToDoReaderServiceUnitTest { | ||||
| 
 | ||||
|     @Rule | ||||
|     public SystemOutRule systemOutRule = new SystemOutRule(); | ||||
| @ -6,4 +6,5 @@ This module contains articles about Simple Storage Service (S3) on AWS | ||||
| 
 | ||||
| - [AWS S3 with Java](https://www.baeldung.com/aws-s3-java) | ||||
| - [Multipart Uploads in Amazon S3 with Java](https://www.baeldung.com/aws-s3-multipart-upload) | ||||
| - [Using the JetS3t Java Client With Amazon S3](https://www.baeldung.com/jets3t-amazon-s3) | ||||
| - [Using the JetS3t Java Client With Amazon S3](https://www.baeldung.com/jets3t-amazon-s3) | ||||
| - [Check if a Specified Key Exists in a Given S3 Bucket Using Java](https://www.baeldung.com/java-aws-s3-check-specified-key-exists) | ||||
|  | ||||
| @ -15,7 +15,7 @@ | ||||
| 
 | ||||
|     <modules> | ||||
|         <module>aws-app-sync</module> | ||||
|         <module>aws-lambda</module> | ||||
|         <module>aws-lambda-modules</module> | ||||
|         <module>aws-miscellaneous</module> | ||||
|         <module>aws-reactive</module> | ||||
|         <module>aws-s3</module> | ||||
|  | ||||
| @ -3,9 +3,9 @@ | ||||
|     xmlns="http://maven.apache.org/POM/4.0.0" | ||||
|     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <artifactId>checker-plugin</artifactId> | ||||
|     <artifactId>checker-framework</artifactId> | ||||
|     <version>1.0-SNAPSHOT</version> | ||||
|     <name>checker-plugin</name> | ||||
|     <name>checker-framework</name> | ||||
|     <packaging>jar</packaging> | ||||
| 
 | ||||
|     <parent> | ||||
| @ -1,3 +1,4 @@ | ||||
| ## Relevant Articles | ||||
| - [Record Patterns in Java 19](https://www.baeldung.com/java-19-record-patterns) | ||||
| - [Structured Concurrency in Java 19](https://www.baeldung.com/java-structured-concurrency) | ||||
| - [Possible Root Causes for High CPU Usage in Java](https://www.baeldung.com/java-high-cpu-usage-causes) | ||||
|  | ||||
| @ -11,4 +11,6 @@ This module contains articles about Java 8 core features | ||||
| - [Convert Between Byte Array and UUID in Java](https://www.baeldung.com/java-byte-array-to-uuid) | ||||
| - [Create a Simple “Rock-Paper-Scissors” Game in Java](https://www.baeldung.com/java-rock-paper-scissors) | ||||
| - [VarArgs vs Array Input Parameters in Java](https://www.baeldung.com/varargs-vs-array) | ||||
| - [Lambda Expression vs. Anonymous Inner Class](https://www.baeldung.com/java-lambdas-vs-anonymous-class) | ||||
| - [Java Helper vs. Utility Classes](https://www.baeldung.com/java-helper-vs-utility-classes) | ||||
| - [[<-- Prev]](/core-java-modules/core-java-8) | ||||
|  | ||||
| @ -2,4 +2,5 @@ | ||||
| 
 | ||||
| - [Generating Random Dates in Java](https://www.baeldung.com/java-random-dates) | ||||
| - [Creating a LocalDate with Values in Java](https://www.baeldung.com/java-creating-localdate-with-values) | ||||
| - [[<-- Prev]](/core-java-modules/core-java-datetime-java8-1) | ||||
| - [Parsing Date Strings with Varying Formats](https://www.baeldung.com/java-parsing-dates-many-formats) | ||||
| - [[<-- Prev]](/core-java-modules/core-java-datetime-java8-1) | ||||
|  | ||||
| @ -0,0 +1,20 @@ | ||||
| package com.baeldung.parsingDates; | ||||
| 
 | ||||
| import java.util.Arrays; | ||||
| import java.util.List; | ||||
| import org.joda.time.LocalDate; | ||||
| import org.joda.time.format.DateTimeFormat; | ||||
| 
 | ||||
| public class SimpleDateTimeFormat { | ||||
| 
 | ||||
|     public static LocalDate parseDate(String date) { | ||||
|         List<String> patternList = Arrays.asList("MM/dd/yyyy", "dd.MM.yyyy", "yyyy-MM-dd"); | ||||
|         for (String pattern : patternList) { | ||||
|             try { | ||||
|                 return DateTimeFormat.forPattern(pattern).parseLocalDate(date); | ||||
|             } catch (IllegalArgumentException e) { | ||||
|             } | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,17 @@ | ||||
| package com.baeldung.parsingDates; | ||||
| 
 | ||||
| import java.time.LocalDate; | ||||
| import java.time.format.DateTimeFormatter; | ||||
| import java.time.format.DateTimeFormatterBuilder; | ||||
| 
 | ||||
| public class SimpleDateTimeFormater { | ||||
| 
 | ||||
|     public static LocalDate parseDate(String date) { | ||||
|         DateTimeFormatterBuilder dateTimeFormatterBuilder = new DateTimeFormatterBuilder() | ||||
|                 .append(DateTimeFormatter.ofPattern("[MM/dd/yyyy]" + "[dd-MM-yyyy]" + "[yyyy-MM-dd]")); | ||||
| 
 | ||||
|         DateTimeFormatter dateTimeFormatter = dateTimeFormatterBuilder.toFormatter(); | ||||
| 
 | ||||
|         return LocalDate.parse(date, dateTimeFormatter); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,18 @@ | ||||
| package com.baeldung.parsingDates; | ||||
| 
 | ||||
| import java.text.ParseException; | ||||
| import java.util.Date; | ||||
| import org.apache.commons.lang3.time.DateUtils; | ||||
| 
 | ||||
| public class SimpleDateUtils { | ||||
| 
 | ||||
|     public static Date parseDate(String date) { | ||||
|         try { | ||||
|             return DateUtils.parseDateStrictly(date, | ||||
|                     new String[]{"yyyy/MM/dd", "dd/MM/yyyy", "yyyy-MM-dd"}); | ||||
|         } catch (ParseException ex) { | ||||
|             return null; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,19 @@ | ||||
| package com.baeldung.parsingDates; | ||||
| 
 | ||||
| import java.text.ParseException; | ||||
| import java.text.SimpleDateFormat; | ||||
| import java.util.Date; | ||||
| import java.util.List; | ||||
| 
 | ||||
| public class SimpleParseDate { | ||||
| 
 | ||||
|     public Date parseDate(String dateString, List<String> formatStrings) { | ||||
|         for (String formatString : formatStrings) { | ||||
|             try { | ||||
|                 return new SimpleDateFormat(formatString).parse(dateString); | ||||
|             } catch (ParseException e) { | ||||
|             } | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,43 @@ | ||||
| package com.baeldung.parsingDates; | ||||
| 
 | ||||
| import com.baeldung.parsingDates.SimpleDateTimeFormat; | ||||
| import com.baeldung.parsingDates.SimpleDateTimeFormater; | ||||
| import com.baeldung.parsingDates.SimpleDateUtils; | ||||
| import com.baeldung.parsingDates.SimpleParseDate; | ||||
| import java.time.format.DateTimeParseException; | ||||
| import java.util.Arrays; | ||||
| import org.junit.*; | ||||
| import static org.junit.Assert.*; | ||||
| import org.joda.time.LocalDate; | ||||
| 
 | ||||
| public class SimpleParseDateUnitTest { | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenInvalidInput_thenGettingUnexpectedResult() { | ||||
|         SimpleParseDate simpleParseDate = new SimpleParseDate(); | ||||
|         String date = "2022-40-40"; | ||||
|         assertEquals("Sat May 10 00:00:00 UTC 2025", simpleParseDate.parseDate(date, Arrays.asList("MM/dd/yyyy", "dd.MM.yyyy", "yyyy-MM-dd")).toString()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenInvalidDate_thenAssertThrows() { | ||||
|         SimpleDateTimeFormater simpleDateTimeFormater = new SimpleDateTimeFormater(); | ||||
|         assertEquals(java.time.LocalDate.parse("2022-12-04"), simpleDateTimeFormater.parseDate("2022-12-04")); | ||||
|         assertThrows(DateTimeParseException.class, () -> simpleDateTimeFormater.parseDate("2022-13-04")); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenDateIsCorrect_thenParseCorrect() { | ||||
|         SimpleDateUtils simpleDateUtils = new SimpleDateUtils(); | ||||
|         assertNull(simpleDateUtils.parseDate("53/10/2014")); | ||||
|         assertEquals("Wed Sep 10 00:00:00 UTC 2014", simpleDateUtils.parseDate("10/09/2014").toString()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenDateIsCorrect_thenResultCorrect() { | ||||
|         SimpleDateTimeFormat simpleDateTimeFormat = new SimpleDateTimeFormat(); | ||||
|         assertNull(simpleDateTimeFormat.parseDate("53/10/2014")); | ||||
|         assertEquals(LocalDate.parse("2014-10-10"), simpleDateTimeFormat.parseDate("2014-10-10")); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -8,5 +8,5 @@ This module contains articles about Project Jigsaw and the Java Platform Module | ||||
| - [A Guide to Java 9 Modularity](https://www.baeldung.com/java-9-modularity) | ||||
| - [Java 9 java.lang.Module API](https://www.baeldung.com/java-9-module-api) | ||||
| - [Java 9 Illegal Reflective Access Warning](https://www.baeldung.com/java-illegal-reflective-access) | ||||
| 
 | ||||
| - [Java Modularity and Unit Testing](https://www.baeldung.com/java-modularity-unit-testing) | ||||
| 
 | ||||
|  | ||||
| @ -0,0 +1,2 @@ | ||||
| #!/usr/bin/env bash | ||||
| javac -d mods/com.baeldung.library.core $(find library-core/src/main -name "*.java") | ||||
| @ -0,0 +1,10 @@ | ||||
| #!/usr/bin/env bash | ||||
| javac --class-path outDir/library-core/:\ | ||||
| libs/junit-jupiter-engine-5.9.2.jar:\ | ||||
| libs/junit-platform-engine-1.9.2.jar:\ | ||||
| libs/apiguardian-api-1.1.2.jar:\ | ||||
| libs/junit-jupiter-params-5.9.2.jar:\ | ||||
| libs/junit-jupiter-api-5.9.2.jar:\ | ||||
| libs/opentest4j-1.2.0.jar:\ | ||||
| libs/junit-platform-commons-1.9.2.jar \ | ||||
| -d outDir/library-test library-core/src/test/java/com/baeldung/library/core/LibraryUnitTest.java | ||||
| @ -0,0 +1,13 @@ | ||||
| #!/usr/bin/env bash | ||||
| javac --class-path libs/junit-jupiter-engine-5.9.2.jar:\ | ||||
| libs/junit-platform-engine-1.9.2.jar:\ | ||||
| libs/apiguardian-api-1.1.2.jar:\ | ||||
| libs/junit-jupiter-params-5.9.2.jar:\ | ||||
| libs/junit-jupiter-api-5.9.2.jar:\ | ||||
| libs/opentest4j-1.2.0.jar:\ | ||||
| libs/junit-platform-commons-1.9.2.jar \ | ||||
| -d outDir/library-core \ | ||||
| library-core/src/main/java/com/baeldung/library/core/Book.java \ | ||||
| library-core/src/main/java/com/baeldung/library/core/Library.java \ | ||||
| library-core/src/main/java/com/baeldung/library/core/Main.java \ | ||||
| library-core/src/test/java/com/baeldung/library/core/LibraryUnitTest.java | ||||
							
								
								
									
										12
									
								
								core-java-modules/core-java-9-jigsaw/compile-library-core.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								core-java-modules/core-java-9-jigsaw/compile-library-core.sh
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| #!/usr/bin/env bash | ||||
| javac --class-path libs/junit-jupiter-engine-5.9.2.jar:\ | ||||
| libs/junit-platform-engine-1.9.2.jar:\ | ||||
| libs/apiguardian-api-1.1.2.jar:\ | ||||
| libs/junit-jupiter-params-5.9.2.jar:\ | ||||
| libs/junit-jupiter-api-5.9.2.jar:\ | ||||
| libs/opentest4j-1.2.0.jar:\ | ||||
| libs/junit-platform-commons-1.9.2.jar \ | ||||
| -d outDir/library-core \ | ||||
| library-core/src/main/java/com/baeldung/library/core/Book.java \ | ||||
| library-core/src/main/java/com/baeldung/library/core/Library.java \ | ||||
| library-core/src/main/java/com/baeldung/library/core/Main.java | ||||
| @ -0,0 +1,2 @@ | ||||
| #!/usr/bin/env bash | ||||
| javac --module-path mods:libs -d mods/com.baeldung.library.test $(find library-test/src/test -name "*.java") | ||||
| @ -0,0 +1,10 @@ | ||||
| #!/usr/bin/env bash | ||||
| wget -P libs/ https://repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar / | ||||
| wget -P libs/ https://repo1.maven.org/maven2/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar / | ||||
| wget -P libs/ https://repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.9.2/junit-platform-commons-1.9.2.jar / | ||||
| wget -P libs/ https://repo1.maven.org/maven2/org/junit/platform/junit-platform-engine/1.9.2/junit-platform-engine-1.9.2.jar / | ||||
| wget -P libs/ https://repo1.maven.org/maven2/org/junit/platform/junit-platform-reporting/1.9.2/junit-platform-reporting-1.9.2.jar / | ||||
| wget -P libs/ https://repo1.maven.org/maven2/org/junit/platform/junit-platform-console/1.9.2/junit-platform-console-1.9.2.jar / | ||||
| wget -P libs/ https://repo1.maven.org/maven2/org/junit/platform/junit-platform-launcher/1.9.2/junit-platform-launcher-1.9.2.jar / | ||||
| wget -P libs/ https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-engine/5.9.2/junit-jupiter-engine-5.9.2.jar / | ||||
| wget -P libs/ https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-params/5.9.2/junit-jupiter-params-5.9.2.jar | ||||
							
								
								
									
										55
									
								
								core-java-modules/core-java-9-jigsaw/library-core/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								core-java-modules/core-java-9-jigsaw/library-core/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,55 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" | ||||
|   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|   <modelVersion>4.0.0</modelVersion> | ||||
|   <parent> | ||||
|     <groupId>com.baeldung</groupId> | ||||
|     <artifactId>core-java-9-jigsaw</artifactId> | ||||
|     <version>0.2-SNAPSHOT</version> | ||||
|   </parent> | ||||
| 
 | ||||
|   <artifactId>library-core</artifactId> | ||||
| 
 | ||||
|   <properties> | ||||
|     <maven.compiler.source>19</maven.compiler.source> | ||||
|     <maven.compiler.target>19</maven.compiler.target> | ||||
|     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||||
|   </properties> | ||||
| 
 | ||||
|   <dependencies> | ||||
|     <dependency> | ||||
|       <groupId>org.junit.jupiter</groupId> | ||||
|       <artifactId>junit-jupiter-api</artifactId> | ||||
|       <version>5.9.2</version> | ||||
|       <scope>test</scope> | ||||
|     </dependency> | ||||
|     <dependency> | ||||
|       <groupId>org.junit.jupiter</groupId> | ||||
|       <artifactId>junit-jupiter-engine</artifactId> | ||||
|       <version>5.9.2</version> | ||||
|       <scope>test</scope> | ||||
|     </dependency> | ||||
|   </dependencies> | ||||
| 
 | ||||
|   <build> | ||||
|     <plugins> | ||||
|       <plugin> | ||||
|         <groupId>org.apache.maven.plugins</groupId> | ||||
|         <artifactId>maven-compiler-plugin</artifactId> | ||||
|         <version>3.8.1</version> | ||||
|         <configuration> | ||||
|           <release>9</release> | ||||
|         </configuration> | ||||
|       </plugin> | ||||
|       <plugin> | ||||
|         <groupId>org.apache.maven.plugins</groupId> | ||||
|         <artifactId>maven-surefire-plugin</artifactId> | ||||
|         <version>3.0.0-M5</version> | ||||
|         <configuration> | ||||
|           <useModulePath>false</useModulePath> | ||||
|         </configuration> | ||||
|       </plugin> | ||||
|     </plugins> | ||||
|   </build> | ||||
| </project> | ||||
| @ -0,0 +1,52 @@ | ||||
| package com.baeldung.library.core; | ||||
| 
 | ||||
| import java.util.Objects; | ||||
| 
 | ||||
| public class Book { | ||||
| 
 | ||||
|     private String title; | ||||
|     private String author; | ||||
| 
 | ||||
|     public Book(String title, String author) { | ||||
|         this.title = title; | ||||
|         this.author = author; | ||||
|     } | ||||
| 
 | ||||
|     public String getTitle() { | ||||
|         return title; | ||||
|     } | ||||
| 
 | ||||
|     public String getAuthor() { | ||||
|         return author; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     @Override | ||||
|     public String toString() { | ||||
|         return "Book [title=" + title + ", author=" + author + "]"; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public boolean equals(final Object o) { | ||||
|         if (this == o) { | ||||
|             return true; | ||||
|         } | ||||
|         if (o == null || getClass() != o.getClass()) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         final Book book = (Book) o; | ||||
| 
 | ||||
|         if (!Objects.equals(title, book.title)) { | ||||
|             return false; | ||||
|         } | ||||
|         return Objects.equals(author, book.author); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public int hashCode() { | ||||
|         int result = title != null ? title.hashCode() : 0; | ||||
|         result = 31 * result + (author != null ? author.hashCode() : 0); | ||||
|         return result; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,25 @@ | ||||
| package com.baeldung.library.core; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| public class Library { | ||||
| 
 | ||||
|     private List<Book> books = new ArrayList<>(); | ||||
| 
 | ||||
|     public void addBook(Book book) { | ||||
|         books.add(book); | ||||
|     } | ||||
| 
 | ||||
|     public List<Book> getBooks() { | ||||
|         return books; | ||||
|     } | ||||
| 
 | ||||
|     void removeBook(Book book) { | ||||
|         books.remove(book); | ||||
|     } | ||||
| 
 | ||||
|     protected void removeBookByAuthor(String author) { | ||||
|         books.removeIf(book -> book.getAuthor().equals(author)); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,16 @@ | ||||
| package com.baeldung.library.core; | ||||
| 
 | ||||
| public class Main { | ||||
| 
 | ||||
|     public static void main(String[] args) { | ||||
|         Library library = new Library(); | ||||
|         library.addBook(new Book("The Lord of the Rings", "J.R.R. Tolkien")); | ||||
|         library.addBook(new Book("The Hobbit", "J.R.R. Tolkien")); | ||||
|         library.addBook(new Book("The Silmarillion", "J.R.R. Tolkien")); | ||||
|         library.addBook(new Book("The Chronicles of Narnia", "C.S. Lewis")); | ||||
|         library.addBook(new Book("The Lion, the Witch and the Wardrobe", "C.S. Lewis")); | ||||
|         System.out.println("Welcome to our library!"); | ||||
|         System.out.println("We have the following books:"); | ||||
|         library.getBooks().forEach(System.out::println); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,3 @@ | ||||
| module com.baeldung.library.core { | ||||
|     exports com.baeldung.library.core; | ||||
| } | ||||
| @ -0,0 +1,47 @@ | ||||
| package com.baeldung.library.core; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.*; | ||||
| 
 | ||||
| import org.junit.jupiter.api.Test; | ||||
| 
 | ||||
| class LibraryUnitTest { | ||||
| 
 | ||||
|     @Test | ||||
|     void givenEmptyLibrary_whenAddABook_thenLibraryHasOneBook() { | ||||
|         Library library = new Library(); | ||||
|         Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien"); | ||||
|         library.addBook(theLordOfTheRings); | ||||
|         int expected = 1; | ||||
|         int actual = library.getBooks().size(); | ||||
|         assertEquals(expected, actual); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenTheLibraryWithABook_whenRemoveABook_thenLibraryIsEmpty() { | ||||
|         Library library = new Library(); | ||||
|         Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien"); | ||||
|         library.addBook(theLordOfTheRings); | ||||
|         library.removeBook(theLordOfTheRings); | ||||
|         int expected = 0; | ||||
|         int actual = library.getBooks().size(); | ||||
|         assertEquals(expected, actual); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenTheLibraryWithSeveralBook_whenRemoveABookByAuthor_thenLibraryHasNoBooksByTheAuthor() { | ||||
|         Library library = new Library(); | ||||
|         Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien"); | ||||
|         Book theHobbit = new Book("The Hobbit", "J.R.R. Tolkien"); | ||||
|         Book theSilmarillion = new Book("The Silmarillion", "J.R.R. Tolkien"); | ||||
|         Book theHungerGames = new Book("The Hunger Games", "Suzanne Collins"); | ||||
|         library.addBook(theLordOfTheRings); | ||||
|         library.addBook(theHobbit); | ||||
|         library.addBook(theSilmarillion); | ||||
|         library.addBook(theHungerGames); | ||||
|         library.removeBookByAuthor("J.R.R. Tolkien"); | ||||
|         int expected = 1; | ||||
|         int actual = library.getBooks().size(); | ||||
|         assertEquals(expected, actual); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,53 @@ | ||||
| package com.baeldung.library.test; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| 
 | ||||
| import com.baeldung.library.core.Book; | ||||
| import com.baeldung.library.core.Library; | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.lang.reflect.Method; | ||||
| import org.junit.jupiter.api.Test; | ||||
| 
 | ||||
| class LibraryUnitTest { | ||||
| 
 | ||||
|     @Test | ||||
|     void givenEmptyLibrary_whenAddABook_thenLibraryHasOneBook() { | ||||
|         Library library = new Library(); | ||||
|         Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien"); | ||||
|         library.addBook(theLordOfTheRings); | ||||
|         int expected = 1; | ||||
|         int actual = library.getBooks().size(); | ||||
|         assertEquals(expected, actual); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenTheLibraryWithABook_whenRemoveABook_thenLibraryIsEmpty() | ||||
|         throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { | ||||
|         Library library = new Library(); | ||||
|         Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien"); | ||||
|         library.addBook(theLordOfTheRings); | ||||
|         Method removeBook = Library.class.getDeclaredMethod("removeBook", Book.class); | ||||
|         removeBook.setAccessible(true); | ||||
|         removeBook.invoke(library, theLordOfTheRings); | ||||
|         int expected = 0; | ||||
|         int actual = library.getBooks().size(); | ||||
|         assertEquals(expected, actual); | ||||
|     } | ||||
| @Test | ||||
| void givenTheLibraryWithSeveralBook_whenRemoveABookByAuthor_thenLibraryHasNoBooksByTheAuthor() { | ||||
|     TestLibrary library = new TestLibrary(); | ||||
|     Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien"); | ||||
|     Book theHobbit = new Book("The Hobbit", "J.R.R. Tolkien"); | ||||
|     Book theSilmarillion = new Book("The Silmarillion", "J.R.R. Tolkien"); | ||||
|     Book theHungerGames = new Book("The Hunger Games", "Suzanne Collins"); | ||||
|     library.addBook(theLordOfTheRings); | ||||
|     library.addBook(theHobbit); | ||||
|     library.addBook(theSilmarillion); | ||||
|     library.addBook(theHungerGames); | ||||
|     library.removeBookByAuthor("J.R.R. Tolkien"); | ||||
|     int expected = 1; | ||||
|     int actual = library.getBooks().size(); | ||||
|     assertEquals(expected, actual); | ||||
| } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,10 @@ | ||||
| package com.baeldung.library.test; | ||||
| 
 | ||||
| import com.baeldung.library.core.Library; | ||||
| 
 | ||||
| public class TestLibrary extends Library { | ||||
|     @Override | ||||
|     public void removeBookByAuthor(final String author) { | ||||
|         super.removeBookByAuthor(author); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,5 @@ | ||||
| module com.baeldung.library.test { | ||||
|     requires com.baeldung.library.core; | ||||
|     requires org.junit.jupiter.api; | ||||
|     opens com.baeldung.library.test to org.junit.platform.commons; | ||||
| } | ||||
| @ -5,6 +5,10 @@ | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <artifactId>core-java-9-jigsaw</artifactId> | ||||
|     <name>core-java-9-jigsaw</name> | ||||
|     <packaging>pom</packaging> | ||||
|     <modules> | ||||
|         <module>library-core</module> | ||||
|     </modules> | ||||
| 
 | ||||
|     <parent> | ||||
|         <groupId>com.baeldung</groupId> | ||||
|  | ||||
| @ -0,0 +1,7 @@ | ||||
| #!/usr/bin/env bash | ||||
| java --module-path mods:libs \ | ||||
| --add-modules com.baeldung.library.core \ | ||||
| --add-opens com.baeldung.library.core/com.baeldung.library.core=org.junit.platform.commons \ | ||||
| --add-reads com.baeldung.library.core=org.junit.jupiter.api \ | ||||
| --patch-module com.baeldung.library.core=outDir/library-test \ | ||||
| --module org.junit.platform.console --select-class com.baeldung.library.core.LibraryUnitTest | ||||
| @ -0,0 +1,2 @@ | ||||
| #!/usr/bin/env bash | ||||
| java --module-path mods --module com.baeldung.library.core/com.baeldung.library.core.Main | ||||
| @ -0,0 +1,5 @@ | ||||
| #!/usr/bin/env bash | ||||
| java --module-path libs \ | ||||
| org.junit.platform.console.ConsoleLauncher \ | ||||
| --classpath ./outDir/library-core \ | ||||
| --select-class com.baeldung.library.core.LibraryUnitTest | ||||
| @ -0,0 +1,5 @@ | ||||
| #!/usr/bin/env bash | ||||
| java --module-path mods:libs \ | ||||
| --add-modules com.baeldung.library.test \ | ||||
| --add-opens com.baeldung.library.core/com.baeldung.library.core=com.baeldung.library.test \ | ||||
| org.junit.platform.console.ConsoleLauncher --select-class com.baeldung.library.test.LibraryUnitTest | ||||
| @ -1,84 +1,126 @@ | ||||
| package com.baeldung.map; | ||||
| 
 | ||||
| import com.google.common.collect.ImmutableMap; | ||||
| import org.junit.jupiter.api.Test; | ||||
| import static org.hamcrest.MatcherAssert.assertThat; | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertFalse; | ||||
| import static org.junit.jupiter.api.Assertions.assertThrows; | ||||
| import static org.junit.jupiter.api.Assertions.assertTrue; | ||||
| 
 | ||||
| import java.util.AbstractMap; | ||||
| import java.util.Collections; | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.*; | ||||
| import org.hamcrest.collection.IsMapContaining; | ||||
| import org.junit.jupiter.api.Test; | ||||
| 
 | ||||
| import com.google.common.collect.ImmutableMap; | ||||
| 
 | ||||
| public class ImmutableMapUnitTest { | ||||
| class ImmutableMapUnitTest { | ||||
| 
 | ||||
| 	@Test | ||||
| 	public void whenCollectionsUnModifiableMapMethod_thenOriginalCollectionChangesReflectInUnmodifiableMap() { | ||||
|     @Test | ||||
|     void whenCollectionsUnModifiableMapMethod_thenOriginalCollectionChangesReflectInUnmodifiableMap() { | ||||
| 
 | ||||
| 		Map<String, String> mutableMap = new HashMap<>(); | ||||
| 		mutableMap.put("USA", "North America"); | ||||
|         Map<String, String> mutableMap = new HashMap<>(); | ||||
|         mutableMap.put("USA", "North America"); | ||||
| 
 | ||||
| 		Map<String, String> unmodifiableMap = Collections.unmodifiableMap(mutableMap); | ||||
| 		assertThrows(UnsupportedOperationException.class, () -> unmodifiableMap.put("Canada", "North America")); | ||||
| 		 | ||||
| 		mutableMap.remove("USA"); | ||||
| 		assertFalse(unmodifiableMap.containsKey("USA")); | ||||
| 		 | ||||
| 		mutableMap.put("Mexico", "North America"); | ||||
| 		assertTrue(unmodifiableMap.containsKey("Mexico")); | ||||
| 	} | ||||
| 	 | ||||
| 	@Test | ||||
| 	@SuppressWarnings("deprecation") | ||||
| 	public void whenGuavaImmutableMapFromCopyOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { | ||||
|         Map<String, String> unmodifiableMap = Collections.unmodifiableMap(mutableMap); | ||||
|         assertThrows(UnsupportedOperationException.class, () -> unmodifiableMap.put("Canada", "North America")); | ||||
| 
 | ||||
| 		Map<String, String> mutableMap = new HashMap<>(); | ||||
| 		mutableMap.put("USA", "North America"); | ||||
|         mutableMap.remove("USA"); | ||||
|         assertFalse(unmodifiableMap.containsKey("USA")); | ||||
| 
 | ||||
| 		ImmutableMap<String, String> immutableMap = ImmutableMap.copyOf(mutableMap); | ||||
| 		assertTrue(immutableMap.containsKey("USA")); | ||||
| 		 | ||||
| 		assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); | ||||
| 		 | ||||
| 		mutableMap.remove("USA"); | ||||
| 		assertTrue(immutableMap.containsKey("USA")); | ||||
| 		 | ||||
| 		mutableMap.put("Mexico", "North America"); | ||||
| 		assertFalse(immutableMap.containsKey("Mexico")); | ||||
| 	} | ||||
| 	 | ||||
| 	@Test | ||||
| 	@SuppressWarnings("deprecation") | ||||
| 	public void whenGuavaImmutableMapFromBuilderMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { | ||||
|         mutableMap.put("Mexico", "North America"); | ||||
|         assertTrue(unmodifiableMap.containsKey("Mexico")); | ||||
|     } | ||||
| 
 | ||||
| 		Map<String, String> mutableMap = new HashMap<>(); | ||||
| 		mutableMap.put("USA", "North America"); | ||||
|     @Test | ||||
|     @SuppressWarnings("deprecation") | ||||
|     void whenGuavaImmutableMapFromCopyOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { | ||||
| 
 | ||||
| 		ImmutableMap<String, String> immutableMap = ImmutableMap.<String, String>builder() | ||||
| 				.putAll(mutableMap) | ||||
| 				.put("Costa Rica", "North America") | ||||
| 				.build(); | ||||
| 		assertTrue(immutableMap.containsKey("USA")); | ||||
| 		assertTrue(immutableMap.containsKey("Costa Rica")); | ||||
| 		 | ||||
| 		assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); | ||||
| 		 | ||||
| 		mutableMap.remove("USA"); | ||||
| 		assertTrue(immutableMap.containsKey("USA")); | ||||
| 		 | ||||
| 		mutableMap.put("Mexico", "North America"); | ||||
| 		assertFalse(immutableMap.containsKey("Mexico")); | ||||
| 	} | ||||
| 	 | ||||
| 	@Test | ||||
| 	@SuppressWarnings("deprecation") | ||||
| 	public void whenGuavaImmutableMapFromOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { | ||||
|         Map<String, String> mutableMap = new HashMap<>(); | ||||
|         mutableMap.put("USA", "North America"); | ||||
| 
 | ||||
| 		ImmutableMap<String, String> immutableMap = ImmutableMap.of("USA", "North America", "Costa Rica", "North America"); | ||||
| 		assertTrue(immutableMap.containsKey("USA")); | ||||
| 		assertTrue(immutableMap.containsKey("Costa Rica")); | ||||
|         ImmutableMap<String, String> immutableMap = ImmutableMap.copyOf(mutableMap); | ||||
|         assertTrue(immutableMap.containsKey("USA")); | ||||
| 
 | ||||
|         assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); | ||||
| 
 | ||||
|         mutableMap.remove("USA"); | ||||
|         assertTrue(immutableMap.containsKey("USA")); | ||||
| 
 | ||||
|         mutableMap.put("Mexico", "North America"); | ||||
|         assertFalse(immutableMap.containsKey("Mexico")); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     @SuppressWarnings("deprecation") | ||||
|     void whenGuavaImmutableMapFromBuilderMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { | ||||
| 
 | ||||
|         Map<String, String> mutableMap = new HashMap<>(); | ||||
|         mutableMap.put("USA", "North America"); | ||||
| 
 | ||||
|         ImmutableMap<String, String> immutableMap = ImmutableMap.<String, String>builder() | ||||
|             .putAll(mutableMap) | ||||
|             .put("Costa Rica", "North America") | ||||
|             .build(); | ||||
|         assertTrue(immutableMap.containsKey("USA")); | ||||
|         assertTrue(immutableMap.containsKey("Costa Rica")); | ||||
| 
 | ||||
|         assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); | ||||
| 
 | ||||
|         mutableMap.remove("USA"); | ||||
|         assertTrue(immutableMap.containsKey("USA")); | ||||
| 
 | ||||
|         mutableMap.put("Mexico", "North America"); | ||||
|         assertFalse(immutableMap.containsKey("Mexico")); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     @SuppressWarnings("deprecation") | ||||
|     void whenGuavaImmutableMapFromOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { | ||||
| 
 | ||||
|         ImmutableMap<String, String> immutableMap = ImmutableMap.of("USA", "North America", "Costa Rica", "North America"); | ||||
|         assertTrue(immutableMap.containsKey("USA")); | ||||
|         assertTrue(immutableMap.containsKey("Costa Rica")); | ||||
| 
 | ||||
|         assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     @SuppressWarnings("deprecation") | ||||
|     void givenGuavaImmutableMapFromOfEntriesMethodwhenModifyEntry_thenThrowUnsupportedOperationException() { | ||||
| 
 | ||||
|         ImmutableMap<Integer, String> immutableMap = ImmutableMap.ofEntries(new AbstractMap.SimpleEntry<>(1, "USA"), new AbstractMap.SimpleEntry<>(2, "Canada")); | ||||
| 
 | ||||
|         assertThrows(UnsupportedOperationException.class, () -> immutableMap.put(2, "Mexico")); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenEntrieswhenCreatingGuavaImmutableMapFromOfEntriesMethod_thenCorrect() { | ||||
| 
 | ||||
|         ImmutableMap<Integer, String> immutableMap = ImmutableMap.ofEntries(new AbstractMap.SimpleEntry<>(1, "USA")); | ||||
| 
 | ||||
|         assertEquals(1, immutableMap.size()); | ||||
|         assertThat(immutableMap, IsMapContaining.hasEntry(1, "USA")); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenGuavaImmutableMapFromOfEntriesMethodwhenEntryKeyExists_thenThrowIllegalArgumentException() { | ||||
| 
 | ||||
|         assertThrows(IllegalArgumentException.class, () -> ImmutableMap.ofEntries(new AbstractMap.SimpleEntry<>(1, "USA"), new AbstractMap.SimpleEntry<>(1, "Canada"))); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenGuavaImmutableMapFromOfEntriesMethodwhenEntryKeyIsNull_thenThrowNullPointerException() { | ||||
| 
 | ||||
|         assertThrows(NullPointerException.class, () -> ImmutableMap.ofEntries(new AbstractMap.SimpleEntry<>(null, "USA"))); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenGuavaImmutableMapFromOfEntriesMethodwhenEntryValueIsNull_thenThrowNullPointerException() { | ||||
| 
 | ||||
|         assertThrows(NullPointerException.class, () -> ImmutableMap.ofEntries(new AbstractMap.SimpleEntry<>(1, null))); | ||||
|     } | ||||
| 
 | ||||
| 		assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
|  | ||||
							
								
								
									
										6
									
								
								core-java-modules/core-java-compiler/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								core-java-modules/core-java-compiler/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | ||||
| ## Core Java Compiler | ||||
| 
 | ||||
| ### Relevant Articles:  | ||||
| 
 | ||||
| - [Compiling Java *.class Files with javac](http://www.baeldung.com/javac) | ||||
| - [Illegal Character Compilation Error](https://www.baeldung.com/java-illegal-character-error) | ||||
							
								
								
									
										29
									
								
								core-java-modules/core-java-compiler/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								core-java-modules/core-java-compiler/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" | ||||
|     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <artifactId>core-java-compiler</artifactId> | ||||
|     <version>0.1.0-SNAPSHOT</version> | ||||
|     <name>core-java-compiler</name> | ||||
|     <packaging>jar</packaging> | ||||
| 
 | ||||
|     <parent> | ||||
|         <groupId>com.baeldung.core-java-modules</groupId> | ||||
|         <artifactId>core-java-modules</artifactId> | ||||
|         <version>0.0.1-SNAPSHOT</version> | ||||
|     </parent> | ||||
| 
 | ||||
|     <dependencies> | ||||
|         <dependency> | ||||
|             <groupId>com.google.gdata</groupId> | ||||
|             <artifactId>core</artifactId> | ||||
|             <version>${gdata.version}</version> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
| 
 | ||||
|     <properties> | ||||
|         <gdata.version>1.47.1</gdata.version> | ||||
|     </properties> | ||||
| 
 | ||||
| </project> | ||||
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