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();
|
|
@ -7,3 +7,4 @@ 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)
|
||||
- [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)
|
||||
- [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
|
|
@ -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
|
|
@ -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"));
|
||||
Map<String, String> unmodifiableMap = Collections.unmodifiableMap(mutableMap);
|
||||
assertThrows(UnsupportedOperationException.class, () -> unmodifiableMap.put("Canada", "North America"));
|
||||
|
||||
mutableMap.remove("USA");
|
||||
assertFalse(unmodifiableMap.containsKey("USA"));
|
||||
mutableMap.remove("USA");
|
||||
assertFalse(unmodifiableMap.containsKey("USA"));
|
||||
|
||||
mutableMap.put("Mexico", "North America");
|
||||
assertTrue(unmodifiableMap.containsKey("Mexico"));
|
||||
}
|
||||
mutableMap.put("Mexico", "North America");
|
||||
assertTrue(unmodifiableMap.containsKey("Mexico"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("deprecation")
|
||||
public void whenGuavaImmutableMapFromCopyOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() {
|
||||
@Test
|
||||
@SuppressWarnings("deprecation")
|
||||
void whenGuavaImmutableMapFromCopyOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() {
|
||||
|
||||
Map<String, String> mutableMap = new HashMap<>();
|
||||
mutableMap.put("USA", "North America");
|
||||
Map<String, String> mutableMap = new HashMap<>();
|
||||
mutableMap.put("USA", "North America");
|
||||
|
||||
ImmutableMap<String, String> immutableMap = ImmutableMap.copyOf(mutableMap);
|
||||
assertTrue(immutableMap.containsKey("USA"));
|
||||
ImmutableMap<String, String> immutableMap = ImmutableMap.copyOf(mutableMap);
|
||||
assertTrue(immutableMap.containsKey("USA"));
|
||||
|
||||
assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America"));
|
||||
assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America"));
|
||||
|
||||
mutableMap.remove("USA");
|
||||
assertTrue(immutableMap.containsKey("USA"));
|
||||
mutableMap.remove("USA");
|
||||
assertTrue(immutableMap.containsKey("USA"));
|
||||
|
||||
mutableMap.put("Mexico", "North America");
|
||||
assertFalse(immutableMap.containsKey("Mexico"));
|
||||
}
|
||||
mutableMap.put("Mexico", "North America");
|
||||
assertFalse(immutableMap.containsKey("Mexico"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("deprecation")
|
||||
public void whenGuavaImmutableMapFromBuilderMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() {
|
||||
@Test
|
||||
@SuppressWarnings("deprecation")
|
||||
void whenGuavaImmutableMapFromBuilderMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() {
|
||||
|
||||
Map<String, String> mutableMap = new HashMap<>();
|
||||
mutableMap.put("USA", "North America");
|
||||
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"));
|
||||
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"));
|
||||
assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America"));
|
||||
|
||||
mutableMap.remove("USA");
|
||||
assertTrue(immutableMap.containsKey("USA"));
|
||||
mutableMap.remove("USA");
|
||||
assertTrue(immutableMap.containsKey("USA"));
|
||||
|
||||
mutableMap.put("Mexico", "North America");
|
||||
assertFalse(immutableMap.containsKey("Mexico"));
|
||||
}
|
||||
mutableMap.put("Mexico", "North America");
|
||||
assertFalse(immutableMap.containsKey("Mexico"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("deprecation")
|
||||
public void whenGuavaImmutableMapFromOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() {
|
||||
@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"));
|
||||
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"));
|
||||
}
|
||||
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)));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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)
|
|
@ -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…
Reference in New Issue