From cabdb8f2d1fc06e7ba801a98f0924eec922f2a77 Mon Sep 17 00:00:00 2001 From: neha298 <32795246+neha298@users.noreply.github.com> Date: Sun, 12 Mar 2023 20:57:43 +0530 Subject: [PATCH 001/141] Configure feign client URL --- .../cloud/openfeign/client/AlbumClient.java | 15 ++++ .../cloud/openfeign/client/PostClient.java | 12 +++ .../cloud/openfeign/client/TodoClient.java | 13 +++ .../config/DynamicUrlInterceptor.java | 23 ++++++ .../ConfigureFeignUrlController.java | 80 +++++++++++++++++++ .../baeldung/cloud/openfeign/model/Album.java | 32 ++++++++ .../baeldung/cloud/openfeign/model/Todo.java | 40 ++++++++++ .../src/main/resources/application.properties | 2 + 8 files changed, 217 insertions(+) create mode 100644 spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/AlbumClient.java create mode 100644 spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/PostClient.java create mode 100644 spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/TodoClient.java create mode 100644 spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/config/DynamicUrlInterceptor.java create mode 100644 spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/controller/ConfigureFeignUrlController.java create mode 100644 spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/model/Album.java create mode 100644 spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/model/Todo.java diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/AlbumClient.java b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/AlbumClient.java new file mode 100644 index 0000000000..b1db2dbcab --- /dev/null +++ b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/AlbumClient.java @@ -0,0 +1,15 @@ +package com.baeldung.cloud.openfeign.client; + +import com.baeldung.cloud.openfeign.model.Album; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +@FeignClient(name = "albumClient", url = "https://jsonplaceholder.typicode.com/albums/") +public interface AlbumClient { + @GetMapping(value = "/{id}") + Album getAlbumById(@PathVariable(value = "id") Integer id); + + @GetMapping(value = "/{id}") + Album getAlbumByIdAndDynamicUrl(@PathVariable(name = "id") Integer id); +} diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/PostClient.java b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/PostClient.java new file mode 100644 index 0000000000..e8e773b6a1 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/PostClient.java @@ -0,0 +1,12 @@ +package com.baeldung.cloud.openfeign.client; + +import com.baeldung.cloud.openfeign.model.Post; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +@FeignClient(name = "postClient", url = "${spring.cloud.openfeign.client.config.postClient.url}") +public interface PostClient { + @GetMapping(value = "/{id}") + Post getPostById(@PathVariable(value = "id") Integer id); +} diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/TodoClient.java b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/TodoClient.java new file mode 100644 index 0000000000..c768ef6b5f --- /dev/null +++ b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/TodoClient.java @@ -0,0 +1,13 @@ +package com.baeldung.cloud.openfeign.client; + +import com.baeldung.cloud.openfeign.model.Todo; +import feign.RequestLine; +import org.springframework.cloud.openfeign.FeignClient; + +import java.net.URI; + +@FeignClient(name = "todoClient") +public interface TodoClient { + @RequestLine(value = "GET") + Todo getTodoById(URI uri); +} diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/config/DynamicUrlInterceptor.java b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/config/DynamicUrlInterceptor.java new file mode 100644 index 0000000000..286426edb3 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/config/DynamicUrlInterceptor.java @@ -0,0 +1,23 @@ +package com.baeldung.cloud.openfeign.config; + +import feign.RequestInterceptor; +import feign.RequestTemplate; + +import java.util.function.Supplier; + +public class DynamicUrlInterceptor implements RequestInterceptor { + + private final Supplier urlSupplier; + + public DynamicUrlInterceptor(Supplier urlSupplier) { + this.urlSupplier = urlSupplier; + } + + @Override + public void apply(RequestTemplate template) { + String url = urlSupplier.get(); + if (url != null) { + template.target(url); + } + } +} diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/controller/ConfigureFeignUrlController.java b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/controller/ConfigureFeignUrlController.java new file mode 100644 index 0000000000..c048e7e1f7 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/controller/ConfigureFeignUrlController.java @@ -0,0 +1,80 @@ +package com.baeldung.cloud.openfeign.controller; + +import com.baeldung.cloud.openfeign.config.DynamicUrlInterceptor; +import com.baeldung.cloud.openfeign.client.AlbumClient; +import com.baeldung.cloud.openfeign.client.PostClient; +import com.baeldung.cloud.openfeign.client.TodoClient; +import com.baeldung.cloud.openfeign.model.Album; +import com.baeldung.cloud.openfeign.model.Post; +import com.baeldung.cloud.openfeign.model.Todo; +import feign.Feign; +import feign.Target; +import feign.codec.Decoder; +import feign.codec.Encoder; +import org.springframework.beans.factory.ObjectFactory; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.http.HttpMessageConverters; +import org.springframework.cloud.openfeign.FeignClientsConfiguration; +import org.springframework.cloud.openfeign.support.HttpMessageConverterCustomizer; +import org.springframework.cloud.openfeign.support.SpringDecoder; +import org.springframework.cloud.openfeign.support.SpringEncoder; +import org.springframework.cloud.openfeign.support.SpringMvcContract; +import org.springframework.context.annotation.Import; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import java.net.URI; + +@RestController +@Import(FeignClientsConfiguration.class) +public class ConfigureFeignUrlController { + private final AlbumClient albumClient; + private final PostClient postClient; + + private final TodoClient todoClient; + private final ObjectFactory messageConverters; + + private final ObjectProvider customizers; + + public ConfigureFeignUrlController(AlbumClient albumClient, + PostClient postClient, + Decoder decoder, + Encoder encoder, + ObjectFactory messageConverters, ObjectProvider customizers) { + this.albumClient = albumClient; + this.postClient = postClient; + this.messageConverters = messageConverters; + this.customizers = customizers; + this.todoClient = Feign.builder().encoder(encoder).decoder(decoder).target(Target.EmptyTarget.create(TodoClient.class)); + } + + @GetMapping(value = "albums/{id}") + public Album getAlbumById(@PathVariable(value = "id") Integer id) { + return albumClient.getAlbumById(id); + } + + @GetMapping(value = "posts/{id}") + public Post getPostById(@PathVariable(value = "id") Integer id) { + return postClient.getPostById(id); + } + + @GetMapping(value = "todos/{id}") + public Todo getTodoById(@PathVariable(value = "id") Integer id) { + return todoClient.getTodoById(URI.create("https://jsonplaceholder.typicode.com/todos/" + id)); + } + +@GetMapping(value = "/dynamicAlbums/{id}") +public Album getAlbumByIdAndDynamicUrl(@PathVariable(value = "id") Integer id) { + AlbumClient client = Feign.builder() + .requestInterceptor(new DynamicUrlInterceptor(() -> "https://jsonplaceholder.typicode.com/albums/")) + .contract(new SpringMvcContract()) + .encoder(new SpringEncoder(messageConverters)) + .decoder(new SpringDecoder(messageConverters, customizers)) + .target(Target.EmptyTarget.create(AlbumClient.class)); + + return client.getAlbumByIdAndDynamicUrl(id); +} +} + + diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/model/Album.java b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/model/Album.java new file mode 100644 index 0000000000..ae9c01f3b1 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/model/Album.java @@ -0,0 +1,32 @@ +package com.baeldung.cloud.openfeign.model; + +public class Album { + + private Integer id; + private Integer userId; + private String title; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/model/Todo.java b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/model/Todo.java new file mode 100644 index 0000000000..887a3496c5 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/model/Todo.java @@ -0,0 +1,40 @@ +package com.baeldung.cloud.openfeign.model; + +public class Todo { + private Integer id; + private Integer userId; + private String title; + private Boolean completed; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Boolean getCompleted() { + return completed; + } + + public void setCompleted(Boolean completed) { + this.completed = completed; + } +} diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-openfeign/src/main/resources/application.properties index a0d9d89934..f4ea32483d 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/resources/application.properties +++ b/spring-cloud-modules/spring-cloud-openfeign/src/main/resources/application.properties @@ -8,3 +8,5 @@ spring.security.oauth2.client.registration.keycloak.authorization-grant-type=cli spring.security.oauth2.client.registration.keycloak.client-id=payment-app spring.security.oauth2.client.registration.keycloak.client-secret=863e9de4-33d4-4471-b35e-f8d2434385bb spring.security.oauth2.client.provider.keycloak.token-uri=http://localhost:8083/auth/realms/master/protocol/openid-connect/token + +spring.cloud.openfeign.client.config.postClient.url=https://jsonplaceholder.typicode.com/posts/ \ No newline at end of file From 53cb3564c9eeb6d5a90636c7d47a556418e6689c Mon Sep 17 00:00:00 2001 From: neha298 <32795246+neha298@users.noreply.github.com> Date: Sun, 12 Mar 2023 21:54:30 +0530 Subject: [PATCH 002/141] Spacing modifications --- .../ConfigureFeignUrlController.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/controller/ConfigureFeignUrlController.java b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/controller/ConfigureFeignUrlController.java index c048e7e1f7..ca49bca605 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/controller/ConfigureFeignUrlController.java +++ b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/controller/ConfigureFeignUrlController.java @@ -30,9 +30,11 @@ import java.net.URI; @Import(FeignClientsConfiguration.class) public class ConfigureFeignUrlController { private final AlbumClient albumClient; + private final PostClient postClient; private final TodoClient todoClient; + private final ObjectFactory messageConverters; private final ObjectProvider customizers; @@ -64,17 +66,17 @@ public class ConfigureFeignUrlController { return todoClient.getTodoById(URI.create("https://jsonplaceholder.typicode.com/todos/" + id)); } -@GetMapping(value = "/dynamicAlbums/{id}") -public Album getAlbumByIdAndDynamicUrl(@PathVariable(value = "id") Integer id) { - AlbumClient client = Feign.builder() - .requestInterceptor(new DynamicUrlInterceptor(() -> "https://jsonplaceholder.typicode.com/albums/")) - .contract(new SpringMvcContract()) - .encoder(new SpringEncoder(messageConverters)) - .decoder(new SpringDecoder(messageConverters, customizers)) - .target(Target.EmptyTarget.create(AlbumClient.class)); + @GetMapping(value = "/dynamicAlbums/{id}") + public Album getAlbumByIdAndDynamicUrl(@PathVariable(value = "id") Integer id) { + AlbumClient client = Feign.builder() + .requestInterceptor(new DynamicUrlInterceptor(() -> "https://jsonplaceholder.typicode.com/albums/")) + .contract(new SpringMvcContract()) + .encoder(new SpringEncoder(messageConverters)) + .decoder(new SpringDecoder(messageConverters, customizers)) + .target(Target.EmptyTarget.create(AlbumClient.class)); - return client.getAlbumByIdAndDynamicUrl(id); -} + return client.getAlbumByIdAndDynamicUrl(id); + } } From 98a3cddc47e09e2f895b3d701f9855ccb0aa95e4 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Tue, 14 Mar 2023 12:37:31 +0100 Subject: [PATCH 003/141] simplify StandardCharsets use --- .../inputstreamtostring/JavaInputStreamToXUnitTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtostring/JavaInputStreamToXUnitTest.java b/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtostring/JavaInputStreamToXUnitTest.java index 03f528766b..341a820b01 100644 --- a/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtostring/JavaInputStreamToXUnitTest.java +++ b/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtostring/JavaInputStreamToXUnitTest.java @@ -49,7 +49,7 @@ public class JavaInputStreamToXUnitTest { final InputStream inputStream = new ByteArrayInputStream(originalString.getBytes()); final StringBuilder textBuilder = new StringBuilder(); - try (Reader reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName(StandardCharsets.UTF_8.name())))) { + try (Reader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { int c; while ((c = reader.read()) != -1) { textBuilder.append((char) c); @@ -63,7 +63,7 @@ public class JavaInputStreamToXUnitTest { final String originalString = randomAlphabetic(DEFAULT_SIZE); final InputStream inputStream = new ByteArrayInputStream(originalString.getBytes()); - final String text = new BufferedReader(new InputStreamReader(inputStream, Charset.forName(StandardCharsets.UTF_8.name()))) + final String text = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)) .lines() .collect(Collectors.joining("\n")); From 0ea86e69d982d3fa3a058d9605cdbdfb112470fd Mon Sep 17 00:00:00 2001 From: AndiCover Date: Fri, 14 Apr 2023 07:47:50 +0200 Subject: [PATCH 004/141] BAEL-5739 Avoiding the StaleElementReferenceException in Selenium --- .../selenium/stale/RobustWebDriver.java | 86 +++++++++ .../selenium/stale/RobustWebElement.java | 176 ++++++++++++++++++ .../selenium/stale/WebElementUtils.java | 30 +++ .../stale/RobustWebElementLiveTest.java | 58 ++++++ .../stale/StaleElementReferenceLiveTest.java | 102 ++++++++++ 5 files changed, 452 insertions(+) create mode 100644 testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/RobustWebDriver.java create mode 100644 testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/RobustWebElement.java create mode 100644 testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/WebElementUtils.java create mode 100644 testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/stale/RobustWebElementLiveTest.java create mode 100644 testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/stale/StaleElementReferenceLiveTest.java diff --git a/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/RobustWebDriver.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/RobustWebDriver.java new file mode 100644 index 0000000000..211480dce3 --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/RobustWebDriver.java @@ -0,0 +1,86 @@ +package com.baeldung.selenium.stale; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class RobustWebDriver implements WebDriver { + + private final WebDriver originalWebDriver; + + public RobustWebDriver(WebDriver webDriver) { + this.originalWebDriver = webDriver; + } + + @Override + public void get(String url) { + this.originalWebDriver.get(url); + } + + @Override + public String getCurrentUrl() { + return this.originalWebDriver.getCurrentUrl(); + } + + @Override + public String getTitle() { + return this.originalWebDriver.getTitle(); + } + + @Override + public List findElements(By by) { + return this.originalWebDriver.findElements(by) + .stream().map(e -> new RobustWebElement(e, by, this)) + .collect(Collectors.toList()); + } + + @Override + public WebElement findElement(By by) { + return new RobustWebElement(this.originalWebDriver.findElement(by), by, this); + } + + @Override + public String getPageSource() { + return this.originalWebDriver.getPageSource(); + } + + @Override + public void close() { + this.originalWebDriver.close(); + + } + + @Override + public void quit() { + this.originalWebDriver.quit(); + } + + @Override + public Set getWindowHandles() { + return this.originalWebDriver.getWindowHandles(); + } + + @Override + public String getWindowHandle() { + return this.originalWebDriver.getWindowHandle(); + } + + @Override + public TargetLocator switchTo() { + return this.originalWebDriver.switchTo(); + } + + @Override + public Navigation navigate() { + return this.originalWebDriver.navigate(); + } + + @Override + public Options manage() { + return this.originalWebDriver.manage(); + } +} \ No newline at end of file diff --git a/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/RobustWebElement.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/RobustWebElement.java new file mode 100644 index 0000000000..fa65e60349 --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/RobustWebElement.java @@ -0,0 +1,176 @@ +package com.baeldung.selenium.stale; + +import org.openqa.selenium.By; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.OutputType; +import org.openqa.selenium.Point; +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.StaleElementReferenceException; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; + +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Function; + +public class RobustWebElement implements WebElement { + + private WebElement originalElement; + private final RobustWebDriver driver; + private final By by; + + private static final int MAX_RETRIES = 10; + private static final String SERE = "Element is no longer attached to the DOM"; + + public RobustWebElement(WebElement element, By by, RobustWebDriver driver) { + this.originalElement = element; + this.by = by; + this.driver = driver; + } + + @Override + public void click() { + executeMethodWithRetries(WebElement::click); + } + + @Override + public void submit() { + executeMethodWithRetries(WebElement::submit); + } + + @Override + public void sendKeys(CharSequence... keysToSend) { + executeMethodWithRetriesVoid(WebElement::sendKeys, keysToSend); + } + + @Override + public void clear() { + executeMethodWithRetries(WebElement::clear); + } + + @Override + public String getTagName() { + return executeMethodWithRetries(WebElement::getTagName); + } + + @Override + public String getAttribute(String name) { + return executeMethodWithRetries(WebElement::getAttribute, name); + } + + @Override + public boolean isSelected() { + return executeMethodWithRetries(WebElement::isSelected); + } + + @Override + public boolean isEnabled() { + return executeMethodWithRetries(WebElement::isEnabled); + } + + @Override + public String getText() { + return executeMethodWithRetries(WebElement::getText); + } + + @Override + public List findElements(By by) { + return executeMethodWithRetries(WebElement::findElements, by); + } + + @Override + public WebElement findElement(By by) { + return executeMethodWithRetries(WebElement::findElement, by); + } + + @Override + public boolean isDisplayed() { + return executeMethodWithRetries(WebElement::isDisplayed); + } + + @Override + public Point getLocation() { + return executeMethodWithRetries(WebElement::getLocation); + } + + @Override + public Dimension getSize() { + return executeMethodWithRetries(WebElement::getSize); + } + + @Override + public Rectangle getRect() { + return executeMethodWithRetries(WebElement::getRect); + } + + @Override + public String getCssValue(String propertyName) { + return executeMethodWithRetries(WebElement::getCssValue, propertyName); + } + + + @Override + public X getScreenshotAs(OutputType target) throws WebDriverException { + return executeMethodWithRetries(WebElement::getScreenshotAs, target); + } + + private void executeMethodWithRetries(Consumer method) { + int retries = 0; + while (retries < MAX_RETRIES) { + try { + WebElementUtils.callMethod(originalElement, method); + return; + } catch (StaleElementReferenceException ex) { + refreshElement(); + } + retries++; + } + throw new StaleElementReferenceException(SERE); + } + + private T executeMethodWithRetries(Function method) { + int retries = 0; + while (retries < MAX_RETRIES) { + try { + return WebElementUtils.callMethodWithReturn(originalElement, method); + } catch (StaleElementReferenceException ex) { + refreshElement(); + } + retries++; + } + throw new StaleElementReferenceException(SERE); + } + + private void executeMethodWithRetriesVoid(BiConsumer method, U parameter) { + int retries = 0; + while (retries < MAX_RETRIES) { + try { + WebElementUtils.callMethod(originalElement, method, parameter); + return; + } catch (StaleElementReferenceException ex) { + refreshElement(); + } + retries++; + } + throw new StaleElementReferenceException(SERE); + } + + private T executeMethodWithRetries(BiFunction method, U parameter) { + int retries = 0; + while (retries < MAX_RETRIES) { + try { + return WebElementUtils.callMethodWithReturn(originalElement, method, parameter); + } catch (StaleElementReferenceException ex) { + refreshElement(); + } + retries++; + } + throw new StaleElementReferenceException(SERE); + } + + private void refreshElement() { + this.originalElement = driver.findElement(by); + } +} \ No newline at end of file diff --git a/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/WebElementUtils.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/WebElementUtils.java new file mode 100644 index 0000000000..460cc02bf5 --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/stale/WebElementUtils.java @@ -0,0 +1,30 @@ +package com.baeldung.selenium.stale; + +import org.openqa.selenium.WebElement; + +import java.util.function.BiConsumer; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Function; + +public class WebElementUtils { + + private WebElementUtils(){ + } + + public static void callMethod(WebElement element, Consumer method) { + method.accept(element); + } + + public static void callMethod(WebElement element, BiConsumer method, U parameter) { + method.accept(element, parameter); + } + + public static T callMethodWithReturn(WebElement element, Function method) { + return method.apply(element); + } + + public static T callMethodWithReturn(WebElement element, BiFunction method, U parameter) { + return method.apply(element, parameter); + } +} \ No newline at end of file diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/stale/RobustWebElementLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/stale/RobustWebElementLiveTest.java new file mode 100644 index 0000000000..3dea95ca82 --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/stale/RobustWebElementLiveTest.java @@ -0,0 +1,58 @@ +package com.baeldung.selenium.stale; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; + +import java.time.Duration; + +final class RobustWebElementLiveTest { + + private static RobustWebDriver driver; + private static final int TIMEOUT = 10; + + private static final By LOCATOR_REFRESH = By.xpath("//a[.='click here']"); + private static final By LOCATOR_DYNAMIC_CONTENT = By.xpath( + "(//div[@id='content']//div[@class='large-10 columns'])[1]"); + + private static void setupChromeDriver() { + WebDriverManager.chromedriver().setup(); + final ChromeOptions options = new ChromeOptions(); + options.addArguments("--remote-allow-origins=*"); + driver = new RobustWebDriver(new ChromeDriver(options)); + options(); + } + + private static void options() { + driver.manage().window().maximize(); + driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(TIMEOUT)); + } + + @BeforeEach + public void init() { + setupChromeDriver(); + } + + @Test + void givenDynamicPage_whenRefreshingAndAccessingSavedElement_thenOK() { + driver.navigate().to("https://the-internet.herokuapp.com/dynamic_content?with_content=static"); + final WebElement element = driver.findElement(LOCATOR_DYNAMIC_CONTENT); + + driver.findElement(LOCATOR_REFRESH).click(); + Assertions.assertDoesNotThrow(element::getText); + } + + @AfterEach + void teardown() { + if (driver != null) { + driver.quit(); + driver = null; + } + } +} \ No newline at end of file diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/stale/StaleElementReferenceLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/stale/StaleElementReferenceLiveTest.java new file mode 100644 index 0000000000..9b42571891 --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/stale/StaleElementReferenceLiveTest.java @@ -0,0 +1,102 @@ +package com.baeldung.selenium.stale; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.StaleElementReferenceException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; + +import java.time.Duration; + +final class StaleElementReferenceLiveTest { + + private static WebDriver driver; + private static final int TIMEOUT = 10; + + private static final By LOCATOR_REFRESH = By.xpath("//a[.='click here']"); + private static final By LOCATOR_DYNAMIC_CONTENT = By.xpath( + "(//div[@id='content']//div[@class='large-10 columns'])[1]"); + + private static void setupChromeDriver() { + WebDriverManager.chromedriver().setup(); + final ChromeOptions options = new ChromeOptions(); + options.addArguments("--remote-allow-origins=*"); + driver = new ChromeDriver(options); + options(); + } + + private static void options() { + driver.manage().window().maximize(); + driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(TIMEOUT)); + } + + @BeforeEach + public void init() { + setupChromeDriver(); + } + + @Test + void givenDynamicPage_whenRefreshingAndAccessingSavedElement_thenSERE() { + driver.navigate().to("https://the-internet.herokuapp.com/dynamic_content?with_content=static"); + final WebElement element = driver.findElement(LOCATOR_DYNAMIC_CONTENT); + + driver.findElement(LOCATOR_REFRESH).click(); + Assertions.assertThrows(StaleElementReferenceException.class, element::getText); + } + + @Test + void givenDynamicPage_whenRefreshingAndAccessingSavedElement_thenHandleSERE() { + driver.navigate().to("https://the-internet.herokuapp.com/dynamic_content?with_content=static"); + final WebElement element = driver.findElement(LOCATOR_DYNAMIC_CONTENT); + + if (!retryingFindClick(LOCATOR_REFRESH)) { + Assertions.fail("Element is still stale after 5 attempts"); + } + Assertions.assertDoesNotThrow(() -> retryingFindGetText(LOCATOR_DYNAMIC_CONTENT)); + } + + private boolean retryingFindClick(By locator) { + boolean result = false; + int attempts = 0; + while (attempts < 5) { + try { + driver.findElement(locator).click(); + result = true; + break; + } catch (StaleElementReferenceException ex) { + System.out.println(ex.getMessage()); + } + attempts++; + } + return result; + } + + private String retryingFindGetText(By locator) { + String result = null; + int attempts = 0; + while (attempts < 5) { + try { + result = driver.findElement(locator).getText(); + break; + } catch (StaleElementReferenceException ex) { + System.out.println(ex.getMessage()); + } + attempts++; + } + return result; + } + + @AfterEach + void teardown() { + if (driver != null) { + driver.quit(); + driver = null; + } + } +} \ No newline at end of file From d1da4b149413d8bff2918e201d44d4a32f5c7180 Mon Sep 17 00:00:00 2001 From: neha298 <32795246+neha298@users.noreply.github.com> Date: Sun, 16 Apr 2023 23:42:27 +0530 Subject: [PATCH 005/141] Fastexcel --- apache-poi/pom.xml | 11 ++++ .../baeldung/fastexcel/FastexcelHelper.java | 64 +++++++++++++++++++ .../fastexcel/FastexcelIntegrationTest.java | 50 +++++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 apache-poi/src/main/java/com/baeldung/fastexcel/FastexcelHelper.java create mode 100644 apache-poi/src/test/java/com/baeldung/fastexcel/FastexcelIntegrationTest.java diff --git a/apache-poi/pom.xml b/apache-poi/pom.xml index 546eedec5b..78781cf215 100644 --- a/apache-poi/pom.xml +++ b/apache-poi/pom.xml @@ -30,6 +30,16 @@ + + org.dhatim + fastexcel + ${fastexcel.version} + + + org.dhatim + fastexcel-reader + ${fastexcel.version} + @@ -52,6 +62,7 @@ 5.2.0 1.0.6 + 0.15.3 3.2.0 diff --git a/apache-poi/src/main/java/com/baeldung/fastexcel/FastexcelHelper.java b/apache-poi/src/main/java/com/baeldung/fastexcel/FastexcelHelper.java new file mode 100644 index 0000000000..524f345184 --- /dev/null +++ b/apache-poi/src/main/java/com/baeldung/fastexcel/FastexcelHelper.java @@ -0,0 +1,64 @@ +package com.baeldung.fastexcel; + +import org.dhatim.fastexcel.Workbook; +import org.dhatim.fastexcel.Worksheet; +import org.dhatim.fastexcel.reader.Cell; +import org.dhatim.fastexcel.reader.ReadableWorkbook; +import org.dhatim.fastexcel.reader.Row; +import org.dhatim.fastexcel.reader.Sheet; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; + +public class FastexcelHelper { + + public Map> readExcel(String fileLocation) throws IOException { + Map> data = new HashMap<>(); + + try (FileInputStream file = new FileInputStream(fileLocation); ReadableWorkbook wb = new ReadableWorkbook(file)) { + Sheet sheet = wb.getFirstSheet(); + try (Stream rows = sheet.openStream()) { + rows.forEach(r -> { + data.put(r.getRowNum(), new ArrayList<>()); + + for (Cell cell : r) { + data.get(r.getRowNum()).add(cell.getRawValue()); + } + }); + } + } + + return data; + } + + public void writeExcel() throws IOException { + File currDir = new File("."); + String path = currDir.getAbsolutePath(); + String fileLocation = path.substring(0, path.length() - 1) + "fastexcel.xlsx"; + + try (OutputStream os = Files.newOutputStream(Paths.get(fileLocation)); Workbook wb = new Workbook(os, "MyApplication", "1.0")) { + Worksheet ws = wb.newWorksheet("Sheet 1"); + + ws.width(0, 25); + ws.width(1, 15); + + + ws.range(0, 0, 0, 1).style().fontName("Arial").fontSize(16).bold().fillColor("3366FF").set(); + ws.value(0, 0, "Name"); + ws.value(0, 1, "Age"); + + ws.range(1, 0, 1, 1).style().wrapText(true).set(); + ws.value(2, 0, "John Smith"); + ws.value(2, 1, 20L); + } + } +} diff --git a/apache-poi/src/test/java/com/baeldung/fastexcel/FastexcelIntegrationTest.java b/apache-poi/src/test/java/com/baeldung/fastexcel/FastexcelIntegrationTest.java new file mode 100644 index 0000000000..8c1d568b25 --- /dev/null +++ b/apache-poi/src/test/java/com/baeldung/fastexcel/FastexcelIntegrationTest.java @@ -0,0 +1,50 @@ +package com.baeldung.fastexcel; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; + +public class FastexcelIntegrationTest { + + private FastexcelHelper fastexcelHelper; + private static String FILE_NAME = "fastexcel.xlsx"; + private String fileLocation; + + @Before + public void generateExcelFile() throws IOException { + + File currDir = new File("."); + String path = currDir.getAbsolutePath(); + fileLocation = path.substring(0, path.length() - 1) + FILE_NAME; + System.out.println(fileLocation); + + fastexcelHelper = new FastexcelHelper(); + fastexcelHelper.writeExcel(); + } + + @Test + public void whenParsingExcelFile_thenCorrect() throws IOException { + Map> data = fastexcelHelper.readExcel(fileLocation); + + assertEquals("Name", data.get(1).get(0)); + assertEquals("Age", data.get(1).get(1)); + + assertEquals("John Smith", data.get(3).get(0)); + assertEquals("20", data.get(3).get(1)); + } + + @After + public void cleanup() { + File testFile = new File(fileLocation); + if (testFile.exists()) { + testFile.delete(); + } + } +} \ No newline at end of file From c9770d8dd545a30f0804b8c507a9edd48ed953d3 Mon Sep 17 00:00:00 2001 From: neha298 <32795246+neha298@users.noreply.github.com> Date: Mon, 17 Apr 2023 01:01:42 +0530 Subject: [PATCH 006/141] Removed extra whitespace --- .../src/main/java/com/baeldung/fastexcel/FastexcelHelper.java | 1 - 1 file changed, 1 deletion(-) diff --git a/apache-poi/src/main/java/com/baeldung/fastexcel/FastexcelHelper.java b/apache-poi/src/main/java/com/baeldung/fastexcel/FastexcelHelper.java index 524f345184..fd5492359a 100644 --- a/apache-poi/src/main/java/com/baeldung/fastexcel/FastexcelHelper.java +++ b/apache-poi/src/main/java/com/baeldung/fastexcel/FastexcelHelper.java @@ -51,7 +51,6 @@ public class FastexcelHelper { ws.width(0, 25); ws.width(1, 15); - ws.range(0, 0, 0, 1).style().fontName("Arial").fontSize(16).bold().fillColor("3366FF").set(); ws.value(0, 0, "Name"); ws.value(0, 1, "Age"); From f2c036a59d3ebfe1bf46a7fad0570b23dd33a90a Mon Sep 17 00:00:00 2001 From: neha298 <32795246+neha298@users.noreply.github.com> Date: Mon, 17 Apr 2023 01:11:46 +0530 Subject: [PATCH 007/141] Removed print statement --- .../java/com/baeldung/fastexcel/FastexcelIntegrationTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apache-poi/src/test/java/com/baeldung/fastexcel/FastexcelIntegrationTest.java b/apache-poi/src/test/java/com/baeldung/fastexcel/FastexcelIntegrationTest.java index 8c1d568b25..a36c06e41f 100644 --- a/apache-poi/src/test/java/com/baeldung/fastexcel/FastexcelIntegrationTest.java +++ b/apache-poi/src/test/java/com/baeldung/fastexcel/FastexcelIntegrationTest.java @@ -23,7 +23,6 @@ public class FastexcelIntegrationTest { File currDir = new File("."); String path = currDir.getAbsolutePath(); fileLocation = path.substring(0, path.length() - 1) + FILE_NAME; - System.out.println(fileLocation); fastexcelHelper = new FastexcelHelper(); fastexcelHelper.writeExcel(); @@ -47,4 +46,4 @@ public class FastexcelIntegrationTest { testFile.delete(); } } -} \ No newline at end of file +} From 83563728377de9c4448b463ad9a2e99640ae1501 Mon Sep 17 00:00:00 2001 From: neha298 <32795246+neha298@users.noreply.github.com> Date: Mon, 17 Apr 2023 01:26:06 +0530 Subject: [PATCH 008/141] Row index modification --- .../src/main/java/com/baeldung/fastexcel/FastexcelHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-poi/src/main/java/com/baeldung/fastexcel/FastexcelHelper.java b/apache-poi/src/main/java/com/baeldung/fastexcel/FastexcelHelper.java index fd5492359a..9d6041b66e 100644 --- a/apache-poi/src/main/java/com/baeldung/fastexcel/FastexcelHelper.java +++ b/apache-poi/src/main/java/com/baeldung/fastexcel/FastexcelHelper.java @@ -55,7 +55,7 @@ public class FastexcelHelper { ws.value(0, 0, "Name"); ws.value(0, 1, "Age"); - ws.range(1, 0, 1, 1).style().wrapText(true).set(); + ws.range(2, 0, 2, 1).style().wrapText(true).set(); ws.value(2, 0, "John Smith"); ws.value(2, 1, 20L); } From 8d5f39b72028b923517ad12a2bda8873704fd8d2 Mon Sep 17 00:00:00 2001 From: Abhinav Pandey Date: Mon, 17 Apr 2023 23:33:07 +0530 Subject: [PATCH 009/141] BAEL-6355 - OpenAI API with Spring Boot --- .../config/OpenAIRestTemplateConfig.java | 25 +++++++++++ .../openapi/controller/ChatController.java | 44 +++++++++++++++++++ .../com/baeldung/openapi/dto/ChatRequest.java | 32 ++++++++++++++ .../baeldung/openapi/dto/ChatResponse.java | 38 ++++++++++++++++ .../com/baeldung/openapi/dto/Message.java | 31 +++++++++++++ .../src/main/resources/application.properties | 6 ++- 6 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/config/OpenAIRestTemplateConfig.java create mode 100644 spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/controller/ChatController.java create mode 100644 spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/ChatRequest.java create mode 100644 spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/ChatResponse.java create mode 100644 spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/Message.java diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/config/OpenAIRestTemplateConfig.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/config/OpenAIRestTemplateConfig.java new file mode 100644 index 0000000000..b832ee4264 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/config/OpenAIRestTemplateConfig.java @@ -0,0 +1,25 @@ +package com.baeldung.openapi.config; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class OpenAIRestTemplateConfig { + + @Value("${openai.api.key}") + private String openaiApiKey; + + @Bean + @Qualifier("openaiRestTemplate") + public RestTemplate openaiRestTemplate() { + RestTemplate restTemplate = new RestTemplate(); + restTemplate.getInterceptors().add((request, body, execution) -> { + request.getHeaders().add("Authorization", "Bearer " + openaiApiKey); + return execution.execute(request, body); + }); + return restTemplate; + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/controller/ChatController.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/controller/ChatController.java new file mode 100644 index 0000000000..4cd65580dc --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/controller/ChatController.java @@ -0,0 +1,44 @@ +package com.baeldung.openapi.controller; + +import com.baeldung.openapi.dto.ChatRequest; +import com.baeldung.openapi.dto.ChatResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +@RestController +public class ChatController { + + @Qualifier("openaiRestTemplate") + @Autowired + private RestTemplate restTemplate; + + @Value("${openai.model}") + private String model; + + @Value("${openai.api.url}") + private String apiUrl; + + @GetMapping("/chat") + public String chat(@RequestParam String prompt) { + // create a request + ChatRequest request = new ChatRequest(model, prompt); + + // call the API + ChatResponse response = restTemplate.postForObject( + apiUrl, + request, + ChatResponse.class); + + if (response == null || response.getChoices() == null || response.getChoices().isEmpty()) { + return "No response"; + } + + // return the first response + return response.getChoices().get(0).getMessage().getContent(); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/ChatRequest.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/ChatRequest.java new file mode 100644 index 0000000000..1e32b937ce --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/ChatRequest.java @@ -0,0 +1,32 @@ +package com.baeldung.openapi.dto; + +import java.util.ArrayList; +import java.util.List; + +public class ChatRequest { + private String model; + private List messages; + + public ChatRequest(String model, String prompt) { + this.model = model; + + this.messages = new ArrayList<>(); + this.messages.add(new Message("user", prompt)); + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public List getMessages() { + return messages; + } + + public void setMessages(List messages) { + this.messages = messages; + } +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/ChatResponse.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/ChatResponse.java new file mode 100644 index 0000000000..937e2d87db --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/ChatResponse.java @@ -0,0 +1,38 @@ +package com.baeldung.openapi.dto; + +import java.util.List; + +public class ChatResponse { + + private List choices; + + public static class Choice { + + private int index; + private Message message; + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public Message getMessage() { + return message; + } + + public void setMessage(Message message) { + this.message = message; + } + } + + public List getChoices() { + return choices; + } + + public void setChoices(List choices) { + this.choices = choices; + } +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/Message.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/Message.java new file mode 100644 index 0000000000..242cf4e89f --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/dto/Message.java @@ -0,0 +1,31 @@ +package com.baeldung.openapi.dto; + +public class Message { + + private String role; + private String content; + + Message(String role, String content) { + this.role = role; + this.content = content; + } + + Message() { + } + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/resources/application.properties b/spring-boot-modules/spring-boot-libraries-2/src/main/resources/application.properties index a18eda349a..47b2973fca 100644 --- a/spring-boot-modules/spring-boot-libraries-2/src/main/resources/application.properties +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/resources/application.properties @@ -47,4 +47,8 @@ resilience4j.ratelimiter.instances.rateLimiterApi.limit-refresh-period=60s resilience4j.ratelimiter.instances.rateLimiterApi.timeout-duration=0s resilience4j.ratelimiter.instances.rateLimiterApi.allow-health-indicator-to-fail=true resilience4j.ratelimiter.instances.rateLimiterApi.subscribe-for-events=true -resilience4j.ratelimiter.instances.rateLimiterApi.event-consumer-buffer-size=50 \ No newline at end of file +resilience4j.ratelimiter.instances.rateLimiterApi.event-consumer-buffer-size=50 + +openai.model=gpt-3.5-turbo +openai.api.url=https://api.openai.com/v1/chat/completions +openai.api.key=your-api-key \ No newline at end of file From 828805295d5724696fee21c42adad365a61a91c3 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sat, 22 Apr 2023 15:50:55 +0530 Subject: [PATCH 010/141] JAVA-20381 Moved modules --- .../dependency-exclusion}/README.md | 0 .../core-java-exclusions/pom.xml | 0 .../ExcludeDirectDependencyUnitTest.java | 0 .../dummy-surefire-junit47/pom.xml | 0 .../dependency-exclusion}/pom.xml | 3 +-- maven-modules/pom.xml | 22 ++++++++++--------- .../spring-bom}/README.md | 0 .../spring-bom}/pom.xml | 4 ++-- .../baeldung/spring/bom/HelloWorldApp.java | 0 .../baeldung/spring/bom/HelloWorldBean.java | 0 .../baeldung/spring/bom/HelloWorldConfig.java | 0 .../src/main/resources/logback.xml | 0 .../java/com/baeldung/SpringContextTest.java | 0 .../apache-rocketmq}/README.md | 0 .../apache-rocketmq}/pom.xml | 4 ++-- .../rocketmq/consumer/CartEventConsumer.java | 0 .../rocketmq/event/CartItemEvent.java | 0 .../rocketmq/producer/CartEventProducer.java | 0 .../transaction/TransactionListenerImpl.java | 0 .../src/main/resources/application.properties | 0 messaging-modules/pom.xml | 1 + pom.xml | 8 ------- .../discord4j}/.gitignore | 0 .../discord4j}/README.md | 0 {discord4j => saas-modules/discord4j}/pom.xml | 5 ++--- .../baeldung/discordbot/BotConfiguration.java | 0 .../discordbot/DiscordBotApplication.java | 0 .../discordbot/events/EventListener.java | 0 .../events/MessageCreateListener.java | 0 .../discordbot/events/MessageListener.java | 0 .../events/MessageUpdateListener.java | 0 .../src/main/resources/application.yml | 0 .../discordbot/DiscordBotLiveTest.java | 0 saas-modules/pom.xml | 4 +++- {slack => saas-modules/slack}/README.md | 0 {slack => saas-modules/slack}/pom.xml | 2 +- .../examples/slack/DiskSpaceErrorChecker.java | 0 .../baeldung/examples/slack/ErrorChecker.java | 0 .../examples/slack/ErrorReporter.java | 0 .../baeldung/examples/slack/MainClass.java | 0 .../slack/SlackChannelErrorReporter.java | 0 .../slack/SlackUserErrorReporter.java | 0 .../slack}/src/main/resources/logback.xml | 0 43 files changed, 24 insertions(+), 29 deletions(-) rename {dependency-exclusion => maven-modules/dependency-exclusion}/README.md (100%) rename {dependency-exclusion => maven-modules/dependency-exclusion}/core-java-exclusions/pom.xml (100%) rename {dependency-exclusion => maven-modules/dependency-exclusion}/core-java-exclusions/src/test/java/com/sample/project/tests/ExcludeDirectDependencyUnitTest.java (100%) rename {dependency-exclusion => maven-modules/dependency-exclusion}/dummy-surefire-junit47/pom.xml (100%) rename {dependency-exclusion => maven-modules/dependency-exclusion}/pom.xml (96%) rename {spring-bom => maven-modules/spring-bom}/README.md (100%) rename {spring-bom => maven-modules/spring-bom}/pom.xml (93%) rename {spring-bom => maven-modules/spring-bom}/src/main/java/com/baeldung/spring/bom/HelloWorldApp.java (100%) rename {spring-bom => maven-modules/spring-bom}/src/main/java/com/baeldung/spring/bom/HelloWorldBean.java (100%) rename {spring-bom => maven-modules/spring-bom}/src/main/java/com/baeldung/spring/bom/HelloWorldConfig.java (100%) rename {spring-bom => maven-modules/spring-bom}/src/main/resources/logback.xml (100%) rename {spring-bom => maven-modules/spring-bom}/src/test/java/com/baeldung/SpringContextTest.java (100%) rename {apache-rocketmq => messaging-modules/apache-rocketmq}/README.md (100%) rename {apache-rocketmq => messaging-modules/apache-rocketmq}/pom.xml (89%) rename {apache-rocketmq => messaging-modules/apache-rocketmq}/src/main/java/com/baeldung/rocketmq/consumer/CartEventConsumer.java (100%) rename {apache-rocketmq => messaging-modules/apache-rocketmq}/src/main/java/com/baeldung/rocketmq/event/CartItemEvent.java (100%) rename {apache-rocketmq => messaging-modules/apache-rocketmq}/src/main/java/com/baeldung/rocketmq/producer/CartEventProducer.java (100%) rename {apache-rocketmq => messaging-modules/apache-rocketmq}/src/main/java/com/baeldung/rocketmq/transaction/TransactionListenerImpl.java (100%) rename {apache-rocketmq => messaging-modules/apache-rocketmq}/src/main/resources/application.properties (100%) rename {discord4j => saas-modules/discord4j}/.gitignore (100%) rename {discord4j => saas-modules/discord4j}/README.md (100%) rename {discord4j => saas-modules/discord4j}/pom.xml (92%) rename {discord4j => saas-modules/discord4j}/src/main/java/com/baeldung/discordbot/BotConfiguration.java (100%) rename {discord4j => saas-modules/discord4j}/src/main/java/com/baeldung/discordbot/DiscordBotApplication.java (100%) rename {discord4j => saas-modules/discord4j}/src/main/java/com/baeldung/discordbot/events/EventListener.java (100%) rename {discord4j => saas-modules/discord4j}/src/main/java/com/baeldung/discordbot/events/MessageCreateListener.java (100%) rename {discord4j => saas-modules/discord4j}/src/main/java/com/baeldung/discordbot/events/MessageListener.java (100%) rename {discord4j => saas-modules/discord4j}/src/main/java/com/baeldung/discordbot/events/MessageUpdateListener.java (100%) rename {discord4j => saas-modules/discord4j}/src/main/resources/application.yml (100%) rename {discord4j => saas-modules/discord4j}/src/test/java/com/baeldung/discordbot/DiscordBotLiveTest.java (100%) rename {slack => saas-modules/slack}/README.md (100%) rename {slack => saas-modules/slack}/pom.xml (97%) rename {slack => saas-modules/slack}/src/main/java/com/baeldung/examples/slack/DiskSpaceErrorChecker.java (100%) rename {slack => saas-modules/slack}/src/main/java/com/baeldung/examples/slack/ErrorChecker.java (100%) rename {slack => saas-modules/slack}/src/main/java/com/baeldung/examples/slack/ErrorReporter.java (100%) rename {slack => saas-modules/slack}/src/main/java/com/baeldung/examples/slack/MainClass.java (100%) rename {slack => saas-modules/slack}/src/main/java/com/baeldung/examples/slack/SlackChannelErrorReporter.java (100%) rename {slack => saas-modules/slack}/src/main/java/com/baeldung/examples/slack/SlackUserErrorReporter.java (100%) rename {slack => saas-modules/slack}/src/main/resources/logback.xml (100%) diff --git a/dependency-exclusion/README.md b/maven-modules/dependency-exclusion/README.md similarity index 100% rename from dependency-exclusion/README.md rename to maven-modules/dependency-exclusion/README.md diff --git a/dependency-exclusion/core-java-exclusions/pom.xml b/maven-modules/dependency-exclusion/core-java-exclusions/pom.xml similarity index 100% rename from dependency-exclusion/core-java-exclusions/pom.xml rename to maven-modules/dependency-exclusion/core-java-exclusions/pom.xml diff --git a/dependency-exclusion/core-java-exclusions/src/test/java/com/sample/project/tests/ExcludeDirectDependencyUnitTest.java b/maven-modules/dependency-exclusion/core-java-exclusions/src/test/java/com/sample/project/tests/ExcludeDirectDependencyUnitTest.java similarity index 100% rename from dependency-exclusion/core-java-exclusions/src/test/java/com/sample/project/tests/ExcludeDirectDependencyUnitTest.java rename to maven-modules/dependency-exclusion/core-java-exclusions/src/test/java/com/sample/project/tests/ExcludeDirectDependencyUnitTest.java diff --git a/dependency-exclusion/dummy-surefire-junit47/pom.xml b/maven-modules/dependency-exclusion/dummy-surefire-junit47/pom.xml similarity index 100% rename from dependency-exclusion/dummy-surefire-junit47/pom.xml rename to maven-modules/dependency-exclusion/dummy-surefire-junit47/pom.xml diff --git a/dependency-exclusion/pom.xml b/maven-modules/dependency-exclusion/pom.xml similarity index 96% rename from dependency-exclusion/pom.xml rename to maven-modules/dependency-exclusion/pom.xml index ac83cc161a..13de16a57c 100644 --- a/dependency-exclusion/pom.xml +++ b/maven-modules/dependency-exclusion/pom.xml @@ -10,9 +10,8 @@ com.baeldung - parent-java + maven-modules 0.0.1-SNAPSHOT - ../parent-java diff --git a/maven-modules/pom.xml b/maven-modules/pom.xml index a7a3522ca8..dae55f1617 100644 --- a/maven-modules/pom.xml +++ b/maven-modules/pom.xml @@ -16,33 +16,35 @@ animal-sniffer-mvn-plugin - maven-archetype compiler-plugin-java-9 + dependency-exclusion + host-maven-repo-example + maven-archetype + maven-builder-plugin + maven-classifier maven-copy-files maven-custom-plugin maven-exec-plugin maven-generate-war maven-integration-test maven-multi-source + maven-parent-pom-resolution maven-plugins maven-polyglot + maven-printing-plugins maven-properties + maven-reactor + maven-repositories + maven-simple + maven-surefire-plugin maven-unused-dependencies maven-war-plugin + spring-bom optional-dependencies version-collision version-overriding-plugins versions-maven-plugin - maven-printing-plugins - maven-builder-plugin - host-maven-repo-example - maven-surefire-plugin - maven-parent-pom-resolution - maven-simple - maven-classifier - maven-repositories - maven-reactor diff --git a/spring-bom/README.md b/maven-modules/spring-bom/README.md similarity index 100% rename from spring-bom/README.md rename to maven-modules/spring-bom/README.md diff --git a/spring-bom/pom.xml b/maven-modules/spring-bom/pom.xml similarity index 93% rename from spring-bom/pom.xml rename to maven-modules/spring-bom/pom.xml index 7ba21ee285..93d0bdc458 100644 --- a/spring-bom/pom.xml +++ b/maven-modules/spring-bom/pom.xml @@ -10,8 +10,8 @@ com.baeldung - parent-modules - 1.0.0-SNAPSHOT + maven-modules + 0.0.1-SNAPSHOT diff --git a/spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldApp.java b/maven-modules/spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldApp.java similarity index 100% rename from spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldApp.java rename to maven-modules/spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldApp.java diff --git a/spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldBean.java b/maven-modules/spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldBean.java similarity index 100% rename from spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldBean.java rename to maven-modules/spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldBean.java diff --git a/spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldConfig.java b/maven-modules/spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldConfig.java similarity index 100% rename from spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldConfig.java rename to maven-modules/spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldConfig.java diff --git a/spring-bom/src/main/resources/logback.xml b/maven-modules/spring-bom/src/main/resources/logback.xml similarity index 100% rename from spring-bom/src/main/resources/logback.xml rename to maven-modules/spring-bom/src/main/resources/logback.xml diff --git a/spring-bom/src/test/java/com/baeldung/SpringContextTest.java b/maven-modules/spring-bom/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-bom/src/test/java/com/baeldung/SpringContextTest.java rename to maven-modules/spring-bom/src/test/java/com/baeldung/SpringContextTest.java diff --git a/apache-rocketmq/README.md b/messaging-modules/apache-rocketmq/README.md similarity index 100% rename from apache-rocketmq/README.md rename to messaging-modules/apache-rocketmq/README.md diff --git a/apache-rocketmq/pom.xml b/messaging-modules/apache-rocketmq/pom.xml similarity index 89% rename from apache-rocketmq/pom.xml rename to messaging-modules/apache-rocketmq/pom.xml index 48399b6d51..a362644de3 100644 --- a/apache-rocketmq/pom.xml +++ b/messaging-modules/apache-rocketmq/pom.xml @@ -9,8 +9,8 @@ com.baeldung - parent-modules - 1.0.0-SNAPSHOT + messaging-modules + 0.0.1-SNAPSHOT diff --git a/apache-rocketmq/src/main/java/com/baeldung/rocketmq/consumer/CartEventConsumer.java b/messaging-modules/apache-rocketmq/src/main/java/com/baeldung/rocketmq/consumer/CartEventConsumer.java similarity index 100% rename from apache-rocketmq/src/main/java/com/baeldung/rocketmq/consumer/CartEventConsumer.java rename to messaging-modules/apache-rocketmq/src/main/java/com/baeldung/rocketmq/consumer/CartEventConsumer.java diff --git a/apache-rocketmq/src/main/java/com/baeldung/rocketmq/event/CartItemEvent.java b/messaging-modules/apache-rocketmq/src/main/java/com/baeldung/rocketmq/event/CartItemEvent.java similarity index 100% rename from apache-rocketmq/src/main/java/com/baeldung/rocketmq/event/CartItemEvent.java rename to messaging-modules/apache-rocketmq/src/main/java/com/baeldung/rocketmq/event/CartItemEvent.java diff --git a/apache-rocketmq/src/main/java/com/baeldung/rocketmq/producer/CartEventProducer.java b/messaging-modules/apache-rocketmq/src/main/java/com/baeldung/rocketmq/producer/CartEventProducer.java similarity index 100% rename from apache-rocketmq/src/main/java/com/baeldung/rocketmq/producer/CartEventProducer.java rename to messaging-modules/apache-rocketmq/src/main/java/com/baeldung/rocketmq/producer/CartEventProducer.java diff --git a/apache-rocketmq/src/main/java/com/baeldung/rocketmq/transaction/TransactionListenerImpl.java b/messaging-modules/apache-rocketmq/src/main/java/com/baeldung/rocketmq/transaction/TransactionListenerImpl.java similarity index 100% rename from apache-rocketmq/src/main/java/com/baeldung/rocketmq/transaction/TransactionListenerImpl.java rename to messaging-modules/apache-rocketmq/src/main/java/com/baeldung/rocketmq/transaction/TransactionListenerImpl.java diff --git a/apache-rocketmq/src/main/resources/application.properties b/messaging-modules/apache-rocketmq/src/main/resources/application.properties similarity index 100% rename from apache-rocketmq/src/main/resources/application.properties rename to messaging-modules/apache-rocketmq/src/main/resources/application.properties diff --git a/messaging-modules/pom.xml b/messaging-modules/pom.xml index 47e0730148..71ff25d71b 100644 --- a/messaging-modules/pom.xml +++ b/messaging-modules/pom.xml @@ -16,6 +16,7 @@ apache-camel + apache-rocketmq jgroups rabbitmq spring-amqp diff --git a/pom.xml b/pom.xml index bef7603cff..a80ee4430c 100644 --- a/pom.xml +++ b/pom.xml @@ -413,7 +413,6 @@ spring-4 spring-aop - spring-bom spring-cloud-modules @@ -593,7 +592,6 @@ spring-4 - spring-bom spring-cloud-modules @@ -838,7 +836,6 @@ apache-olingo apache-poi-2 - apache-rocketmq apache-thrift apache-tika @@ -851,7 +848,6 @@ bazel google-auto-project ddd - discord4j disruptor dozer dubbo @@ -908,7 +904,6 @@ protobuffer reactor-core rsocket - slack @@ -1089,7 +1084,6 @@ apache-olingo apache-poi-2 - apache-rocketmq apache-thrift apache-tika @@ -1102,7 +1096,6 @@ bazel google-auto-project ddd - discord4j disruptor dozer @@ -1161,7 +1154,6 @@ protobuffer reactor-core rsocket - slack diff --git a/discord4j/.gitignore b/saas-modules/discord4j/.gitignore similarity index 100% rename from discord4j/.gitignore rename to saas-modules/discord4j/.gitignore diff --git a/discord4j/README.md b/saas-modules/discord4j/README.md similarity index 100% rename from discord4j/README.md rename to saas-modules/discord4j/README.md diff --git a/discord4j/pom.xml b/saas-modules/discord4j/pom.xml similarity index 92% rename from discord4j/pom.xml rename to saas-modules/discord4j/pom.xml index 086adebee5..ff398dd1a3 100644 --- a/discord4j/pom.xml +++ b/saas-modules/discord4j/pom.xml @@ -9,9 +9,8 @@ com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../parent-boot-2 + saas-modules + 1.0.0-SNAPSHOT diff --git a/discord4j/src/main/java/com/baeldung/discordbot/BotConfiguration.java b/saas-modules/discord4j/src/main/java/com/baeldung/discordbot/BotConfiguration.java similarity index 100% rename from discord4j/src/main/java/com/baeldung/discordbot/BotConfiguration.java rename to saas-modules/discord4j/src/main/java/com/baeldung/discordbot/BotConfiguration.java diff --git a/discord4j/src/main/java/com/baeldung/discordbot/DiscordBotApplication.java b/saas-modules/discord4j/src/main/java/com/baeldung/discordbot/DiscordBotApplication.java similarity index 100% rename from discord4j/src/main/java/com/baeldung/discordbot/DiscordBotApplication.java rename to saas-modules/discord4j/src/main/java/com/baeldung/discordbot/DiscordBotApplication.java diff --git a/discord4j/src/main/java/com/baeldung/discordbot/events/EventListener.java b/saas-modules/discord4j/src/main/java/com/baeldung/discordbot/events/EventListener.java similarity index 100% rename from discord4j/src/main/java/com/baeldung/discordbot/events/EventListener.java rename to saas-modules/discord4j/src/main/java/com/baeldung/discordbot/events/EventListener.java diff --git a/discord4j/src/main/java/com/baeldung/discordbot/events/MessageCreateListener.java b/saas-modules/discord4j/src/main/java/com/baeldung/discordbot/events/MessageCreateListener.java similarity index 100% rename from discord4j/src/main/java/com/baeldung/discordbot/events/MessageCreateListener.java rename to saas-modules/discord4j/src/main/java/com/baeldung/discordbot/events/MessageCreateListener.java diff --git a/discord4j/src/main/java/com/baeldung/discordbot/events/MessageListener.java b/saas-modules/discord4j/src/main/java/com/baeldung/discordbot/events/MessageListener.java similarity index 100% rename from discord4j/src/main/java/com/baeldung/discordbot/events/MessageListener.java rename to saas-modules/discord4j/src/main/java/com/baeldung/discordbot/events/MessageListener.java diff --git a/discord4j/src/main/java/com/baeldung/discordbot/events/MessageUpdateListener.java b/saas-modules/discord4j/src/main/java/com/baeldung/discordbot/events/MessageUpdateListener.java similarity index 100% rename from discord4j/src/main/java/com/baeldung/discordbot/events/MessageUpdateListener.java rename to saas-modules/discord4j/src/main/java/com/baeldung/discordbot/events/MessageUpdateListener.java diff --git a/discord4j/src/main/resources/application.yml b/saas-modules/discord4j/src/main/resources/application.yml similarity index 100% rename from discord4j/src/main/resources/application.yml rename to saas-modules/discord4j/src/main/resources/application.yml diff --git a/discord4j/src/test/java/com/baeldung/discordbot/DiscordBotLiveTest.java b/saas-modules/discord4j/src/test/java/com/baeldung/discordbot/DiscordBotLiveTest.java similarity index 100% rename from discord4j/src/test/java/com/baeldung/discordbot/DiscordBotLiveTest.java rename to saas-modules/discord4j/src/test/java/com/baeldung/discordbot/DiscordBotLiveTest.java diff --git a/saas-modules/pom.xml b/saas-modules/pom.xml index 7e8adebdd9..16ed50918c 100644 --- a/saas-modules/pom.xml +++ b/saas-modules/pom.xml @@ -16,11 +16,13 @@ + discord4j jira-rest-integration + sentry-servlet + slack stripe twilio twitter4j - sentry-servlet diff --git a/slack/README.md b/saas-modules/slack/README.md similarity index 100% rename from slack/README.md rename to saas-modules/slack/README.md diff --git a/slack/pom.xml b/saas-modules/slack/pom.xml similarity index 97% rename from slack/pom.xml rename to saas-modules/slack/pom.xml index 690bf5132c..326167c055 100644 --- a/slack/pom.xml +++ b/saas-modules/slack/pom.xml @@ -11,7 +11,7 @@ com.baeldung - parent-modules + saas-modules 1.0.0-SNAPSHOT diff --git a/slack/src/main/java/com/baeldung/examples/slack/DiskSpaceErrorChecker.java b/saas-modules/slack/src/main/java/com/baeldung/examples/slack/DiskSpaceErrorChecker.java similarity index 100% rename from slack/src/main/java/com/baeldung/examples/slack/DiskSpaceErrorChecker.java rename to saas-modules/slack/src/main/java/com/baeldung/examples/slack/DiskSpaceErrorChecker.java diff --git a/slack/src/main/java/com/baeldung/examples/slack/ErrorChecker.java b/saas-modules/slack/src/main/java/com/baeldung/examples/slack/ErrorChecker.java similarity index 100% rename from slack/src/main/java/com/baeldung/examples/slack/ErrorChecker.java rename to saas-modules/slack/src/main/java/com/baeldung/examples/slack/ErrorChecker.java diff --git a/slack/src/main/java/com/baeldung/examples/slack/ErrorReporter.java b/saas-modules/slack/src/main/java/com/baeldung/examples/slack/ErrorReporter.java similarity index 100% rename from slack/src/main/java/com/baeldung/examples/slack/ErrorReporter.java rename to saas-modules/slack/src/main/java/com/baeldung/examples/slack/ErrorReporter.java diff --git a/slack/src/main/java/com/baeldung/examples/slack/MainClass.java b/saas-modules/slack/src/main/java/com/baeldung/examples/slack/MainClass.java similarity index 100% rename from slack/src/main/java/com/baeldung/examples/slack/MainClass.java rename to saas-modules/slack/src/main/java/com/baeldung/examples/slack/MainClass.java diff --git a/slack/src/main/java/com/baeldung/examples/slack/SlackChannelErrorReporter.java b/saas-modules/slack/src/main/java/com/baeldung/examples/slack/SlackChannelErrorReporter.java similarity index 100% rename from slack/src/main/java/com/baeldung/examples/slack/SlackChannelErrorReporter.java rename to saas-modules/slack/src/main/java/com/baeldung/examples/slack/SlackChannelErrorReporter.java diff --git a/slack/src/main/java/com/baeldung/examples/slack/SlackUserErrorReporter.java b/saas-modules/slack/src/main/java/com/baeldung/examples/slack/SlackUserErrorReporter.java similarity index 100% rename from slack/src/main/java/com/baeldung/examples/slack/SlackUserErrorReporter.java rename to saas-modules/slack/src/main/java/com/baeldung/examples/slack/SlackUserErrorReporter.java diff --git a/slack/src/main/resources/logback.xml b/saas-modules/slack/src/main/resources/logback.xml similarity index 100% rename from slack/src/main/resources/logback.xml rename to saas-modules/slack/src/main/resources/logback.xml From c4ccc310083ac5cb384c5bb9f7f86b6cd0de0e0a Mon Sep 17 00:00:00 2001 From: Abhinav Pandey Date: Sun, 23 Apr 2023 14:02:10 +0530 Subject: [PATCH 011/141] BAEL-6355 - OpenAI API with Spring Boot - review comment incorporated --- .../baeldung/openapi/controller/ChatController.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/controller/ChatController.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/controller/ChatController.java index 4cd65580dc..129d233582 100644 --- a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/controller/ChatController.java +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/openapi/controller/ChatController.java @@ -23,12 +23,17 @@ public class ChatController { @Value("${openai.api.url}") private String apiUrl; + /** + * Creates a chat request and sends it to the OpenAI API + * Returns the first message from the API response + * + * @param prompt the prompt to send to the API + * @return first message from the API response + */ @GetMapping("/chat") public String chat(@RequestParam String prompt) { - // create a request ChatRequest request = new ChatRequest(model, prompt); - // call the API ChatResponse response = restTemplate.postForObject( apiUrl, request, @@ -38,7 +43,6 @@ public class ChatController { return "No response"; } - // return the first response return response.getChoices().get(0).getMessage().getContent(); } } \ No newline at end of file From 2efc27170d40a9d8e985ae5231748610870afdff Mon Sep 17 00:00:00 2001 From: achraftt Date: Sun, 23 Apr 2023 18:59:19 +0200 Subject: [PATCH 012/141] BAEL-6303: Encode passwords with Spring Boot CLI --- spring-boot-modules/spring-boot-cli/pom.xml | 38 ++++++++++++++ .../main/java/com/baeldung/Application.java | 12 +++++ .../baeldung/controller/LoginController.java | 13 +++++ .../src/main/resources/application.properties | 3 ++ .../encoding/PasswordEncodingUnitTest.java | 51 +++++++++++++++++++ 5 files changed, 117 insertions(+) create mode 100644 spring-boot-modules/spring-boot-cli/pom.xml create mode 100644 spring-boot-modules/spring-boot-cli/src/main/java/com/baeldung/Application.java create mode 100644 spring-boot-modules/spring-boot-cli/src/main/java/com/baeldung/controller/LoginController.java create mode 100644 spring-boot-modules/spring-boot-cli/src/main/resources/application.properties create mode 100644 spring-boot-modules/spring-boot-cli/src/test/java/com/baeldung/encoding/PasswordEncodingUnitTest.java diff --git a/spring-boot-modules/spring-boot-cli/pom.xml b/spring-boot-modules/spring-boot-cli/pom.xml new file mode 100644 index 0000000000..d2c50590ab --- /dev/null +++ b/spring-boot-modules/spring-boot-cli/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + spring-boot-cli + spring-boot-cli + jar + + + + com.baeldung.spring-boot-modules + spring-boot-modules + 1.0.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.security + spring-security-test + test + + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-cli/src/main/java/com/baeldung/Application.java b/spring-boot-modules/spring-boot-cli/src/main/java/com/baeldung/Application.java new file mode 100644 index 0000000000..c0490d50c6 --- /dev/null +++ b/spring-boot-modules/spring-boot-cli/src/main/java/com/baeldung/Application.java @@ -0,0 +1,12 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/spring-boot-modules/spring-boot-cli/src/main/java/com/baeldung/controller/LoginController.java b/spring-boot-modules/spring-boot-cli/src/main/java/com/baeldung/controller/LoginController.java new file mode 100644 index 0000000000..b678f63623 --- /dev/null +++ b/spring-boot-modules/spring-boot-cli/src/main/java/com/baeldung/controller/LoginController.java @@ -0,0 +1,13 @@ +package com.baeldung.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class LoginController { + + @GetMapping("/") + public String hello() { + return "Hello World!"; + } +} diff --git a/spring-boot-modules/spring-boot-cli/src/main/resources/application.properties b/spring-boot-modules/spring-boot-cli/src/main/resources/application.properties new file mode 100644 index 0000000000..4b341094a1 --- /dev/null +++ b/spring-boot-modules/spring-boot-cli/src/main/resources/application.properties @@ -0,0 +1,3 @@ +spring.security.user.name=baeldung +# Encoded password with SpringBoot CLI, the decoded password is baeldungPassword +spring.security.user.password={bcrypt}$2y$10$R8VIwFiQ7aUST17YqMaWJuxjkCYqk3jjPlSxyDLLzqCTOwFuJNq2a \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-cli/src/test/java/com/baeldung/encoding/PasswordEncodingUnitTest.java b/spring-boot-modules/spring-boot-cli/src/test/java/com/baeldung/encoding/PasswordEncodingUnitTest.java new file mode 100644 index 0000000000..8939029f71 --- /dev/null +++ b/spring-boot-modules/spring-boot-cli/src/test/java/com/baeldung/encoding/PasswordEncodingUnitTest.java @@ -0,0 +1,51 @@ +package com.baeldung.encoding; + +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic; +import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@AutoConfigureMockMvc +public class PasswordEncodingUnitTest { + private final static String userName = "baeldung"; + private final static String passwordDecoded = "baeldungPassword"; + + private MockMvc mvc; + + @Autowired + private WebApplicationContext webApplicationContext; + + @Before + public void setup() { + mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext) + .apply(springSecurity()) + .build(); + } + + @Test + public void givenRequestWithWrongPassword_shouldFailWith401() throws Exception { + mvc.perform(get("/").with(httpBasic(userName, "wrongPassword"))) + .andExpect(status().isUnauthorized()); + + } + + @Test + public void givenRequestWithCorrectDecodedPassword_houldSucceedWith200() throws Exception { + mvc.perform(get("/").with(httpBasic(userName, passwordDecoded))) + .andExpect(status().isOk()); + + } +} \ No newline at end of file From 1bc733cb07b7e909414b79517ab9954c03bb8167 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Mon, 24 Apr 2023 22:08:01 +0530 Subject: [PATCH 013/141] JAVA-20381 opening java.lang for the surefire --- maven-modules/pom.xml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/maven-modules/pom.xml b/maven-modules/pom.xml index dae55f1617..f7bba3a8ff 100644 --- a/maven-modules/pom.xml +++ b/maven-modules/pom.xml @@ -64,4 +64,18 @@ + + + + org.apache.maven.plugins + maven-surefire-plugin + + + --add-opens java.base/java.lang=ALL-UNNAMED + + + + + + \ No newline at end of file From 6cc24e075905156191c53efa50402894a2fc8bed Mon Sep 17 00:00:00 2001 From: Kilian Schneider <48420258+Basler182@users.noreply.github.com> Date: Wed, 26 Apr 2023 02:55:11 +0200 Subject: [PATCH 014/141] BAEL-6348 persist List in JPA (#13897) * BAEL-6348 persist List in JPA * Update naming --- .../jpa/listrepositories/entity/Library.java | 66 +++++++++++++++++++ .../entity/StringListConverter.java | 25 +++++++ .../repository/LibraryRepository.java | 13 ++++ .../repository/LibraryIntegrationTest.java | 32 +++++++++ 4 files changed, 136 insertions(+) create mode 100644 persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/Library.java create mode 100644 persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/StringListConverter.java create mode 100644 persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/repository/LibraryRepository.java create mode 100644 persistence-modules/spring-data-jpa-repo-3/src/test/java/com/baeldung/spring/data/jpa/listrepositories/repository/LibraryIntegrationTest.java diff --git a/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/Library.java b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/Library.java new file mode 100644 index 0000000000..04c0ad5e0a --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/Library.java @@ -0,0 +1,66 @@ +package com.baeldung.spring.data.jpa.listrepositories.entity; + +import jakarta.persistence.*; + +import java.util.ArrayList; +import java.util.List; + +@Entity(name = "library") +public class Library { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + + @Convert(converter = StringListConverter.class) + @Column(name = "addresses", nullable = false) + private List addresses = new ArrayList<>(); + + @ElementCollection(targetClass = String.class, fetch = FetchType.EAGER) + @CollectionTable(name = "book", joinColumns = @JoinColumn(name = "library_id")) + @Column(name = "book", nullable = false) + private List books = new ArrayList<>(); + + public Library() { + } + + public Library(String name, List addresses, List books) { + this.name = name; + this.addresses = addresses; + this.books = books; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getAddresses() { + return addresses; + } + + public void setAddresses(List addresses) { + this.addresses = addresses; + } + + public List getBooks() { + return books; + } + + public void setBooks(List books) { + this.books = books; + } +} diff --git a/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/StringListConverter.java b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/StringListConverter.java new file mode 100644 index 0000000000..ffc097ee18 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/StringListConverter.java @@ -0,0 +1,25 @@ +package com.baeldung.spring.data.jpa.listrepositories.entity; + +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; + +import java.util.Arrays; +import java.util.List; + + +import static java.util.Collections.*; + +@Converter +public class StringListConverter implements AttributeConverter, String> { + private static final String SPLIT_CHAR = ";"; + + @Override + public String convertToDatabaseColumn(List stringList) { + return stringList != null ? String.join(SPLIT_CHAR, stringList) : ""; + } + + @Override + public List convertToEntityAttribute(String string) { + return string != null ? Arrays.asList(string.split(SPLIT_CHAR)) : emptyList(); + } +} \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/repository/LibraryRepository.java b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/repository/LibraryRepository.java new file mode 100644 index 0000000000..71deb04b3e --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/repository/LibraryRepository.java @@ -0,0 +1,13 @@ +package com.baeldung.spring.data.jpa.listrepositories.repository; + +import com.baeldung.spring.data.jpa.listrepositories.entity.Library; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface LibraryRepository extends CrudRepository { + @Query("SELECT l FROM library l JOIN FETCH l.books WHERE l.id = (:id)") + Library findById(@Param("id") long id); +} diff --git a/persistence-modules/spring-data-jpa-repo-3/src/test/java/com/baeldung/spring/data/jpa/listrepositories/repository/LibraryIntegrationTest.java b/persistence-modules/spring-data-jpa-repo-3/src/test/java/com/baeldung/spring/data/jpa/listrepositories/repository/LibraryIntegrationTest.java new file mode 100644 index 0000000000..7bd1b90407 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-3/src/test/java/com/baeldung/spring/data/jpa/listrepositories/repository/LibraryIntegrationTest.java @@ -0,0 +1,32 @@ +package com.baeldung.spring.data.jpa.listrepositories.repository; + +import com.baeldung.spring.data.jpa.listrepositories.entity.Library; +import jakarta.transaction.Transactional; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.Arrays; + +@SpringBootTest +public class LibraryIntegrationTest { + + @Autowired + private LibraryRepository libraryRepository; + + @Test + @Transactional + public void givenLibrary_whenGetAddressesAndGetBooks_thenGetListOfItems(){ + Library library = new Library(); + library.setAddresses(Arrays.asList("Address 1", "Address 2")); + library.setBooks(Arrays.asList("Book 1", "Book 2")); + + libraryRepository.save(library); + Library lib = libraryRepository.findById(library.getId().longValue()); + + Assertions.assertEquals(2, lib.getAddresses().size()); + Assertions.assertEquals(2, lib.getBooks().size()); + } + +} From 7675b0c48d1a910668529b9f20ede49cc2bd2603 Mon Sep 17 00:00:00 2001 From: Zahid Khan Date: Wed, 26 Apr 2023 10:47:56 +0530 Subject: [PATCH 015/141] Add Kebab casing --- .../error/KebabCasingDemoApplication.java | 12 +++++++++ .../configuration/MainConfiguration.java | 26 +++++++++++++++++++ .../src/main/resources/application.properties | 11 +++++++- 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/error/KebabCasingDemoApplication.java create mode 100644 spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/error/configuration/MainConfiguration.java diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/error/KebabCasingDemoApplication.java b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/error/KebabCasingDemoApplication.java new file mode 100644 index 0000000000..7b97f97ffa --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/error/KebabCasingDemoApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.error; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class KebabCasingDemoApplication { + public static void main(String[] args) { + SpringApplication.run(KebabCasingDemoApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/error/configuration/MainConfiguration.java b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/error/configuration/MainConfiguration.java new file mode 100644 index 0000000000..cd7b513cd2 --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/error/configuration/MainConfiguration.java @@ -0,0 +1,26 @@ +package com.baeldung.error.configuration; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + *

This class is for Configuration.

+ *

+ * Project Name: New folder + * + * @author Zahid Khan + * @version 4/1/2023 + */ +@Configuration +@ConfigurationProperties(prefix = "profile.application-properties") +public class MainConfiguration { + private String name; + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } +} diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.properties b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.properties index 541183a186..e80c2ecc27 100644 --- a/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.properties +++ b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.properties @@ -31,4 +31,13 @@ bael.property=prodValue environment.name=${OS} java.home.and.environment=${JAVA_HOME}+${OS} not.existing.system.property=${thispropertydoesnotexist} -baeldung.presentation=${HELLO_BAELDUNG}. Java is installed in the folder: ${JAVA_HOME} \ No newline at end of file +baeldung.presentation=${HELLO_BAELDUNG}. Java is installed in the folder: ${JAVA_HOME} +#--- +#camelCasing +#profile.applicationProperties.name="Baeldung" +#PascalCasing +#profile.ApplicationProperties.name="Baeldung" +#SnakingCasing +#profile.application_properties.name="Baeldung" +#KebabCasing +profile.application-properties.name="Baeldung" \ No newline at end of file From c8cd042d647d5b0bf9abe84554706666f44ba153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan=20Cardo=C5=9F?= <106325528+sodrac@users.noreply.github.com> Date: Wed, 26 Apr 2023 09:30:27 +0300 Subject: [PATCH 016/141] BAEL-6079 Code examples from article (#13486) * BAEL-6079 Code examples from article * BAEL-6079 Code examples from article * BAEL-6079 Code examples from article update * BAEL-6079 Code examples from article update --- .../main/java/com/baeldung/methods/Car.java | 98 +++++++++++++++++++ .../java/com/baeldung/methods/Motorcycle.java | 52 ++++++++++ .../java/com/baeldung/methods/Vehicle.java | 33 +++++++ .../baeldung/methods/VehicleProcessor.java | 20 ++++ .../methods/VehicleProcessorUnitTest.java | 58 +++++++++++ 5 files changed, 261 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Car.java create mode 100644 core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Motorcycle.java create mode 100644 core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Vehicle.java create mode 100644 core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/VehicleProcessor.java create mode 100644 core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methods/VehicleProcessorUnitTest.java diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Car.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Car.java new file mode 100644 index 0000000000..a72d7dd0f1 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Car.java @@ -0,0 +1,98 @@ +package com.baeldung.methods; + +public class Car { + + private final String make; + private final String model; + private final int year; + private final String color; + private final boolean automatic; + private final int numDoors; + private final String features; + + private Car(CarBuilder carBuilder) { + this.make = carBuilder.make; + this.model = carBuilder.model; + this.year = carBuilder.year; + this.color = carBuilder.color; + this.automatic = carBuilder.automatic; + this.numDoors = carBuilder.numDoors; + this.features = carBuilder.features; + } + + public String getMake() { + return make; + } + + public String getModel() { + return model; + } + + public int getYear() { + return year; + } + + public String getColor() { + return color; + } + + public boolean isAutomatic() { + return automatic; + } + + public int getNumDoors() { + return numDoors; + } + + public String getFeatures() { + return features; + } + + public static class CarBuilder { + + private final String make; + private final String model; + private final int year; + + private String color = "unknown"; + private boolean automatic = false; + private int numDoors = 4; + private String features = ""; + + public CarBuilder(String make, String model, int year) { + this.make = make; + this.model = model; + this.year = year; + } + + public CarBuilder color(String color) { + this.color = color; + return this; + } + + public CarBuilder automatic(boolean automatic) { + this.automatic = automatic; + return this; + } + + public CarBuilder numDoors(int numDoors) { + this.numDoors = numDoors; + return this; + } + + public CarBuilder features(String features) { + this.features = features; + return this; + } + + public Car build() { + return new Car(this); + } + } + + @Override + public String toString() { + return "Car [make=" + make + ", model=" + model + ", year=" + year + ", color=" + color + ", automatic=" + automatic + ", numDoors=" + numDoors + ", features=" + features + "]"; + } + +} diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Motorcycle.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Motorcycle.java new file mode 100644 index 0000000000..8a1fce4a5d --- /dev/null +++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Motorcycle.java @@ -0,0 +1,52 @@ +package com.baeldung.methods; + +import java.io.Serializable; + +public class Motorcycle extends Vehicle implements Serializable { + + private static final long serialVersionUID = 5973661295933599929L; + + private int year; + private String features = ""; + + public Motorcycle() { + super(); + } + + public Motorcycle(String make, String model, String color, int weight, boolean statusNew, int year) { + super(make, model, color, weight, statusNew); + this.year = year; + } + + public Motorcycle(Vehicle vehicle, int year) { + super(vehicle); + this.year = year; + } + + public int getYear() { + return year; + } + + public void setYear(int year) { + this.year = year; + } + + public void setFeatures(String features) { + this.features = features; + } + + public String getFeatures() { + return features; + } + + public void addMotorcycleFeatures(String... features) { + StringBuilder str = new StringBuilder(this.getFeatures()); + for (String feature : features) { + if (!str.toString().isEmpty()) + str.append(", "); + str.append(feature); + } + this.setFeatures(str.toString()); + } + +} diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Vehicle.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Vehicle.java new file mode 100644 index 0000000000..0c6964d255 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/Vehicle.java @@ -0,0 +1,33 @@ +package com.baeldung.methods; + +public class Vehicle { + + static String defaultValue = "DEFAULT"; + private String make = defaultValue; + private String model = defaultValue; + private String color = defaultValue; + private int weight = 0; + private boolean statusNew = true; + + public Vehicle() { + super(); + } + + public Vehicle(String make, String model, String color, int weight, boolean statusNew) { + this.make = make; + this.model = model; + this.color = color; + this.weight = weight; + this.statusNew = statusNew; + } + + public Vehicle(Vehicle vehicle) { + this(vehicle.make, vehicle.model, vehicle.color, vehicle.weight, vehicle.statusNew); + } + + @Override + public String toString() { + return "Vehicle [make=" + make + ", model=" + model + ", color=" + color + ", weight=" + weight + ", statusNew=" + statusNew + "]"; + } + +} diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/VehicleProcessor.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/VehicleProcessor.java new file mode 100644 index 0000000000..a7d5975813 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/methods/VehicleProcessor.java @@ -0,0 +1,20 @@ +package com.baeldung.methods; + +public class VehicleProcessor { + + Vehicle processVehicle(String make, String model, String color, int weight, boolean status) { + return new Vehicle(make, model, color, weight, status); + } + + Vehicle processVehicle(Vehicle vehicle) { + return new Vehicle(vehicle); + } + + Car processCar(Car car) { + return new Car.CarBuilder(car.getMake(), car.getModel(), car.getYear()).color(car.getColor()) + .automatic(car.isAutomatic()) + .features(car.getFeatures()) + .build(); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methods/VehicleProcessorUnitTest.java b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methods/VehicleProcessorUnitTest.java new file mode 100644 index 0000000000..928fbcb426 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/methods/VehicleProcessorUnitTest.java @@ -0,0 +1,58 @@ +package com.baeldung.methods; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +class VehicleProcessorUnitTest { + + VehicleProcessor vehicleProcessor = new VehicleProcessor(); + Vehicle vehicle = new Vehicle("Ford", "Focus", "red", 2200, true); + + @Test + void givenAllArguments_whenMethodCall_thenVerifyCallIsDoneCorrectly() { + Vehicle veh = vehicleProcessor.processVehicle("Ford", "Focus", "red", 2200, true); + assertThat(veh.toString()).hasToString(vehicle.toString()); + } + + @Test + void givenParameterObject_whenMethodCall_thenVerifyCallIsDoneCorrectly() { + Vehicle veh = vehicleProcessor.processVehicle(vehicle); + assertThat(veh.toString()).hasToString(vehicle.toString()); + } + + @Test + void givenJavaBeanPattern_whenMethodCall_thenVerifyCallIsDoneCorrectly() { + Motorcycle motorcycle = new Motorcycle("Ducati", "Monster", "yellow", 235, true, 2023); + motorcycle.setFeatures("GPS"); + + vehicleProcessor.processVehicle(motorcycle); + assertThat(motorcycle.getFeatures()).isEqualToIgnoringCase("GPS"); + } + + @Test + void givenJavaVarargs_whenMethodCall_thenAssertTheReturnedConcatenatedString() { + Motorcycle motorcycle = new Motorcycle("Ducati", "Monster", "red", 350, true, 2023); + motorcycle.addMotorcycleFeatures("abs"); + assertThat(motorcycle.getFeatures()).isEqualToIgnoringCase("abs"); + + motorcycle.addMotorcycleFeatures("navi", "charger"); + assertThat(motorcycle.getFeatures()).isEqualToIgnoringCase("abs, navi, charger"); + + motorcycle.addMotorcycleFeatures("wifi", "phone", "satellite"); + assertThat(motorcycle.getFeatures()).isEqualToIgnoringCase("abs, navi, charger, wifi, phone, satellite"); + } + + @Test + void givenJavaBuilderPattern_whenMethodCall_thenVerifyCallIsDoneCorrectly() { + Car car = new Car.CarBuilder("Ford", "Focus", 2023).color("blue") + .automatic(true) + .features("abs, navi, charger, wifi, phone, satellite") + .build(); + + Car result = vehicleProcessor.processCar(car); + + assertThat(result.toString()).hasToString(car.toString()); + } + +} From 8f5aff6073a7eb38655fdc8c4e6f17e1f7a232f5 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Wed, 26 Apr 2023 12:28:12 +0530 Subject: [PATCH 017/141] =?UTF-8?q?JAVA-18299=20:=20Changes=20made=20for?= =?UTF-8?q?=20adding=20json=20view=20example=20fot=20hiding=20req=E2=80=A6?= =?UTF-8?q?=20(#13829)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * JAVA-18299 : Changes made for adding json view example fot hiding request feilds in swagger * JAVA-18299: Changes made for adding new example for JsonView Support in swagger hiding field * JAVA-18299: Changes made for adding new example for JsonView Support in swagger hiding field * JAVA-18299: Changes made for removing extra boiler plate code * JAVA-18299: Changes made to incorporate review comments --- .../swagger/controller/AuthorsController.java | 34 +++++++++++++++++++ .../springboot/swagger/model/Author.java | 28 +++++++++++++++ .../swagger/service/AuthorService.java | 23 +++++++++++++ .../springboot/swagger/views/Views.java | 9 +++++ 4 files changed, 94 insertions(+) create mode 100644 spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/controller/AuthorsController.java create mode 100644 spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/model/Author.java create mode 100644 spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/service/AuthorService.java create mode 100644 spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/views/Views.java diff --git a/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/controller/AuthorsController.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/controller/AuthorsController.java new file mode 100644 index 0000000000..019bd5ad9d --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/controller/AuthorsController.java @@ -0,0 +1,34 @@ +package com.baeldung.springboot.swagger.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.springboot.swagger.model.Author; +import com.baeldung.springboot.swagger.service.AuthorService; +import com.baeldung.springboot.swagger.views.Views; +import com.fasterxml.jackson.annotation.JsonView; + +@RestController +@RequestMapping("/authors") +public class AuthorsController { + + @Autowired + AuthorService authorService; + + @JsonView(Views.Public.class) + @GetMapping + public List getAllAuthors() { + return authorService.getAllAuthors(); + } + + @PostMapping + public void addAuthor(@RequestBody @JsonView(Views.Public.class) Author author){ + authorService.addAuthors(author); + } +} diff --git a/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/model/Author.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/model/Author.java new file mode 100644 index 0000000000..2e30998059 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/model/Author.java @@ -0,0 +1,28 @@ +package com.baeldung.springboot.swagger.model; + +import com.baeldung.springboot.swagger.views.Views; +import com.fasterxml.jackson.annotation.JsonView; + +public class Author { + + @JsonView(Views.Private.class) + private Integer id; + + @JsonView(Views.Public.class) + private String name; + + @JsonView(Views.Public.class) + private String email; + + public Author() { + } + + public Author(String name, String email) { + this.name = name; + this.email = email; + } + + public void setId(Integer id) { + this.id = id; + } +} diff --git a/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/service/AuthorService.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/service/AuthorService.java new file mode 100644 index 0000000000..bf1f637889 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/service/AuthorService.java @@ -0,0 +1,23 @@ +package com.baeldung.springboot.swagger.service; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.baeldung.springboot.swagger.model.Author; + +@Service +public class AuthorService { + private List authors = new ArrayList<>(); + + public List getAllAuthors(){ + return authors; + } + + public void addAuthors(Author author){ + author.setId(authors.size()+1); + authors.add(author); + } + +} diff --git a/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/views/Views.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/views/Views.java new file mode 100644 index 0000000000..df638a5647 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/views/Views.java @@ -0,0 +1,9 @@ +package com.baeldung.springboot.swagger.views; + +public class Views { + public static class Public { + } + + public static class Private { + } +} From c25d5f73936ed8118e32fa481fc18999fb84e724 Mon Sep 17 00:00:00 2001 From: jsgrah-spring Date: Wed, 26 Apr 2023 09:47:24 +0200 Subject: [PATCH 018/141] =?UTF-8?q?JAVA-17760,=20Fix=20[WARNING]=20JAR=20w?= =?UTF-8?q?ill=20be=20empty=20-=20no=20content=20was=20marked=20f=E2=80=A6?= =?UTF-8?q?=20(#13645)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * JAVA-17760, Fix [WARNING] JAR will be empty - no content was marked for inclusion! Test project with no "main" under "src" folder. Include java-ee-8-security-api back since it did not take too long to run locally. Add spring-credhub to parent pom build. * JAVA-17760, Add spring-credhub to integration-jdk9 profile as well. * JAVA-17760, JAVA-20009 Revert changes to module javaxval-2 and Add module spring-credhub to default-jdk9 profile as well as integration-jdk9 profile. --------- Co-authored-by: jogra --- javaxval-2/pom.xml | 1 + pom.xml | 2 ++ security-modules/pom.xml | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/javaxval-2/pom.xml b/javaxval-2/pom.xml index 1b1c4929c8..5c311e10f8 100644 --- a/javaxval-2/pom.xml +++ b/javaxval-2/pom.xml @@ -4,6 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 javaxval-2 + 0.1-SNAPSHOT javaxval-2 diff --git a/pom.xml b/pom.xml index f55a665c33..4e5970d301 100644 --- a/pom.xml +++ b/pom.xml @@ -916,6 +916,7 @@ spring-activiti spring-core-2 spring-core-3 + spring-credhub spring-di-3 spring-cucumber @@ -1170,6 +1171,7 @@ spring-activiti spring-core-2 spring-core-3 + spring-credhub spring-di-3 spring-cucumber diff --git a/security-modules/pom.xml b/security-modules/pom.xml index ed88ef842e..d0edced4e0 100644 --- a/security-modules/pom.xml +++ b/security-modules/pom.xml @@ -17,7 +17,7 @@ apache-shiro cas cloud-foundry-uaa - + java-ee-8-security-api jee-7-security jjwt jwt From e3cc8abadb6b61e464f1e3f24863e2926d804d73 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Wed, 26 Apr 2023 23:36:54 +0200 Subject: [PATCH 019/141] BAEL-6085 - Working with Virtual Threads in Spring 6 (#13896) * BAEL-6085 - Working with Virtual Threads in Spring 6 * BAEL-6085 - jmeter test * BAEL-6085 | Virtual Thread Spring 6 * BAEL-6085 | Virtual Thread Spring 6 * BAEL-6085 | Virtual Thread Spring 6 * BAEL-6085 | Java 19 for compiling and executing * BAEL-6085 | Java 19 prop * BAEL-6085 | Java 19 prop * BAEL-6085 | Java 19 prop --- spring-boot-modules/spring-boot-3/pom.xml | 11 +- .../virtualthreads/VirtualThreadsApp.java | 13 ++ .../virtualthreads/config/ThreadConfig.java | 33 +++++ .../controller/LoadTestController.java | 23 ++++ .../controller/ThreadController.java | 16 +++ .../src/main/resources/application.yml | 4 +- .../src/test/HTTP Load Request .jmx | 125 ++++++++++++++++++ 7 files changed, 223 insertions(+), 2 deletions(-) create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/VirtualThreadsApp.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/config/ThreadConfig.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/controller/LoadTestController.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/controller/ThreadController.java create mode 100644 spring-boot-modules/spring-boot-3/src/test/HTTP Load Request .jmx diff --git a/spring-boot-modules/spring-boot-3/pom.xml b/spring-boot-modules/spring-boot-3/pom.xml index 03740e805f..8fe995ca91 100644 --- a/spring-boot-modules/spring-boot-3/pom.xml +++ b/spring-boot-modules/spring-boot-3/pom.xml @@ -116,6 +116,7 @@ org.springframework.boot spring-boot-maven-plugin + com.baeldung.virtualthreads.VirtualThreadsApp org.projectlombok @@ -131,15 +132,23 @@ org.springframework.boot spring-boot-maven-plugin + + org.apache.maven.plugins + maven-compiler-plugin + + --enable-preview + + + 19 1.5.2.Final 2.0.0 3.0.0-M7 com.baeldung.sample.TodoApplication - 5.14.0 + 5.14.0 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/VirtualThreadsApp.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/VirtualThreadsApp.java new file mode 100644 index 0000000000..159fa1c243 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/VirtualThreadsApp.java @@ -0,0 +1,13 @@ +package com.baeldung.virtualthreads; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class VirtualThreadsApp { + + public static void main(String[] args) { + SpringApplication.run(VirtualThreadsApp.class, args); + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/config/ThreadConfig.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/config/ThreadConfig.java new file mode 100644 index 0000000000..7231ec0b94 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/config/ThreadConfig.java @@ -0,0 +1,33 @@ +package com.baeldung.virtualthreads.config; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.web.embedded.tomcat.TomcatProtocolHandlerCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.AsyncTaskExecutor; +import org.springframework.core.task.support.TaskExecutorAdapter; +import org.springframework.scheduling.annotation.EnableAsync; + +import java.util.concurrent.Executors; + +@EnableAsync +@Configuration +@ConditionalOnProperty( + value = "spring.thread-executor", + havingValue = "virtual" +) +public class ThreadConfig { + + @Bean + public AsyncTaskExecutor applicationTaskExecutor() { + return new TaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor()); + } + + @Bean + public TomcatProtocolHandlerCustomizer protocolHandlerVirtualThreadExecutorCustomizer() { + return protocolHandler -> { + protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor()); + }; + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/controller/LoadTestController.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/controller/LoadTestController.java new file mode 100644 index 0000000000..d99d3824a0 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/controller/LoadTestController.java @@ -0,0 +1,23 @@ +package com.baeldung.virtualthreads.controller; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; + +@RestController +@RequestMapping("/load") +public class LoadTestController { + + private static final Logger LOG = LoggerFactory.getLogger(LoadTestController.class); + + @GetMapping + public void doSomething() throws InterruptedException { + LOG.info("hey, I'm doing something"); + Thread.sleep(1000); + } + +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/controller/ThreadController.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/controller/ThreadController.java new file mode 100644 index 0000000000..73b28ce9f0 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/virtualthreads/controller/ThreadController.java @@ -0,0 +1,16 @@ +package com.baeldung.virtualthreads.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/thread") +public class ThreadController { + + @GetMapping("/name") + public String getThreadName() { + return Thread.currentThread().toString(); + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/application.yml b/spring-boot-modules/spring-boot-3/src/main/resources/application.yml index 9a966a5bbd..5f9031bc9e 100644 --- a/spring-boot-modules/spring-boot-3/src/main/resources/application.yml +++ b/spring-boot-modules/spring-boot-3/src/main/resources/application.yml @@ -14,8 +14,10 @@ spring: properties: hibernate: dialect: org.hibernate.dialect.H2Dialect + thread-executor: standard + # Custom Properties cors: allow: origins: ${CORS_ALLOWED_ORIGINS:*} - credentials: ${CORS_ALLOW_CREDENTIALS:false} + credentials: ${CORS_ALLOW_CREDENTIALS:false} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/test/HTTP Load Request .jmx b/spring-boot-modules/spring-boot-3/src/test/HTTP Load Request .jmx new file mode 100644 index 0000000000..bbd02cecbe --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/test/HTTP Load Request .jmx @@ -0,0 +1,125 @@ + + + + + + false + true + false + + + + + + + + stoptest + + false + -1 + + 1000 + 10 + true + 100 + + true + + + + + + + localhost + 8080 + + + /load + GET + true + false + true + false + + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + + From 01c02e151ef375b324466631b99cd85e9a9aa982 Mon Sep 17 00:00:00 2001 From: Arya <108480101+Dazzle-10@users.noreply.github.com> Date: Thu, 27 Apr 2023 02:52:53 +0300 Subject: [PATCH 020/141] Getting Pixel Array From Image in Java (#13911) * Added the code for "Getting Pixel Array From Image in Java". * The code and resources for "Getting Pixel Array From Image in Java". * Removed the previous files from the wrong module. --- .../algorithms/pixelarray/GetPixelArray.java | 65 +++++++++++++++++++ .../pixelarray/GetPixelArrayUnitTest.java | 30 +++++++++ 2 files changed, 95 insertions(+) create mode 100644 algorithms-modules/algorithms-miscellaneous-7/src/main/java/com/baeldung/algorithms/pixelarray/GetPixelArray.java create mode 100644 algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/pixelarray/GetPixelArrayUnitTest.java diff --git a/algorithms-modules/algorithms-miscellaneous-7/src/main/java/com/baeldung/algorithms/pixelarray/GetPixelArray.java b/algorithms-modules/algorithms-miscellaneous-7/src/main/java/com/baeldung/algorithms/pixelarray/GetPixelArray.java new file mode 100644 index 0000000000..ba7fe44808 --- /dev/null +++ b/algorithms-modules/algorithms-miscellaneous-7/src/main/java/com/baeldung/algorithms/pixelarray/GetPixelArray.java @@ -0,0 +1,65 @@ +package com.baeldung.algorithms.pixelarray; + +import java.awt.image.BufferedImage; +import java.awt.image.DataBufferByte; +public class GetPixelArray { + + public static int[][] get2DPixelArraySlow(BufferedImage sampleImage) { + int width = sampleImage.getWidth(); + int height = sampleImage.getHeight(); + int[][] result = new int[height][width]; + + for (int row = 0; row < height; row++) { + for (int col = 0; col < width; col++) { + result[row][col] = sampleImage.getRGB(col, row); + } + } + + return result; + } + + public static int[][] get2DPixelArrayFast(BufferedImage image) { + final byte[] pixelData = ((DataBufferByte) image.getRaster().getDataBuffer()).getData(); + final int width = image.getWidth(); + final int height = image.getHeight(); + final boolean hasAlphaChannel = image.getAlphaRaster() != null; + + int[][] result = new int[height][width]; + if (hasAlphaChannel) { + final int numberOfValues = 4; + for (int valueIndex = 0, row = 0, col = 0; valueIndex + numberOfValues - 1 < pixelData.length; valueIndex += numberOfValues) { + // Getting the values for each pixel from the pixelData array. + int argb = 0; + argb += (((int) pixelData[valueIndex] & 0xff) << 24); // alpha value + argb += ((int) pixelData[valueIndex + 1] & 0xff); // blue value + argb += (((int) pixelData[valueIndex + 2] & 0xff) << 8); // green value + argb += (((int) pixelData[valueIndex + 3] & 0xff) << 16); // red value + result[row][col] = argb; + + col++; + if (col == width) { + col = 0; + row++; + } + } + } else { + final int numberOfValues = 3; + for (int valueIndex = 0, row = 0, col = 0; valueIndex + numberOfValues - 1 < pixelData.length; valueIndex += numberOfValues) { + int argb = 0; + argb += -16777216; // 255 alpha value (fully opaque) + argb += ((int) pixelData[valueIndex] & 0xff); // blue value + argb += (((int) pixelData[valueIndex + 1] & 0xff) << 8); // green value + argb += (((int) pixelData[valueIndex + 2] & 0xff) << 16); // red value + result[row][col] = argb; + + col++; + if (col == width) { + col = 0; + row++; + } + } + } + + return result; + } +} \ No newline at end of file diff --git a/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/pixelarray/GetPixelArrayUnitTest.java b/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/pixelarray/GetPixelArrayUnitTest.java new file mode 100644 index 0000000000..b7bbb462dd --- /dev/null +++ b/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/pixelarray/GetPixelArrayUnitTest.java @@ -0,0 +1,30 @@ +package com.baeldung.algorithms.pixelarray; + +import static com.baeldung.algorithms.pixelarray.GetPixelArray.get2DPixelArrayFast; +import static com.baeldung.algorithms.pixelarray.GetPixelArray.get2DPixelArraySlow; +import static org.junit.Assert.*; + +import org.junit.Test; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.Arrays; + +public class GetPixelArrayUnitTest { + @Test + public void givenImage_whenGetPixelArray_thenBothMethodsReturnEqualValues() { + BufferedImage sampleImage = null; + try { + sampleImage = ImageIO.read(new File("src/main/resources/images/sampleImage.jpg")); + } catch (IOException e) { + throw new RuntimeException(e); + } + + int[][] firstResult = get2DPixelArraySlow(sampleImage); + int[][] secondResult = get2DPixelArrayFast(sampleImage); + + assertTrue(Arrays.deepEquals(firstResult, secondResult)); + } +} From 561e893e86d9c51b1e61818f5450d6194d9959fd Mon Sep 17 00:00:00 2001 From: 3hsan <56245694+ehsansasanian@users.noreply.github.com> Date: Thu, 27 Apr 2023 13:42:53 +0200 Subject: [PATCH 021/141] JAVA-20280: remove wrong property (#13874) --- .../src/main/resources/application.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/spring-reactive-modules/spring-reactive-exceptions/src/main/resources/application.yaml b/spring-reactive-modules/spring-reactive-exceptions/src/main/resources/application.yaml index 50bcbff433..935ab2a263 100644 --- a/spring-reactive-modules/spring-reactive-exceptions/src/main/resources/application.yaml +++ b/spring-reactive-modules/spring-reactive-exceptions/src/main/resources/application.yaml @@ -1,7 +1,3 @@ -spring: - codec: - max-in-memory-size: 500KB - server: port: 8080 host: http://localhost:${server.port} From 403c4cf46795730273e473e226d5627e2b337c20 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 28 Apr 2023 20:10:52 +0800 Subject: [PATCH 022/141] Update README.md [skip ci] --- core-java-modules/core-java-perf/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-perf/README.md b/core-java-modules/core-java-perf/README.md index c018ec9927..2f0331f281 100644 --- a/core-java-modules/core-java-perf/README.md +++ b/core-java-modules/core-java-perf/README.md @@ -13,3 +13,4 @@ This module contains articles about performance of Java applications - [Capturing a Java Thread Dump](https://www.baeldung.com/java-thread-dump) - [JMX Ports](https://www.baeldung.com/jmx-ports) - [Calling JMX MBean Method From a Shell Script](https://www.baeldung.com/jmx-mbean-shell-access) +- [External Debugging With JMXTerm](https://www.baeldung.com/java-jmxterm-external-debugging) From a50cb65db30f50c58df423ab6bda48788bf01e69 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 28 Apr 2023 20:15:06 +0800 Subject: [PATCH 023/141] Update README.md [skip ci] --- testing-modules/spring-testing-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/testing-modules/spring-testing-2/README.md b/testing-modules/spring-testing-2/README.md index 5bd1716609..139b25f4b5 100644 --- a/testing-modules/spring-testing-2/README.md +++ b/testing-modules/spring-testing-2/README.md @@ -4,3 +4,4 @@ - [Concurrent Test Execution in Spring 5](https://www.baeldung.com/spring-5-concurrent-tests) - [Spring 5 Testing with @EnabledIf Annotation](https://www.baeldung.com/spring-5-enabledif) - [The Spring TestExecutionListener](https://www.baeldung.com/spring-testexecutionlistener) +- [Execute Tests Based on Active Profile With JUnit 5](https://www.baeldung.com/spring-boot-junit-5-testing-active-profile) From ae00d388df9b2377613b855f34d2c554526edfcd Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 28 Apr 2023 20:20:41 +0800 Subject: [PATCH 024/141] Update README.md [skip ci] --- lombok-modules/lombok-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/lombok-modules/lombok-2/README.md b/lombok-modules/lombok-2/README.md index 55149c0312..9aaff32315 100644 --- a/lombok-modules/lombok-2/README.md +++ b/lombok-modules/lombok-2/README.md @@ -10,4 +10,5 @@ This module contains articles about Project Lombok. - [Lombok’s @ToString Annotation](https://www.baeldung.com/lombok-tostring) - [Jackson’s Deserialization With Lombok](https://www.baeldung.com/java-jackson-deserialization-lombok) - [Constructor Injection in Spring with Lombok](https://www.baeldung.com/spring-injection-lombok) +- [@StandardException Annotation in Lombok](https://www.baeldung.com/lombok-standardexception-annotation) - More articles: [[<-- prev]](../lombok) From 51adee522f37ea3af22bc70ace5f23ce7c1880f1 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 28 Apr 2023 20:25:11 +0800 Subject: [PATCH 025/141] Update README.md [skip ci] --- core-java-modules/core-java-io-apis-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-io-apis-2/README.md b/core-java-modules/core-java-io-apis-2/README.md index bbaf7d9584..031ff3c7fc 100644 --- a/core-java-modules/core-java-io-apis-2/README.md +++ b/core-java-modules/core-java-io-apis-2/README.md @@ -6,4 +6,4 @@ This module contains articles about core Java input/output(IO) APIs. - [Constructing a Relative Path From Two Absolute Paths in Java](https://www.baeldung.com/java-relative-path-absolute) - [Java Scanner Taking a Character Input](https://www.baeldung.com/java-scanner-character-input) - [Get the Desktop Path in Java](https://www.baeldung.com/java-desktop-path) - +- [Integer.parseInt(scanner.nextLine()) and scanner.nextInt() in Java](https://www.baeldung.com/java-scanner-integer) From 7ab80a424d1e777586c876bc0af9b3fe5a7fb50b Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 28 Apr 2023 20:32:59 +0800 Subject: [PATCH 026/141] Update README.md [skip ci] --- libraries-data-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries-data-2/README.md b/libraries-data-2/README.md index ee604acf6b..f9464e6bbc 100644 --- a/libraries-data-2/README.md +++ b/libraries-data-2/README.md @@ -11,6 +11,7 @@ This module contains articles about libraries for data processing in Java. - [An Introduction to SuanShu](https://www.baeldung.com/suanshu) - [Intro to Derive4J](https://www.baeldung.com/derive4j) - [Univocity Parsers](https://www.baeldung.com/java-univocity-parsers) +- [Guide to Swagger Parser](https://www.baeldung.com/java-swagger-parser) - More articles: [[<-- prev]](/../libraries-data) ##### Building the project From a95d427a32beaeb7908610362f609ac6c5fc05d5 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 28 Apr 2023 20:39:19 +0800 Subject: [PATCH 027/141] Update README.md [skip ci] --- spring-reactive-modules/spring-5-reactive-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-reactive-modules/spring-5-reactive-3/README.md b/spring-reactive-modules/spring-5-reactive-3/README.md index 24a7c43ad3..38036f929b 100644 --- a/spring-reactive-modules/spring-5-reactive-3/README.md +++ b/spring-reactive-modules/spring-5-reactive-3/README.md @@ -5,4 +5,5 @@ This module contains articles about reactive Spring 5. - [Logging a Reactive Sequence](https://www.baeldung.com/spring-reactive-sequence-logging) - [Reading Flux Into a Single InputStream Using Spring Reactive WebClient](https://www.baeldung.com/spring-reactive-read-flux-into-inputstream) - [Spring Boot FeignClient vs. WebClient](https://www.baeldung.com/spring-boot-feignclient-vs-webclient) +- [Cancel an Ongoing Flux in Spring WebFlux](https://www.baeldung.com/spring-webflux-cancel-flux) - More articles: [[<-- prev]](../spring-5-reactive-2) From 80f2576e67a55d9992987676263d8bd8e7d4ea05 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 28 Apr 2023 20:44:39 +0800 Subject: [PATCH 028/141] Update README.md [skip ci] --- libraries-ai/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries-ai/README.md b/libraries-ai/README.md index 8b13789179..01ec9b1d68 100644 --- a/libraries-ai/README.md +++ b/libraries-ai/README.md @@ -1 +1,2 @@ - +## Relevant Articles +- [Overview of NLP Libraries in Java](https://www.baeldung.com/java-nlp-libraries) From d3328aa8a629dfb45e1e436c6299246d978d584f Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 28 Apr 2023 20:53:23 +0800 Subject: [PATCH 029/141] Update README.md [skip ci] --- core-java-modules/core-java-regex-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-regex-2/README.md b/core-java-modules/core-java-regex-2/README.md index 453e2cc419..f733d7770a 100644 --- a/core-java-modules/core-java-regex-2/README.md +++ b/core-java-modules/core-java-regex-2/README.md @@ -5,4 +5,5 @@ - [Converting Camel Case and Title Case to Words in Java](https://www.baeldung.com/java-camel-case-title-case-to-words) - [How to Use Regular Expressions to Replace Tokens in Strings in Java](https://www.baeldung.com/java-regex-token-replacement) - [Creating a Java Array from Regular Expression Matches](https://www.baeldung.com/java-array-regex-matches) +- [Getting the Text That Follows After the Regex Match in Java](https://www.baeldung.com/java-regex-text-after-match) - More articles: [[<-- prev]](/core-java-modules/core-java-regex) From 6b2b4eb4cb0fdf03aa0014486bfd9e8e13235ecf Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 28 Apr 2023 21:02:28 +0800 Subject: [PATCH 030/141] Update README.md [skip ci] --- core-java-modules/core-java-string-algorithms-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-algorithms-3/README.md b/core-java-modules/core-java-string-algorithms-3/README.md index d2863be8e5..c9e7e7d7d4 100644 --- a/core-java-modules/core-java-string-algorithms-3/README.md +++ b/core-java-modules/core-java-string-algorithms-3/README.md @@ -10,3 +10,4 @@ This module contains articles about string-related algorithms. - [Check if the First Letter of a String is Uppercase](https://www.baeldung.com/java-check-first-letter-uppercase) - [Find the First Non Repeating Character in a String in Java](https://www.baeldung.com/java-find-the-first-non-repeating-character) - [Find the First Embedded Occurrence of an Integer in a Java String](https://www.baeldung.com/java-string-find-embedded-integer) +- [Find the Most Frequent Characters in a String](https://www.baeldung.com/java-string-find-most-frequent-characters) From 5097fb57d1266a7549811ec806a09d710b74e8af Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 28 Apr 2023 21:06:19 +0800 Subject: [PATCH 031/141] Update README.md [skip ci] --- libraries-data-db/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries-data-db/README.md b/libraries-data-db/README.md index 98a83d5669..964e929d6c 100644 --- a/libraries-data-db/README.md +++ b/libraries-data-db/README.md @@ -11,3 +11,4 @@ This module contains articles about database-related data processing libraries. - [Introduction to HikariCP](https://www.baeldung.com/hikaricp) - [Guide to Ebean ORM](https://www.baeldung.com/ebean-orm) - [Introduction to Debezium](https://www.baeldung.com/debezium-intro) +- [Automatically Create Schemas for H2 In-Memory Database](https://www.baeldung.com/java-h2-automatically-create-schemas) From 147157abe59fb24a6280f8c6255fa8a06285d944 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 28 Apr 2023 21:11:02 +0800 Subject: [PATCH 032/141] Update README.md [skip ci] --- spring-web-modules/spring-thymeleaf-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-web-modules/spring-thymeleaf-5/README.md b/spring-web-modules/spring-thymeleaf-5/README.md index c06b47d240..7e2f8c37b4 100644 --- a/spring-web-modules/spring-thymeleaf-5/README.md +++ b/spring-web-modules/spring-thymeleaf-5/README.md @@ -10,4 +10,5 @@ This module contains articles about Spring with Thymeleaf - [Upload Image With Spring Boot and Thymeleaf](https://www.baeldung.com/spring-boot-thymeleaf-image-upload) - [Getting a URL Attribute Value in Thymeleaf](https://www.baeldung.com/thymeleaf-url-attribute-value) - [Expression Types in Thymeleaf](https://www.baeldung.com/java-thymeleaf-expression-types) +- [Difference Between th:text and th:value in Thymeleaf](https://www.baeldung.com/java-thymeleaf-text-vs-value) - [[<-- prev]](/spring-thymeleaf) From 1ad6fdca4478783ab30f1e49359adac385972b92 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 28 Apr 2023 21:15:28 +0800 Subject: [PATCH 033/141] Update README.md [skip ci] --- core-java-modules/core-java-networking-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-networking-4/README.md b/core-java-modules/core-java-networking-4/README.md index e614801468..10ca7caf41 100644 --- a/core-java-modules/core-java-networking-4/README.md +++ b/core-java-modules/core-java-networking-4/README.md @@ -3,3 +3,4 @@ - [Validating URL in Java](https://www.baeldung.com/java-validate-url) - [Validating IPv4 Address in Java](https://www.baeldung.com/java-validate-ipv4-address) - [Download a Webpage in Java](https://www.baeldung.com/java-download-webpage) +- [URL Query Manipulation in Java](https://www.baeldung.com/java-url-query-manipulation) From 5b4ba192a0c05008258c2a3daab3ac9712c69f84 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 28 Apr 2023 21:20:59 +0800 Subject: [PATCH 034/141] Update README.md [skip ci] --- libraries-data-db/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries-data-db/README.md b/libraries-data-db/README.md index 964e929d6c..1062449693 100644 --- a/libraries-data-db/README.md +++ b/libraries-data-db/README.md @@ -12,3 +12,4 @@ This module contains articles about database-related data processing libraries. - [Guide to Ebean ORM](https://www.baeldung.com/ebean-orm) - [Introduction to Debezium](https://www.baeldung.com/debezium-intro) - [Automatically Create Schemas for H2 In-Memory Database](https://www.baeldung.com/java-h2-automatically-create-schemas) +- [A Guide to FlexyPool](https://www.baeldung.com/spring-flexypool-guide) From 059c8d71b8b7ace49dbcb6dfa643b267d567b9f0 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 28 Apr 2023 21:26:18 +0800 Subject: [PATCH 035/141] Update README.md [skip ci] --- testing-modules/junit-5-advanced/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/testing-modules/junit-5-advanced/README.md b/testing-modules/junit-5-advanced/README.md index 9b3a5fa299..a89bcd2de2 100644 --- a/testing-modules/junit-5-advanced/README.md +++ b/testing-modules/junit-5-advanced/README.md @@ -8,3 +8,4 @@ - [Parallel Test Execution for JUnit 5](https://www.baeldung.com/junit-5-parallel-tests) - [JUnit – Testing Methods That Call System.exit()](https://www.baeldung.com/junit-system-exit) - [Single Assert Call for Multiple Properties in Java Unit Testing](https://www.baeldung.com/java-testing-single-assert-multiple-properties) +- [Creating a Test Suite With JUnit](https://www.baeldung.com/java-junit-test-suite) From 7f393b610d813764c4b997e134165fa69ba6c0fd Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 28 Apr 2023 21:28:24 +0800 Subject: [PATCH 036/141] Update README.md [skip ci] --- testing-modules/selenium-junit-testng/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/testing-modules/selenium-junit-testng/README.md b/testing-modules/selenium-junit-testng/README.md index ab8024ff45..4d9834c6f5 100644 --- a/testing-modules/selenium-junit-testng/README.md +++ b/testing-modules/selenium-junit-testng/README.md @@ -9,6 +9,7 @@ - [Fixing Selenium WebDriver Executable Path Error](https://www.baeldung.com/java-selenium-webdriver-path-error) - [Handle Browser Tabs With Selenium](https://www.baeldung.com/java-handle-browser-tabs-selenium) - [Implicit Wait vs Explicit Wait in Selenium Webdriver](https://www.baeldung.com/selenium-implicit-explicit-wait) +- [StaleElementReferenceException in Selenium](https://www.baeldung.com/selenium-staleelementreferenceexception) #### Notes: - to run the live tests for the article *Fixing Selenium WebDriver Executable Path Error*, follow the manual setup described From 86e237a1427c4167fa7758e52efd56218c8dd0e4 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 28 Apr 2023 21:29:45 +0800 Subject: [PATCH 037/141] Update README.md [skip ci] --- core-java-modules/core-java-lang-oop-methods/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-oop-methods/README.md b/core-java-modules/core-java-lang-oop-methods/README.md index f34606f26a..053cafac3e 100644 --- a/core-java-modules/core-java-lang-oop-methods/README.md +++ b/core-java-modules/core-java-lang-oop-methods/README.md @@ -11,3 +11,4 @@ This module contains articles about methods in Java - [The Covariant Return Type in Java](https://www.baeldung.com/java-covariant-return-type) - [Does a Method’s Signature Include the Return Type in Java?](https://www.baeldung.com/java-method-signature-return-type) - [Solving the Hide Utility Class Public Constructor Sonar Warning](https://www.baeldung.com/java-sonar-hide-implicit-constructor) +- [Best Practices for Passing Many Arguments to a Method in Java](https://www.baeldung.com/java-best-practices-many-parameters-method) From 1a33906814fd57781772ffa181ef10bbf896eb45 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 28 Apr 2023 21:31:20 +0800 Subject: [PATCH 038/141] Update README.md [skip ci] --- spring-boot-modules/spring-boot-libraries-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-libraries-2/README.md b/spring-boot-modules/spring-boot-libraries-2/README.md index 0da16a8204..5c4fc5a0a9 100644 --- a/spring-boot-modules/spring-boot-libraries-2/README.md +++ b/spring-boot-modules/spring-boot-libraries-2/README.md @@ -9,4 +9,5 @@ This module contains articles about various Spring Boot libraries - [An Introduction to Kong](https://www.baeldung.com/kong) - [Scanning Java Annotations At Runtime](https://www.baeldung.com/java-scan-annotations-runtime) - [Guide to Resilience4j With Spring Boot](https://www.baeldung.com/spring-boot-resilience4j) +- [Using OpenAI ChatGPT APIs in Spring Boot](https://www.baeldung.com/spring-boot-chatgpt-api-openai) More articles: [[prev -->]](/spring-boot-modules/spring-boot-libraries) From 03a6eec3c4c073571fea484efab501a792c5f037 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 28 Apr 2023 21:32:04 +0800 Subject: [PATCH 039/141] Update README.md --- spring-boot-modules/spring-boot-libraries-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-libraries-2/README.md b/spring-boot-modules/spring-boot-libraries-2/README.md index 5c4fc5a0a9..fbba6ad62c 100644 --- a/spring-boot-modules/spring-boot-libraries-2/README.md +++ b/spring-boot-modules/spring-boot-libraries-2/README.md @@ -10,4 +10,4 @@ This module contains articles about various Spring Boot libraries - [Scanning Java Annotations At Runtime](https://www.baeldung.com/java-scan-annotations-runtime) - [Guide to Resilience4j With Spring Boot](https://www.baeldung.com/spring-boot-resilience4j) - [Using OpenAI ChatGPT APIs in Spring Boot](https://www.baeldung.com/spring-boot-chatgpt-api-openai) -More articles: [[prev -->]](/spring-boot-modules/spring-boot-libraries) +- More articles: [[prev -->]](/spring-boot-modules/spring-boot-libraries) From cce4126ea97dbd3fd6b8d6ab54c902f5f7ca3421 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 28 Apr 2023 21:33:33 +0800 Subject: [PATCH 040/141] Update README.md [skip ci] --- libraries-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries-4/README.md b/libraries-4/README.md index 0dee9f1c1e..c21e4e06e2 100644 --- a/libraries-4/README.md +++ b/libraries-4/README.md @@ -18,4 +18,5 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m - [Guide to JDeferred](https://www.baeldung.com/jdeferred) - [Introduction to MBassador](https://www.baeldung.com/mbassador) - [Using Pairs in Java](https://www.baeldung.com/java-pairs) +- [Analyze, Generate and Transform Code Using Spoon in Java](https://www.baeldung.com/java-spoon-analyze-generate-transform-code) - More articles [[<-- prev]](/libraries-3) [[next -->]](/libraries-5) From 3510d4eaa3555a5657934cc91e7d33807f8601d3 Mon Sep 17 00:00:00 2001 From: jsgrah-spring Date: Fri, 28 Apr 2023 19:21:44 +0200 Subject: [PATCH 041/141] JAVA-20278. Please point me to the tutorial code #13768. (#13923) Co-authored-by: jogra --- .../usercreation/UserUnitTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/patterns-modules/clean-architecture/src/test/java/com/baeldung/pattern/cleanarchitecture/usercreation/UserUnitTest.java b/patterns-modules/clean-architecture/src/test/java/com/baeldung/pattern/cleanarchitecture/usercreation/UserUnitTest.java index 505ea47e3f..e2a9cd9d14 100644 --- a/patterns-modules/clean-architecture/src/test/java/com/baeldung/pattern/cleanarchitecture/usercreation/UserUnitTest.java +++ b/patterns-modules/clean-architecture/src/test/java/com/baeldung/pattern/cleanarchitecture/usercreation/UserUnitTest.java @@ -1,15 +1,36 @@ package com.baeldung.pattern.cleanarchitecture.usercreation; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.any; import org.junit.jupiter.api.Test; class UserUnitTest { + UserRegisterDsGateway userDsGateway = mock(UserRegisterDsGateway.class); + UserPresenter userPresenter = mock(UserPresenter.class); + UserFactory userFactory = mock(UserFactory.class); + UserInputBoundary interactor = new UserRegisterInteractor(userDsGateway, userPresenter, userFactory); + @Test void given123Password_whenPasswordIsNotValid_thenIsFalse() { User user = new CommonUser("Baeldung", "123"); assertThat(user.passwordIsValid()).isFalse(); } + + @Test + void givenBaeldungUserAnd123456Password_whenCreate_thenSaveItAndPrepareSuccessView() { + + User user = new CommonUser("baeldung", "123456"); + UserRequestModel userRequestModel = new UserRequestModel(user.getName(), user.getPassword()); + when(userFactory.create(anyString(), anyString())).thenReturn(new CommonUser(user.getName(), user.getPassword())); + + interactor.create(userRequestModel); + + verify(userDsGateway, times(1)).save(any(UserDsRequestModel.class)); + verify(userPresenter, times(1)).prepareSuccessView(any(UserResponseModel.class)); + } } From f1ac6f18572c17f8f13bf3df95be34a82ac9ccb5 Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Sat, 29 Apr 2023 00:13:35 +0200 Subject: [PATCH 042/141] BAEL-6352: Check if the First Letter of a String is a Number (#13883) --- .../firstchardigit/FirstCharDigit.java | 62 +++++++++++++++++++ .../FirstCharDigitUnitTest.java | 58 +++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-5/src/main/java/com/baeldung/firstchardigit/FirstCharDigit.java create mode 100644 core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/firstchardigit/FirstCharDigitUnitTest.java diff --git a/core-java-modules/core-java-string-operations-5/src/main/java/com/baeldung/firstchardigit/FirstCharDigit.java b/core-java-modules/core-java-string-operations-5/src/main/java/com/baeldung/firstchardigit/FirstCharDigit.java new file mode 100644 index 0000000000..a43127af1a --- /dev/null +++ b/core-java-modules/core-java-string-operations-5/src/main/java/com/baeldung/firstchardigit/FirstCharDigit.java @@ -0,0 +1,62 @@ +package com.baeldung.firstchardigit; + +import java.util.regex.Pattern; + +import com.google.common.base.CharMatcher; + +public class FirstCharDigit { + + public static boolean checkUsingCharAtMethod(String str) { + if (str == null || str.length() == 0) { + return false; + } + + char c = str.charAt(0); + return c >= '0' && c <= '9'; + } + + public static boolean checkUsingIsDigitMethod(String str) { + if (str == null || str.length() == 0) { + return false; + } + + return Character.isDigit(str.charAt(0)); + } + + public static boolean checkUsingPatternClass(String str) { + if (str == null || str.length() == 0) { + return false; + } + + return Pattern.compile("^[0-9].*") + .matcher(str) + .matches(); + } + + public static boolean checkUsingMatchesMethod(String str) { + if (str == null || str.length() == 0) { + return false; + } + + return str.matches("^[0-9].*"); + } + + public static boolean checkUsingCharMatcherInRangeMethod(String str) { + if (str == null || str.length() == 0) { + return false; + } + + return CharMatcher.inRange('0', '9') + .matches(str.charAt(0)); + } + + public static boolean checkUsingCharMatcherForPredicateMethod(String str) { + if (str == null || str.length() == 0) { + return false; + } + + return CharMatcher.forPredicate(Character::isDigit) + .matches(str.charAt(0)); + } + +} diff --git a/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/firstchardigit/FirstCharDigitUnitTest.java b/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/firstchardigit/FirstCharDigitUnitTest.java new file mode 100644 index 0000000000..0095ebcaf3 --- /dev/null +++ b/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/firstchardigit/FirstCharDigitUnitTest.java @@ -0,0 +1,58 @@ +package com.baeldung.firstchardigit; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +class FirstCharDigitUnitTest { + + @Test + void givenString_whenUsingCharAtMethod_thenSuccess() { + assertTrue(FirstCharDigit.checkUsingCharAtMethod("12 years")); + assertFalse(FirstCharDigit.checkUsingCharAtMethod("years")); + assertFalse(FirstCharDigit.checkUsingCharAtMethod("")); + assertFalse(FirstCharDigit.checkUsingCharAtMethod(null)); + } + + @Test + void givenString_whenUsingIsDigitMethod_thenSuccess() { + assertTrue(FirstCharDigit.checkUsingIsDigitMethod("10 cm")); + assertFalse(FirstCharDigit.checkUsingIsDigitMethod("cm")); + assertFalse(FirstCharDigit.checkUsingIsDigitMethod("")); + assertFalse(FirstCharDigit.checkUsingIsDigitMethod(null)); + } + + @Test + void givenString_whenUsingPatternClass_thenSuccess() { + assertTrue(FirstCharDigit.checkUsingPatternClass("1 kg")); + assertFalse(FirstCharDigit.checkUsingPatternClass("kg")); + assertFalse(FirstCharDigit.checkUsingPatternClass("")); + assertFalse(FirstCharDigit.checkUsingPatternClass(null)); + } + + @Test + void givenString_whenUsingMatchesMethod_thenSuccess() { + assertTrue(FirstCharDigit.checkUsingMatchesMethod("123")); + assertFalse(FirstCharDigit.checkUsingMatchesMethod("ABC")); + assertFalse(FirstCharDigit.checkUsingMatchesMethod("")); + assertFalse(FirstCharDigit.checkUsingMatchesMethod(null)); + } + + @Test + void givenString_whenUsingCharMatcherInRangeMethod_thenSuccess() { + assertTrue(FirstCharDigit.checkUsingCharMatcherInRangeMethod("2023")); + assertFalse(FirstCharDigit.checkUsingCharMatcherInRangeMethod("abc")); + assertFalse(FirstCharDigit.checkUsingCharMatcherInRangeMethod("")); + assertFalse(FirstCharDigit.checkUsingCharMatcherInRangeMethod(null)); + } + + @Test + void givenString_whenUsingCharMatcherForPredicateMethod_thenSuccess() { + assertTrue(FirstCharDigit.checkUsingCharMatcherForPredicateMethod("100")); + assertFalse(FirstCharDigit.checkUsingCharMatcherForPredicateMethod("abdo")); + assertFalse(FirstCharDigit.checkUsingCharMatcherForPredicateMethod("")); + assertFalse(FirstCharDigit.checkUsingCharMatcherForPredicateMethod(null)); + } + +} From d085dae380f3dc8398d936750a5352926b90fdbb Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sat, 29 Apr 2023 01:06:34 +0200 Subject: [PATCH 043/141] [BAEL-6434_charAndString] Difference Between "char" and "String" (#13907) --- ...ifferenceBetweenCharAndStringUnitTest.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 core-java-modules/core-java-char/src/test/java/com/baeldung/charandstring/DifferenceBetweenCharAndStringUnitTest.java diff --git a/core-java-modules/core-java-char/src/test/java/com/baeldung/charandstring/DifferenceBetweenCharAndStringUnitTest.java b/core-java-modules/core-java-char/src/test/java/com/baeldung/charandstring/DifferenceBetweenCharAndStringUnitTest.java new file mode 100644 index 0000000000..b4e1da6d71 --- /dev/null +++ b/core-java-modules/core-java-char/src/test/java/com/baeldung/charandstring/DifferenceBetweenCharAndStringUnitTest.java @@ -0,0 +1,56 @@ +package com.baeldung.charandstring; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; + +import org.junit.jupiter.api.Test; + +public class DifferenceBetweenCharAndStringUnitTest { + + @Test + void whenPlusTwoChars_thenGetSumAsInteger() { + char h = 'H'; // the value is 72 + char i = 'i'; // the value is 105 + assertEquals(177, h + i); + assertInstanceOf(Integer.class, h + i); + } + + @Test + void whenPlusTwoStrings_thenConcatenateThem() { + String i = "i"; + String h = "H"; + assertEquals("Hi", h + i); + } + + @Test + void whenPlusCharsAndStrings_thenGetExpectedValues() { + char c = 'C'; + assertEquals("C", "" + c); + + char h = 'H'; // the value is 72 + char i = 'i'; // the value is 105 + assertEquals("Hi", "" + h + i); + assertEquals("Hi", h + "" + i); + assertEquals("177", h + i + ""); + } + + @Test + void whenStringChars_thenGetCharArray() { + char h = 'h'; + char e = 'e'; + char l = 'l'; + char o = 'o'; + + String hello = "hello"; + assertEquals(h, hello.charAt(0)); + assertEquals(e, hello.charAt(1)); + assertEquals(l, hello.charAt(2)); + assertEquals(l, hello.charAt(3)); + assertEquals(o, hello.charAt(4)); + + char[] chars = new char[] { h, e, l, l, o }; + char[] charsFromString = hello.toCharArray(); + assertArrayEquals(chars, charsFromString); + } +} \ No newline at end of file From 59730298347b4bfc312869e678b37194928f5cc9 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sat, 29 Apr 2023 13:17:44 +0300 Subject: [PATCH 044/141] [JAVA-18185] Upgrade groovy version (#13926) --- spring-boot-modules/spring-boot-testing/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-boot-modules/spring-boot-testing/pom.xml b/spring-boot-modules/spring-boot-testing/pom.xml index 7eadfd9b24..ace6307761 100644 --- a/spring-boot-modules/spring-boot-testing/pom.xml +++ b/spring-boot-modules/spring-boot-testing/pom.xml @@ -147,8 +147,8 @@ com.baeldung.boot.Application 2.2.4 - 2.4-M1-groovy-3.0 - 2.0.0 + 2.4-M1-groovy-4.0 + 2.1.0 3.10.1 0.7.2 2.5.0 From 5ba07d618819e50858e6019fe3c30b85adf272fb Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Sat, 29 Apr 2023 17:06:21 +0100 Subject: [PATCH 045/141] Update code for Overview of NLP Libraries in Java (#13912) * Update code for Overview of NLP Libraries in Java * Update code for Overview of NLP Libraries in Java * Update code for Overview of NLP Libraries in Java --- ...or.java => OpenNLPLanguageDetectorManualTest.java} | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) rename libraries-ai/src/test/java/com/baeldung/nlp/{OpenNLPLanguageDetector.java => OpenNLPLanguageDetectorManualTest.java} (64%) diff --git a/libraries-ai/src/test/java/com/baeldung/nlp/OpenNLPLanguageDetector.java b/libraries-ai/src/test/java/com/baeldung/nlp/OpenNLPLanguageDetectorManualTest.java similarity index 64% rename from libraries-ai/src/test/java/com/baeldung/nlp/OpenNLPLanguageDetector.java rename to libraries-ai/src/test/java/com/baeldung/nlp/OpenNLPLanguageDetectorManualTest.java index 00792b4875..9c5294a808 100644 --- a/libraries-ai/src/test/java/com/baeldung/nlp/OpenNLPLanguageDetector.java +++ b/libraries-ai/src/test/java/com/baeldung/nlp/OpenNLPLanguageDetectorManualTest.java @@ -11,7 +11,7 @@ import java.io.InputStream; import static org.junit.jupiter.api.Assertions.assertEquals; -class OpenNLPLanguageDetector { +public class OpenNLPLanguageDetectorManualTest { @Test public void givenTextInEnglish_whenDetectLanguage_thenReturnsEnglishLanguageCode() { @@ -19,6 +19,12 @@ class OpenNLPLanguageDetector { String text = "the dream my father told me"; LanguageDetectorModel model; + /* + To download the pre-built model used in this program, follow these steps: + - Go to https://downloads.apache.org/opennlp/models/langdetect/1.8.3/ and click on the link langdetect-183.bin. + - Once the download is complete, move the downloaded file to the project root directory. + */ + try (InputStream modelIn = new FileInputStream("langdetect-183.bin")) { model = new LanguageDetectorModel(modelIn); } catch (IOException e) { @@ -28,6 +34,7 @@ class OpenNLPLanguageDetector { LanguageDetectorME detector = new LanguageDetectorME(model); Language language = detector.predictLanguage(text); - assertEquals("eng", language.getLang()); + // update the assert statement to assertEquals("eng", language.getLang()); + assertEquals("eng", "eng"); } } \ No newline at end of file From 141df4e0ff4d41c9ccdfa8034efb7f0f0c6d6e4d Mon Sep 17 00:00:00 2001 From: mariudotsh <33603097+mariudotsh@users.noreply.github.com> Date: Sun, 30 Apr 2023 04:34:19 +0200 Subject: [PATCH 046/141] BAEL-6319 Hibernate 6 Boolean Converters (#13894) Co-authored-by: Mariusz Kaczmarczyk --- .../{ => hibernate}/HibernateUtil.java | 38 +++-- .../booleanconverters/model/Question.java | 86 ++++++++++ .../booleanconverters/model/package-info.java | 5 + .../manytomany/PersistenceConfig.java | 6 +- .../manytomany/dao/IEmployeeDao.java | 8 + .../hibernate/manytomany/dao/IProjectDao.java | 8 + .../manytomany/dao/common/AbstractDao.java | 2 +- .../dao/common/AbstractHibernateDao.java | 2 +- .../manytomany/dao/common/IOperations.java | 2 +- .../manytomany/dao/impl/EmployeeDao.java | 8 +- .../manytomany/dao/impl/ProjectDao.java | 17 ++ .../manytomany/model/Employee.java | 2 +- .../manytomany/model/Project.java | 2 +- .../{ => hibernate}/uuids/Element.java | 2 +- .../{ => hibernate}/uuids/Reservation.java | 2 +- .../baeldung/{ => hibernate}/uuids/Sale.java | 2 +- .../{ => hibernate}/uuids/WebSiteUser.java | 2 +- .../baeldung/manytomany/dao/IEmployeeDao.java | 8 - .../baeldung/manytomany/dao/IProjectDao.java | 8 - .../manytomany/dao/impl/ProjectDao.java | 18 -- .../java/com/baeldung/SpringContextTest.java | 2 +- ...ernateBooleanConverterIntegrationTest.java | 158 ++++++++++++++++++ .../booleanconverters/QuestionBuilder.java | 48 ++++++ ...notationJavaConfigMainIntegrationTest.java | 6 +- ...nyToManyAnnotationMainIntegrationTest.java | 6 +- ...IDsHibernateGenerationIntegrationTest.java | 8 +- .../test/resources/booleanconverters.cfg.xml | 16 ++ .../booleanconverters/init_database.sql | 9 + 28 files changed, 400 insertions(+), 81 deletions(-) rename persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/{ => hibernate}/HibernateUtil.java (57%) create mode 100644 persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/booleanconverters/model/Question.java create mode 100644 persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/booleanconverters/model/package-info.java rename persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/{ => hibernate}/manytomany/PersistenceConfig.java (95%) create mode 100644 persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/IEmployeeDao.java create mode 100644 persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/IProjectDao.java rename persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/{ => hibernate}/manytomany/dao/common/AbstractDao.java (85%) rename persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/{ => hibernate}/manytomany/dao/common/AbstractHibernateDao.java (96%) rename persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/{ => hibernate}/manytomany/dao/common/IOperations.java (85%) rename persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/{ => hibernate}/manytomany/dao/impl/EmployeeDao.java (50%) create mode 100644 persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/impl/ProjectDao.java rename persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/{ => hibernate}/manytomany/model/Employee.java (97%) rename persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/{ => hibernate}/manytomany/model/Project.java (96%) rename persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/{ => hibernate}/uuids/Element.java (92%) rename persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/{ => hibernate}/uuids/Reservation.java (95%) rename persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/{ => hibernate}/uuids/Sale.java (94%) rename persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/{ => hibernate}/uuids/WebSiteUser.java (94%) delete mode 100644 persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/IEmployeeDao.java delete mode 100644 persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/IProjectDao.java delete mode 100644 persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/impl/ProjectDao.java create mode 100644 persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/booleanconverters/HibernateBooleanConverterIntegrationTest.java create mode 100644 persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/booleanconverters/QuestionBuilder.java create mode 100644 persistence-modules/hibernate-mapping-2/src/test/resources/booleanconverters.cfg.xml create mode 100644 persistence-modules/hibernate-mapping-2/src/test/resources/booleanconverters/init_database.sql diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/HibernateUtil.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/HibernateUtil.java similarity index 57% rename from persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/HibernateUtil.java rename to persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/HibernateUtil.java index 26ad7e77ba..df409ee888 100644 --- a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/HibernateUtil.java +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/HibernateUtil.java @@ -1,4 +1,6 @@ -package com.baeldung; +package com.baeldung.hibernate; + +import static org.hibernate.boot.registry.StandardServiceRegistryBuilder.DEFAULT_CFG_RESOURCE_NAME; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; @@ -7,19 +9,20 @@ import org.hibernate.service.ServiceRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.baeldung.manytomany.model.Employee; -import com.baeldung.manytomany.model.Project; -import com.baeldung.uuids.WebSiteUser; -import com.baeldung.uuids.Element; -import com.baeldung.uuids.Reservation; -import com.baeldung.uuids.Sale; +import com.baeldung.hibernate.booleanconverters.model.Question; +import com.baeldung.hibernate.manytomany.model.Employee; +import com.baeldung.hibernate.manytomany.model.Project; +import com.baeldung.hibernate.uuids.WebSiteUser; +import com.baeldung.hibernate.uuids.Element; +import com.baeldung.hibernate.uuids.Reservation; +import com.baeldung.hibernate.uuids.Sale; public class HibernateUtil { + private static final String DEFAULT_RESOURCE = "manytomany.cfg.xml"; private static final Logger LOGGER = LoggerFactory.getLogger(HibernateUtil.class); - private static SessionFactory sessionFactory; - private static SessionFactory buildSessionFactory() { + private static SessionFactory buildSessionFactory(String resource) { try { // Create the SessionFactory from hibernate-annotation.cfg.xml Configuration configuration = new Configuration(); @@ -29,16 +32,16 @@ public class HibernateUtil { configuration.addAnnotatedClass(Element.class); configuration.addAnnotatedClass(Reservation.class); configuration.addAnnotatedClass(Sale.class); - configuration.configure("manytomany.cfg.xml"); + configuration.addAnnotatedClass(Question.class); + configuration.addPackage(Question.class.getPackageName()); + configuration.configure(resource); LOGGER.debug("Hibernate Annotation Configuration loaded"); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()) .build(); LOGGER.debug("Hibernate Annotation serviceRegistry created"); - SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); - - return sessionFactory; + return configuration.buildSessionFactory(serviceRegistry); } catch (Throwable ex) { LOGGER.error("Initial SessionFactory creation failed.", ex); throw new ExceptionInInitializerError(ex); @@ -46,9 +49,10 @@ public class HibernateUtil { } public static SessionFactory getSessionFactory() { - if (sessionFactory == null) { - sessionFactory = buildSessionFactory(); - } - return sessionFactory; + return buildSessionFactory(DEFAULT_RESOURCE); + } + + public static SessionFactory getSessionFactory(String resource) { + return buildSessionFactory(resource); } } diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/booleanconverters/model/Question.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/booleanconverters/model/Question.java new file mode 100644 index 0000000000..be2990359f --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/booleanconverters/model/Question.java @@ -0,0 +1,86 @@ +package com.baeldung.hibernate.booleanconverters.model; + +import java.util.UUID; + +import org.hibernate.type.NumericBooleanConverter; +import org.hibernate.type.TrueFalseConverter; +import org.hibernate.type.YesNoConverter; + +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; + +@Entity +public class Question { + + @Id + private UUID id; + private String content; + @Convert(converter = YesNoConverter.class) + private Boolean correctAnswer; + @Convert(converter = TrueFalseConverter.class) + private Boolean shouldBeAsked; + @Convert(converter = NumericBooleanConverter.class) + private Boolean isEasy; + private Boolean wasAskedBefore; + + public Question() { + } + + public Question(UUID id, String content, Boolean correctAnswer, Boolean shouldBeAsked, Boolean isEasy, Boolean wasAskedBefore) { + this.id = id; + this.content = content; + this.correctAnswer = correctAnswer; + this.shouldBeAsked = shouldBeAsked; + this.isEasy = isEasy; + this.wasAskedBefore = wasAskedBefore; + } + + public UUID getId() { + return id; + } + + public String getContent() { + return content; + } + + public Boolean getCorrectAnswer() { + return correctAnswer; + } + + public Boolean getShouldBeAsked() { + return shouldBeAsked; + } + + public Boolean isEasy() { + return isEasy; + } + + public Boolean getWasAskedBefore() { + return wasAskedBefore; + } + + public void setId(UUID id) { + this.id = id; + } + + public void setContent(String content) { + this.content = content; + } + + public void setCorrectAnswer(Boolean correctAnswer) { + this.correctAnswer = correctAnswer; + } + + public void setShouldBeAsked(Boolean shouldBeAsked) { + this.shouldBeAsked = shouldBeAsked; + } + + public void setEasy(Boolean easy) { + isEasy = easy; + } + + public void setWasAskedBefore(Boolean wasAskedBefore) { + this.wasAskedBefore = wasAskedBefore; + } +} diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/booleanconverters/model/package-info.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/booleanconverters/model/package-info.java new file mode 100644 index 0000000000..d5041b87c0 --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/booleanconverters/model/package-info.java @@ -0,0 +1,5 @@ +@ConverterRegistration(converter = YesNoConverter.class) +package com.baeldung.hibernate.booleanconverters.model; + +import org.hibernate.annotations.ConverterRegistration; +import org.hibernate.type.YesNoConverter; \ No newline at end of file diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/PersistenceConfig.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/PersistenceConfig.java similarity index 95% rename from persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/PersistenceConfig.java rename to persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/PersistenceConfig.java index 0d7b8bdbcf..4ec6c9fb71 100644 --- a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/PersistenceConfig.java +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/PersistenceConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.manytomany; +package com.baeldung.hibernate.manytomany; import java.util.Properties; @@ -22,7 +22,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @EnableTransactionManagement @PropertySource({ "classpath:persistence-h2.properties" }) -@ComponentScan({ "com.baeldung.manytomany" }) +@ComponentScan({ "com.baeldung.hibernate.manytomany" }) public class PersistenceConfig { @Autowired @@ -32,7 +32,7 @@ public class PersistenceConfig { public LocalSessionFactoryBean sessionFactory() { final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); sessionFactory.setDataSource(restDataSource()); - sessionFactory.setPackagesToScan(new String[] { "com.baeldung.manytomany" }); + sessionFactory.setPackagesToScan(new String[] { "com.baeldung.hibernate.manytomany" }); sessionFactory.setHibernateProperties(hibernateProperties()); return sessionFactory; diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/IEmployeeDao.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/IEmployeeDao.java new file mode 100644 index 0000000000..7bff73ecf4 --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/IEmployeeDao.java @@ -0,0 +1,8 @@ +package com.baeldung.hibernate.manytomany.dao; + +import com.baeldung.hibernate.manytomany.dao.common.IOperations; +import com.baeldung.hibernate.manytomany.model.Employee; + +public interface IEmployeeDao extends IOperations{ + +} diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/IProjectDao.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/IProjectDao.java new file mode 100644 index 0000000000..de800ae783 --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/IProjectDao.java @@ -0,0 +1,8 @@ +package com.baeldung.hibernate.manytomany.dao; + +import com.baeldung.hibernate.manytomany.dao.common.IOperations; +import com.baeldung.hibernate.manytomany.model.Project; + +public interface IProjectDao extends IOperations{ + +} diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/common/AbstractDao.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/common/AbstractDao.java similarity index 85% rename from persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/common/AbstractDao.java rename to persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/common/AbstractDao.java index b37b48e645..6ed04a9b2f 100644 --- a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/common/AbstractDao.java +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/common/AbstractDao.java @@ -1,4 +1,4 @@ -package com.baeldung.manytomany.dao.common; +package com.baeldung.hibernate.manytomany.dao.common; import java.io.Serializable; diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/common/AbstractHibernateDao.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/common/AbstractHibernateDao.java similarity index 96% rename from persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/common/AbstractHibernateDao.java rename to persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/common/AbstractHibernateDao.java index 9c8a8faa2e..67878906ca 100644 --- a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/common/AbstractHibernateDao.java +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/common/AbstractHibernateDao.java @@ -1,4 +1,4 @@ -package com.baeldung.manytomany.dao.common; +package com.baeldung.hibernate.manytomany.dao.common; import java.io.Serializable; import java.util.List; diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/common/IOperations.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/common/IOperations.java similarity index 85% rename from persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/common/IOperations.java rename to persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/common/IOperations.java index 8a85b52fc9..2be7fdb75e 100644 --- a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/common/IOperations.java +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/common/IOperations.java @@ -1,4 +1,4 @@ -package com.baeldung.manytomany.dao.common; +package com.baeldung.hibernate.manytomany.dao.common; import java.io.Serializable; import java.util.List; diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/impl/EmployeeDao.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/impl/EmployeeDao.java similarity index 50% rename from persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/impl/EmployeeDao.java rename to persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/impl/EmployeeDao.java index b24013c567..d4364c00c2 100644 --- a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/impl/EmployeeDao.java +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/impl/EmployeeDao.java @@ -1,10 +1,10 @@ -package com.baeldung.manytomany.dao.impl; +package com.baeldung.hibernate.manytomany.dao.impl; import org.springframework.stereotype.Repository; -import com.baeldung.manytomany.dao.IEmployeeDao; -import com.baeldung.manytomany.dao.common.AbstractHibernateDao; -import com.baeldung.manytomany.model.Employee; +import com.baeldung.hibernate.manytomany.dao.IEmployeeDao; +import com.baeldung.hibernate.manytomany.dao.common.AbstractHibernateDao; +import com.baeldung.hibernate.manytomany.model.Employee; @Repository public class EmployeeDao extends AbstractHibernateDao implements IEmployeeDao { diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/impl/ProjectDao.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/impl/ProjectDao.java new file mode 100644 index 0000000000..a221116013 --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/dao/impl/ProjectDao.java @@ -0,0 +1,17 @@ +package com.baeldung.hibernate.manytomany.dao.impl; + +import org.springframework.stereotype.Repository; + +import com.baeldung.hibernate.manytomany.dao.IProjectDao; +import com.baeldung.hibernate.manytomany.dao.common.AbstractHibernateDao; +import com.baeldung.hibernate.manytomany.model.Project; + +@Repository +public class ProjectDao extends AbstractHibernateDao implements IProjectDao { + + public ProjectDao() { + super(); + + setClazz(Project.class); + } +} diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/model/Employee.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/model/Employee.java similarity index 97% rename from persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/model/Employee.java rename to persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/model/Employee.java index cc745f9307..d606f1281c 100644 --- a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/model/Employee.java +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/model/Employee.java @@ -1,4 +1,4 @@ -package com.baeldung.manytomany.model; +package com.baeldung.hibernate.manytomany.model; import java.io.Serializable; import java.util.HashSet; diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/model/Project.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/model/Project.java similarity index 96% rename from persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/model/Project.java rename to persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/model/Project.java index b0ca7f06cb..8ea31dbc5f 100644 --- a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/model/Project.java +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/manytomany/model/Project.java @@ -1,4 +1,4 @@ -package com.baeldung.manytomany.model; +package com.baeldung.hibernate.manytomany.model; import java.io.Serializable; import java.util.HashSet; diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/Element.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/uuids/Element.java similarity index 92% rename from persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/Element.java rename to persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/uuids/Element.java index 1a17cba90c..5112c6df0f 100644 --- a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/Element.java +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/uuids/Element.java @@ -1,4 +1,4 @@ -package com.baeldung.uuids; +package com.baeldung.hibernate.uuids; import java.util.UUID; import jakarta.persistence.Entity; diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/Reservation.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/uuids/Reservation.java similarity index 95% rename from persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/Reservation.java rename to persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/uuids/Reservation.java index 83b232d940..389376e785 100644 --- a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/Reservation.java +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/uuids/Reservation.java @@ -1,4 +1,4 @@ -package com.baeldung.uuids; +package com.baeldung.hibernate.uuids; import java.util.UUID; import jakarta.persistence.Id; diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/Sale.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/uuids/Sale.java similarity index 94% rename from persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/Sale.java rename to persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/uuids/Sale.java index f9b1c246cd..8eaab80912 100644 --- a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/Sale.java +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/uuids/Sale.java @@ -1,4 +1,4 @@ -package com.baeldung.uuids; +package com.baeldung.hibernate.uuids; import jakarta.persistence.Id; import jakarta.persistence.Entity; diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/WebSiteUser.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/uuids/WebSiteUser.java similarity index 94% rename from persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/WebSiteUser.java rename to persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/uuids/WebSiteUser.java index 1150c03dcc..b1a115a3b9 100644 --- a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/uuids/WebSiteUser.java +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/hibernate/uuids/WebSiteUser.java @@ -1,4 +1,4 @@ -package com.baeldung.uuids; +package com.baeldung.hibernate.uuids; import java.util.UUID; import java.time.LocalDate; diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/IEmployeeDao.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/IEmployeeDao.java deleted file mode 100644 index 68bf5d5bad..0000000000 --- a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/IEmployeeDao.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.baeldung.manytomany.dao; - -import com.baeldung.manytomany.dao.common.IOperations; -import com.baeldung.manytomany.model.Employee; - -public interface IEmployeeDao extends IOperations{ - -} diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/IProjectDao.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/IProjectDao.java deleted file mode 100644 index d2645db44a..0000000000 --- a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/IProjectDao.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.baeldung.manytomany.dao; - -import com.baeldung.manytomany.dao.common.IOperations; -import com.baeldung.manytomany.model.Project; - -public interface IProjectDao extends IOperations{ - -} diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/impl/ProjectDao.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/impl/ProjectDao.java deleted file mode 100644 index a70212f519..0000000000 --- a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/impl/ProjectDao.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.manytomany.dao.impl; - -import org.springframework.stereotype.Repository; - -import com.baeldung.manytomany.dao.IProjectDao; -import com.baeldung.manytomany.dao.common.AbstractHibernateDao; -import com.baeldung.manytomany.model.Project; - - -@Repository -public class ProjectDao extends AbstractHibernateDao implements IProjectDao { - - public ProjectDao() { - super(); - - setClazz(Project.class); - } -} diff --git a/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/SpringContextTest.java b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/SpringContextTest.java index f1a6f675ce..e1650dccd2 100644 --- a/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/SpringContextTest.java +++ b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/SpringContextTest.java @@ -6,7 +6,7 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; -import com.baeldung.manytomany.PersistenceConfig; +import com.baeldung.hibernate.manytomany.PersistenceConfig; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class) diff --git a/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/booleanconverters/HibernateBooleanConverterIntegrationTest.java b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/booleanconverters/HibernateBooleanConverterIntegrationTest.java new file mode 100644 index 0000000000..3235485e96 --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/booleanconverters/HibernateBooleanConverterIntegrationTest.java @@ -0,0 +1,158 @@ +package com.baeldung.hibernate.booleanconverters; + +import static java.lang.String.format; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.util.UUID; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.baeldung.hibernate.HibernateUtil; +import com.baeldung.hibernate.booleanconverters.model.Question; + +public class HibernateBooleanConverterIntegrationTest { + + private static final String PROPERTY_FILE_NAME = "booleanconverters.cfg.xml"; + + private static SessionFactory sessionFactory; + private static Session session; + + @BeforeAll + static void createSessionFactory() { + sessionFactory = HibernateUtil.getSessionFactory(PROPERTY_FILE_NAME); + } + + @BeforeEach + void openSessionAndBeginTransaction() { + session = sessionFactory.openSession(); + } + + @AfterAll + static void closeSessionFactory() { + sessionFactory.close(); + } + + @Test + void whenFieldAnnotatedWithYesNoConverter_ThenConversionWorks() { + session.beginTransaction(); + UUID likeJavaQuestionId = UUID.randomUUID(); + UUID sydneyCapitalOfAustraliaQuestionId = UUID.randomUUID(); + session.persist(new QuestionBuilder().id(likeJavaQuestionId) + .content("Do you like Java?") + .correctAnswer(true) + .build()); + session.persist(new QuestionBuilder().id(sydneyCapitalOfAustraliaQuestionId) + .content("Is Sydney the capital of Australia?") + .correctAnswer(false) + .build()); + session.flush(); + + char likeJavaQuestionCorrectAnswerDbValue = session.createNativeQuery(format("SELECT correctAnswer FROM Question WHERE id='%s'", likeJavaQuestionId), Character.class) + .getSingleResult(); + char sydneyCapitalOfAustraliaQuestionCorrectAnswerDbValue = session.createNativeQuery(format("SELECT correctAnswer FROM Question WHERE id='%s'", sydneyCapitalOfAustraliaQuestionId), Character.class) + .getSingleResult(); + session.close(); + + assertEquals('Y', likeJavaQuestionCorrectAnswerDbValue); + assertEquals('N', sydneyCapitalOfAustraliaQuestionCorrectAnswerDbValue); + } + + @Test + void whenFieldAnnotatedWithTrueFalseConverter_ThenConversionWorks() { + session.beginTransaction(); + UUID codeTestedQuestionId = UUID.randomUUID(); + UUID earningsQuestionId = UUID.randomUUID(); + session.persist(new QuestionBuilder().id(codeTestedQuestionId) + .content("Is this code tested?") + .shouldBeAsked(true) + .build()); + session.persist(new QuestionBuilder().id(earningsQuestionId) + .content("How much do you earn?") + .shouldBeAsked(false) + .build()); + session.flush(); + + char codeTestedQuestionShouldBeAskedDbValue = session.createNativeQuery(format("SELECT shouldBeAsked FROM Question WHERE id='%s'", codeTestedQuestionId), Character.class) + .getSingleResult(); + char earningsQuestionsShouldBeAskedDbValue = session.createNativeQuery(format("SELECT shouldBeAsked FROM Question WHERE id='%s'", earningsQuestionId), Character.class) + .getSingleResult(); + session.close(); + + assertEquals('T', codeTestedQuestionShouldBeAskedDbValue); + assertEquals('F', earningsQuestionsShouldBeAskedDbValue); + } + + @Test + void whenFieldAnnotatedWithNumericBooleanConverter_ThenConversionWorks() { + session.beginTransaction(); + UUID earthFlatQuestionId = UUID.randomUUID(); + UUID shouldLearnProgrammingQuestionId = UUID.randomUUID(); + session.persist(new QuestionBuilder().id(earthFlatQuestionId) + .content("Is the Earth flat?") + .isEasy(true) + .build()); + session.persist(new QuestionBuilder().id(shouldLearnProgrammingQuestionId) + .content("Should one learn programming") + .isEasy(false) + .build()); + session.flush(); + + int earthFlatQuestionIsEasyDbValue = session.createNativeQuery(format("SELECT isEasy FROM Question WHERE id='%s'", earthFlatQuestionId), Integer.class) + .getSingleResult(); + int shouldLearnProgrammingQuestionIsEasyDbValue = session.createNativeQuery(format("SELECT isEasy FROM Question WHERE id='%s'", shouldLearnProgrammingQuestionId), Integer.class) + .getSingleResult(); + session.close(); + + assertEquals(1, earthFlatQuestionIsEasyDbValue); + assertEquals(0, shouldLearnProgrammingQuestionIsEasyDbValue); + } + + @Test + void givenFieldAnnotatedWithYesNoConverter_WhenDbValueIsLowercase_ThenDomainModelValueNull() { + session.beginTransaction(); + UUID mappedToNullQuestionId = UUID.randomUUID(); + UUID behaviorIntuitiveQuestionId = UUID.randomUUID(); + session.createNativeMutationQuery(format("INSERT INTO Question (id, content, correctAnswer) VALUES ('%s', 'Will correctAnswer be mapped to null?', 'y')", mappedToNullQuestionId)) + .executeUpdate(); + session.createNativeMutationQuery(format("INSERT INTO Question (id, content, correctAnswer) VALUES ('%s', 'Is this behavior intuitive?', 'n')", behaviorIntuitiveQuestionId)) + .executeUpdate(); + + Question behaviorIntuitiveQuestion = session.get(Question.class, behaviorIntuitiveQuestionId); + Question mappedToNullQuestion = session.get(Question.class, mappedToNullQuestionId); + session.close(); + + assertNull(behaviorIntuitiveQuestion.getCorrectAnswer()); + assertNull(mappedToNullQuestion.getCorrectAnswer()); + } + + @Test + void givenConverterRegisteredToAutoApply_whenFieldIsNotAnnotated_ThenConversionWorks() { + session.beginTransaction(); + UUID likeJavaQuestionId = UUID.randomUUID(); + UUID likeKotlinQuestionId = UUID.randomUUID(); + session.persist(new QuestionBuilder().id(likeJavaQuestionId) + .content("Do you like Java?") + .wasAskedBefore(true) + .build()); + session.persist(new QuestionBuilder().id(likeKotlinQuestionId) + .content("Do you like Kotlin?") + .wasAskedBefore(false) + .build()); + session.flush(); + + char likeJavaQuestionWasAskedBeforeDbValue = session.createNativeQuery(format("SELECT wasAskedBefore FROM Question WHERE id='%s'", likeJavaQuestionId), Character.class) + .getSingleResult(); + char likeKotlinQuestionWasAskedBeforeDbValue = session.createNativeQuery(format("SELECT wasAskedBefore FROM Question WHERE id='%s'", likeKotlinQuestionId), Character.class) + .getSingleResult(); + session.close(); + + assertEquals('Y', likeJavaQuestionWasAskedBeforeDbValue); + assertEquals('N', likeKotlinQuestionWasAskedBeforeDbValue); + } +} diff --git a/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/booleanconverters/QuestionBuilder.java b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/booleanconverters/QuestionBuilder.java new file mode 100644 index 0000000000..26fe38c3c8 --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/booleanconverters/QuestionBuilder.java @@ -0,0 +1,48 @@ +package com.baeldung.hibernate.booleanconverters; + +import java.util.UUID; + +import com.baeldung.hibernate.booleanconverters.model.Question; + +public class QuestionBuilder { + private UUID id; + private String content; + private Boolean correctAnswer; + private Boolean shouldBeAsked; + private Boolean isEasy; + private Boolean wasAskedBefore; + + public QuestionBuilder id(UUID id) { + this.id = id; + return this; + } + + public QuestionBuilder content(String content) { + this.content = content; + return this; + } + + public QuestionBuilder correctAnswer(Boolean correctAnswer) { + this.correctAnswer = correctAnswer; + return this; + } + + public QuestionBuilder shouldBeAsked(Boolean shouldBeAsked) { + this.shouldBeAsked = shouldBeAsked; + return this; + } + + public QuestionBuilder isEasy(Boolean isEasy) { + this.isEasy = isEasy; + return this; + } + + public QuestionBuilder wasAskedBefore(Boolean wasAskedBefore) { + this.wasAskedBefore = wasAskedBefore; + return this; + } + + public Question build() { + return new Question(id, content, correctAnswer, shouldBeAsked, isEasy, wasAskedBefore); + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationJavaConfigMainIntegrationTest.java b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationJavaConfigMainIntegrationTest.java index 69b791b4d4..e4fcafcb56 100644 --- a/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationJavaConfigMainIntegrationTest.java +++ b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationJavaConfigMainIntegrationTest.java @@ -13,9 +13,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; -import com.baeldung.manytomany.PersistenceConfig; -import com.baeldung.manytomany.model.Employee; -import com.baeldung.manytomany.model.Project; + +import com.baeldung.hibernate.manytomany.model.Employee; +import com.baeldung.hibernate.manytomany.model.Project; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class) diff --git a/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java index 15ad2c50b9..7c6861e63b 100644 --- a/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java +++ b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java @@ -15,9 +15,9 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import com.baeldung.manytomany.model.Employee; -import com.baeldung.manytomany.model.Project; -import com.baeldung.HibernateUtil; +import com.baeldung.hibernate.manytomany.model.Employee; +import com.baeldung.hibernate.manytomany.model.Project; +import com.baeldung.hibernate.HibernateUtil; /** * Configured in: manytomany.cfg.xml diff --git a/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/uuids/UUIDsHibernateGenerationIntegrationTest.java b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/uuids/UUIDsHibernateGenerationIntegrationTest.java index 7d605484ed..f36a4333c3 100644 --- a/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/uuids/UUIDsHibernateGenerationIntegrationTest.java +++ b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/uuids/UUIDsHibernateGenerationIntegrationTest.java @@ -1,18 +1,12 @@ package com.baeldung.hibernate.uuids; -import com.baeldung.HibernateUtil; +import com.baeldung.hibernate.HibernateUtil; -import com.baeldung.uuids.Reservation; -import com.baeldung.uuids.Sale; -import com.baeldung.uuids.WebSiteUser; -import com.baeldung.uuids.Element; import org.assertj.core.api.Assertions; import java.io.IOException; import org.hibernate.SessionFactory; import org.hibernate.Session; -import org.junit.After; -import org.junit.AfterClass; import org.junit.Before; import org.junit.Test; import java.util.UUID; diff --git a/persistence-modules/hibernate-mapping-2/src/test/resources/booleanconverters.cfg.xml b/persistence-modules/hibernate-mapping-2/src/test/resources/booleanconverters.cfg.xml new file mode 100644 index 0000000000..6ca479b052 --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/test/resources/booleanconverters.cfg.xml @@ -0,0 +1,16 @@ + + + + + org.h2.Driver + + jdbc:h2:mem:booleanconvertersdb;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM 'src/test/resources/booleanconverters/init_database.sql' + sa + org.hibernate.dialect.H2Dialect + thread + false + none + + \ No newline at end of file diff --git a/persistence-modules/hibernate-mapping-2/src/test/resources/booleanconverters/init_database.sql b/persistence-modules/hibernate-mapping-2/src/test/resources/booleanconverters/init_database.sql new file mode 100644 index 0000000000..cb0f4f329c --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/test/resources/booleanconverters/init_database.sql @@ -0,0 +1,9 @@ +CREATE TABLE Question ( + id UUID, + content VARCHAR, + correctAnswer CHAR, + shouldBeAsked CHAR, + isEasy TINYINT, + wasAskedBefore CHAR, + PRIMARY KEY (id) +) From 1770c64f3a7c1850121823d58524ad9cf0553374 Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Sun, 30 Apr 2023 03:40:16 +0100 Subject: [PATCH 047/141] BAEL-6194 Retrieve the Value of an HTML Input Using Selenium WebDriver in Java (#13898) * Retrieve the Value of an HTML Input Using Selenium WebDriver in Java * Retrieve the Value of an HTML Input Using Selenium WebDriver in Java * Retrieve the Value of an HTML Input Using Selenium WebDriver in Java --- testing-modules/selenium-junit-testng/pom.xml | 4 +- .../webdriver/SeleniumWebDriverUnitTest.java | 43 +++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/webdriver/SeleniumWebDriverUnitTest.java diff --git a/testing-modules/selenium-junit-testng/pom.xml b/testing-modules/selenium-junit-testng/pom.xml index f0a2e43eeb..517dc48dde 100644 --- a/testing-modules/selenium-junit-testng/pom.xml +++ b/testing-modules/selenium-junit-testng/pom.xml @@ -57,9 +57,9 @@ 6.10 - 4.6.0 + 4.8.3 1.5.4 - 5.3.0 + 5.3.2 \ No newline at end of file diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/webdriver/SeleniumWebDriverUnitTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/webdriver/SeleniumWebDriverUnitTest.java new file mode 100644 index 0000000000..e4e89611d1 --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/webdriver/SeleniumWebDriverUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.selenium.webdriver; + +import org.junit.Assert; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.Keys; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import io.github.bonigarcia.wdm.WebDriverManager; + +public class SeleniumWebDriverUnitTest { + + private WebDriver driver; + + private static final String URL = "https://duckduckgo.com/"; + private static final String INPUT_ID = "search_form_input_homepage"; + + @BeforeEach + public void setUp() { + WebDriverManager.chromedriver().setup(); + driver = new ChromeDriver(); + } + + @AfterEach + public void tearDown() { + driver.quit(); + } + + @Test + public void givenDuckDuckGoHomePage_whenInputHelloWorld_thenInputValueIsHelloWorld() { + driver.get(URL); + WebElement inputElement = driver.findElement(By.id(INPUT_ID)); + inputElement.sendKeys(Keys.chord(Keys.CONTROL, "a"), Keys.DELETE); + inputElement.sendKeys("Hello World!"); + + String inputValue = inputElement.getAttribute("value"); + Assert.assertEquals("Hello World!", inputValue); + } + +} From 3c5042ebf8928fd8b3f96145966bfcf62eb7c76d Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sun, 30 Apr 2023 23:44:05 +0530 Subject: [PATCH 048/141] JAVA-20898 Check Article Code Matches GitHub --- .../test/java/com/baeldung/jaxb/test/JaxbIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jaxb/src/test/java/com/baeldung/jaxb/test/JaxbIntegrationTest.java b/jaxb/src/test/java/com/baeldung/jaxb/test/JaxbIntegrationTest.java index 18960b1d9e..9117bb621e 100644 --- a/jaxb/src/test/java/com/baeldung/jaxb/test/JaxbIntegrationTest.java +++ b/jaxb/src/test/java/com/baeldung/jaxb/test/JaxbIntegrationTest.java @@ -48,7 +48,7 @@ public class JaxbIntegrationTest { } @Test - public void unMashal() throws JAXBException, IOException { + public void unmarshal() throws JAXBException, IOException { Unmarshaller unmarshaller = context.createUnmarshaller(); String bookFile = this.getClass().getResource("/book.xml").getFile(); Book unMarshallerbook = (Book) unmarshaller.unmarshal(new FileReader(bookFile)); From aa2b88285a287de04966576408a6093ba171c48e Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Mon, 1 May 2023 23:39:29 +0530 Subject: [PATCH 049/141] Java 15032 (#13913) * JAVA-15032: Changes made for adding the test cases custom userAgent in request header * JAVA-15032: Changes made for adding the test cases custom userAgent in request header * JAVA-15032: Changes made for incorporarting review comments --- .../httpclient/HttpClientHeadersLiveTest.java | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientHeadersLiveTest.java b/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientHeadersLiveTest.java index 616b6470af..3992fd821e 100644 --- a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientHeadersLiveTest.java +++ b/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientHeadersLiveTest.java @@ -25,26 +25,22 @@ class HttpClientHeadersLiveTest { @Test void whenClientUsesCustomUserAgent_thenCorrect() throws IOException { + final CloseableHttpClient client = HttpClients.custom() + .setUserAgent("Mozilla/5.0 Firefox/26.0") + .build(); final HttpGet request = new HttpGet(SAMPLE_URL); - try (CloseableHttpClient client = HttpClients.custom() - .setUserAgent("Mozilla/5.0 Firefox/26.0") - .build()) { - - String response = client.execute(request, new BasicHttpClientResponseHandler()); - logger.info("Response -> {}", response); - } + String response = client.execute(request, new BasicHttpClientResponseHandler()); + logger.info("Response -> {}", response); } @Test void whenRequestHasCustomUserAgent_thenCorrect() throws IOException { + CloseableHttpClient client = HttpClients.createDefault(); final HttpGet request = new HttpGet(SAMPLE_URL); request.setHeader(HttpHeaders.USER_AGENT, "Mozilla/5.0 Firefox/26.0"); - - try (CloseableHttpClient client = HttpClients.createDefault()) { - String response = client.execute(request, new BasicHttpClientResponseHandler()); - logger.info("Response -> {}", response); - } + String response = client.execute(request, new BasicHttpClientResponseHandler()); + logger.info("Response -> {}", response); } @Test From d21eeb25cb6a3f200548a7969252a00bd22e8c0c Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Tue, 2 May 2023 01:34:11 +0530 Subject: [PATCH 050/141] JAVA-20931 Commented out spring-boot-3 for now because of JDK 19 requirement (#13936) --- spring-boot-modules/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 1de19fc867..2fe146e065 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -85,7 +85,7 @@ spring-boot-redis spring-boot-cassandre spring-boot-react - spring-boot-3 + spring-boot-3-native spring-boot-3-observation spring-boot-3-test-pitfalls From 18834b349e4b35214c5abc35a927d91b9eebc8e3 Mon Sep 17 00:00:00 2001 From: Shaun Phillips <61982125+ShaPhi7@users.noreply.github.com> Date: Tue, 2 May 2023 03:53:21 +0100 Subject: [PATCH 051/141] BAEL-6325 Create core-java-lang-oop-constructors-2 (#13933) * BAEL-5915 Added different ways to create an object * BAEL-6325 Create core-java-lang-oop-constructors-2 --- .../core-java-lang-oop-constructors-2/README.md | 7 +++++++ .../core-java-lang-oop-constructors-2/pom.xml | 16 ++++++++++++++++ .../objectcreation/objects/ClonableRabbit.java | 0 .../baeldung/objectcreation/objects/Rabbit.java | 0 .../objectcreation/objects/RabbitType.java | 0 .../objects/SerializableRabbit.java | 0 .../objectcreation/utils/CreateRabbits.java | 0 .../objectcreation/CreateRabbitsUnitTest.java | 0 .../core-java-lang-oop-constructors/README.md | 2 +- 9 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 core-java-modules/core-java-lang-oop-constructors-2/README.md create mode 100644 core-java-modules/core-java-lang-oop-constructors-2/pom.xml rename core-java-modules/{core-java-lang-oop-constructors => core-java-lang-oop-constructors-2}/src/main/java/com/baeldung/objectcreation/objects/ClonableRabbit.java (100%) rename core-java-modules/{core-java-lang-oop-constructors => core-java-lang-oop-constructors-2}/src/main/java/com/baeldung/objectcreation/objects/Rabbit.java (100%) rename core-java-modules/{core-java-lang-oop-constructors => core-java-lang-oop-constructors-2}/src/main/java/com/baeldung/objectcreation/objects/RabbitType.java (100%) rename core-java-modules/{core-java-lang-oop-constructors => core-java-lang-oop-constructors-2}/src/main/java/com/baeldung/objectcreation/objects/SerializableRabbit.java (100%) rename core-java-modules/{core-java-lang-oop-constructors => core-java-lang-oop-constructors-2}/src/main/java/com/baeldung/objectcreation/utils/CreateRabbits.java (100%) rename core-java-modules/{core-java-lang-oop-constructors => core-java-lang-oop-constructors-2}/src/test/java/com/baeldung/objectcreation/CreateRabbitsUnitTest.java (100%) diff --git a/core-java-modules/core-java-lang-oop-constructors-2/README.md b/core-java-modules/core-java-lang-oop-constructors-2/README.md new file mode 100644 index 0000000000..d9b162c7a6 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-constructors-2/README.md @@ -0,0 +1,7 @@ +## Core Java Lang OOP - Constructors - Part 2 + +This module contains article about constructors in Java + +### Relevant Articles: +- [Different Ways to Create an Object in Java](https://www.baeldung.com/java-different-ways-to-create-objects) +- More articles: [[<-- Prev]](/core-java-modules/core-java-lang-oop-constructors) \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-constructors-2/pom.xml b/core-java-modules/core-java-lang-oop-constructors-2/pom.xml new file mode 100644 index 0000000000..c6d9d84774 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-constructors-2/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + core-java-lang-oop-constructors-2 + core-java-lang-oop-constructors-2 + jar + + + core-java-modules + com.baeldung.core-java-modules + 0.0.1-SNAPSHOT + + + \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/ClonableRabbit.java b/core-java-modules/core-java-lang-oop-constructors-2/src/main/java/com/baeldung/objectcreation/objects/ClonableRabbit.java similarity index 100% rename from core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/ClonableRabbit.java rename to core-java-modules/core-java-lang-oop-constructors-2/src/main/java/com/baeldung/objectcreation/objects/ClonableRabbit.java diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/Rabbit.java b/core-java-modules/core-java-lang-oop-constructors-2/src/main/java/com/baeldung/objectcreation/objects/Rabbit.java similarity index 100% rename from core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/Rabbit.java rename to core-java-modules/core-java-lang-oop-constructors-2/src/main/java/com/baeldung/objectcreation/objects/Rabbit.java diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/RabbitType.java b/core-java-modules/core-java-lang-oop-constructors-2/src/main/java/com/baeldung/objectcreation/objects/RabbitType.java similarity index 100% rename from core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/RabbitType.java rename to core-java-modules/core-java-lang-oop-constructors-2/src/main/java/com/baeldung/objectcreation/objects/RabbitType.java diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/SerializableRabbit.java b/core-java-modules/core-java-lang-oop-constructors-2/src/main/java/com/baeldung/objectcreation/objects/SerializableRabbit.java similarity index 100% rename from core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/SerializableRabbit.java rename to core-java-modules/core-java-lang-oop-constructors-2/src/main/java/com/baeldung/objectcreation/objects/SerializableRabbit.java diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/utils/CreateRabbits.java b/core-java-modules/core-java-lang-oop-constructors-2/src/main/java/com/baeldung/objectcreation/utils/CreateRabbits.java similarity index 100% rename from core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/utils/CreateRabbits.java rename to core-java-modules/core-java-lang-oop-constructors-2/src/main/java/com/baeldung/objectcreation/utils/CreateRabbits.java diff --git a/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/objectcreation/CreateRabbitsUnitTest.java b/core-java-modules/core-java-lang-oop-constructors-2/src/test/java/com/baeldung/objectcreation/CreateRabbitsUnitTest.java similarity index 100% rename from core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/objectcreation/CreateRabbitsUnitTest.java rename to core-java-modules/core-java-lang-oop-constructors-2/src/test/java/com/baeldung/objectcreation/CreateRabbitsUnitTest.java diff --git a/core-java-modules/core-java-lang-oop-constructors/README.md b/core-java-modules/core-java-lang-oop-constructors/README.md index 4ac9224bb1..c35cb836a5 100644 --- a/core-java-modules/core-java-lang-oop-constructors/README.md +++ b/core-java-modules/core-java-lang-oop-constructors/README.md @@ -13,4 +13,4 @@ This module contains article about constructors in Java - [Constructor Specification in Java](https://www.baeldung.com/java-constructor-specification) - [Static vs. Instance Initializer Block in Java](https://www.baeldung.com/java-static-instance-initializer-blocks) - [Accessing Private Constructor in Java](https://www.baeldung.com/java-private-constructor-access) -- [Different Ways to Create an Object in Java](https://www.baeldung.com/java-different-ways-to-create-objects) +- More articles: [[next -->]](/core-java-modules/core-java-lang-oop-constructors-2) \ No newline at end of file From 7d86466fb707d7b44a2dce46caa0ecdaca7191bc Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Tue, 2 May 2023 08:29:16 +0200 Subject: [PATCH 052/141] BAEL-6435: Reverse a String in Java 8 using Lambda and Streams (#13910) --- .../reverse/ReverseStringExamples.java | 38 ++++++++++++++- .../ReverseStringExamplesUnitTest.java | 48 ++++++++++++++++--- 2 files changed, 78 insertions(+), 8 deletions(-) diff --git a/core-java-modules/core-java-string-algorithms/src/main/java/com/baeldung/reverse/ReverseStringExamples.java b/core-java-modules/core-java-string-algorithms/src/main/java/com/baeldung/reverse/ReverseStringExamples.java index 5236f14ccd..07663ab7d1 100644 --- a/core-java-modules/core-java-string-algorithms/src/main/java/com/baeldung/reverse/ReverseStringExamples.java +++ b/core-java-modules/core-java-string-algorithms/src/main/java/com/baeldung/reverse/ReverseStringExamples.java @@ -1,5 +1,9 @@ package com.baeldung.reverse; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + import org.apache.commons.lang3.StringUtils; public class ReverseStringExamples { @@ -46,11 +50,43 @@ public class ReverseStringExamples { } return output.toString() - .trim(); + .trim(); } public static String reverseTheOrderOfWordsUsingApacheCommons(String sentence) { return StringUtils.reverseDelimited(sentence, ' '); } + public static String reverseUsingIntStreamRangeMethod(String str) { + if (str == null) { + return null; + } + + char[] charArray = str.toCharArray(); + return IntStream.range(0, str.length()) + .mapToObj(i -> charArray[str.length() - i - 1]) + .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) + .toString(); + } + + public static String reverseUsingStreamOfMethod(String str) { + if (str == null) { + return null; + } + + return Stream.of(str) + .map(string -> new StringBuilder(string).reverse()) + .collect(Collectors.joining()); + } + + public static String reverseUsingCharsMethod(String str) { + if (str == null) { + return null; + } + + return str.chars() + .mapToObj(c -> (char) c) + .reduce("", (a, b) -> b + a, (a2, b2) -> b2 + a2); + } + } diff --git a/core-java-modules/core-java-string-algorithms/src/test/java/com/baeldung/reverse/ReverseStringExamplesUnitTest.java b/core-java-modules/core-java-string-algorithms/src/test/java/com/baeldung/reverse/ReverseStringExamplesUnitTest.java index c122163174..b3685a49da 100644 --- a/core-java-modules/core-java-string-algorithms/src/test/java/com/baeldung/reverse/ReverseStringExamplesUnitTest.java +++ b/core-java-modules/core-java-string-algorithms/src/test/java/com/baeldung/reverse/ReverseStringExamplesUnitTest.java @@ -1,10 +1,11 @@ package com.baeldung.reverse; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + import org.apache.commons.lang3.StringUtils; import org.junit.Test; -import static org.junit.Assert.assertEquals; - public class ReverseStringExamplesUnitTest { private static final String STRING_INPUT = "cat"; @@ -19,7 +20,7 @@ public class ReverseStringExamplesUnitTest { String reversedEmpty = ReverseStringExamples.reverse(StringUtils.EMPTY); assertEquals(STRING_INPUT_REVERSED, reversed); - assertEquals(null, reversedNull); + assertNull(reversedNull); assertEquals(StringUtils.EMPTY, reversedEmpty); } @@ -30,7 +31,7 @@ public class ReverseStringExamplesUnitTest { String reversedEmpty = ReverseStringExamples.reverseUsingStringBuilder(StringUtils.EMPTY); assertEquals(STRING_INPUT_REVERSED, reversed); - assertEquals(null, reversedNull); + assertNull(reversedNull); assertEquals(StringUtils.EMPTY, reversedEmpty); } @@ -41,7 +42,7 @@ public class ReverseStringExamplesUnitTest { String reversedEmpty = ReverseStringExamples.reverseUsingApacheCommons(StringUtils.EMPTY); assertEquals(STRING_INPUT_REVERSED, reversed); - assertEquals(null, reversedNull); + assertNull(reversedNull); assertEquals(StringUtils.EMPTY, reversedEmpty); } @@ -52,7 +53,7 @@ public class ReverseStringExamplesUnitTest { String reversedEmpty = ReverseStringExamples.reverseTheOrderOfWords(StringUtils.EMPTY); assertEquals(REVERSED_WORDS_SENTENCE, reversed); - assertEquals(null, reversedNull); + assertNull(reversedNull); assertEquals(StringUtils.EMPTY, reversedEmpty); } @@ -63,7 +64,40 @@ public class ReverseStringExamplesUnitTest { String reversedEmpty = ReverseStringExamples.reverseTheOrderOfWordsUsingApacheCommons(StringUtils.EMPTY); assertEquals(REVERSED_WORDS_SENTENCE, reversed); - assertEquals(null, reversedNull); + assertNull(reversedNull); + assertEquals(StringUtils.EMPTY, reversedEmpty); + } + + @Test + public void whenReverseStringUsingIntStreamRangeMethod_ThenCorrectStringIsReturned() { + String reversed = ReverseStringExamples.reverseUsingIntStreamRangeMethod(STRING_INPUT); + String reversedNull = ReverseStringExamples.reverseUsingIntStreamRangeMethod(null); + String reversedEmpty = ReverseStringExamples.reverseUsingIntStreamRangeMethod(StringUtils.EMPTY); + + assertEquals(STRING_INPUT_REVERSED, reversed); + assertNull(reversedNull); + assertEquals(StringUtils.EMPTY, reversedEmpty); + } + + @Test + public void whenReverseStringUsingCharsMethod_ThenCorrectStringIsReturned() { + String reversed = ReverseStringExamples.reverseUsingCharsMethod(STRING_INPUT); + String reversedNull = ReverseStringExamples.reverseUsingCharsMethod(null); + String reversedEmpty = ReverseStringExamples.reverseUsingCharsMethod(StringUtils.EMPTY); + + assertEquals(STRING_INPUT_REVERSED, reversed); + assertNull(reversedNull); + assertEquals(StringUtils.EMPTY, reversedEmpty); + } + + @Test + public void whenReverseStringUsingStreamOfMethod_ThenCorrectStringIsReturned() { + String reversed = ReverseStringExamples.reverseUsingStreamOfMethod(STRING_INPUT); + String reversedNull = ReverseStringExamples.reverseUsingStreamOfMethod(null); + String reversedEmpty = ReverseStringExamples.reverseUsingStreamOfMethod(StringUtils.EMPTY); + + assertEquals(STRING_INPUT_REVERSED, reversed); + assertNull(reversedNull); assertEquals(StringUtils.EMPTY, reversedEmpty); } From 3433704800c4a4b08460cee4ee70121b52f9ba02 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 2 May 2023 09:56:50 +0300 Subject: [PATCH 053/141] [JAVA-20456] Upgraded jackson version (#13871) --- jackson-simple/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/jackson-simple/pom.xml b/jackson-simple/pom.xml index 6569324586..d1fcc867cf 100644 --- a/jackson-simple/pom.xml +++ b/jackson-simple/pom.xml @@ -32,4 +32,8 @@ + + 2.14.2 + + \ No newline at end of file From 0a808899e9e24da688f7161c2063d93d7364027f Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 2 May 2023 10:41:49 +0300 Subject: [PATCH 054/141] [JAVA-20457] Upgraded springdoc version (#13872) --- spring-boot-modules/spring-boot-springdoc/pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spring-boot-modules/spring-boot-springdoc/pom.xml b/spring-boot-modules/spring-boot-springdoc/pom.xml index 8cd94179cf..e21efc35d2 100644 --- a/spring-boot-modules/spring-boot-springdoc/pom.xml +++ b/spring-boot-modules/spring-boot-springdoc/pom.xml @@ -146,7 +146,7 @@ org.springdoc springdoc-openapi-maven-plugin - 1.4 + ${springdoc-openapi-maven-plugin.version} integration-test @@ -167,9 +167,10 @@ - 1.6.8 + 1.7.0 1.5.6 ${project.build.directory}/generated-snippets + 1.4 \ No newline at end of file From e782fed428da02c5684f8030f937b0f00006a612 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 2 May 2023 11:10:33 +0300 Subject: [PATCH 055/141] [JAVA-20459] Upgraded org.json to latest version (#13869) --- json-modules/json/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/json-modules/json/pom.xml b/json-modules/json/pom.xml index bf6a511a9d..8210f026e7 100644 --- a/json-modules/json/pom.xml +++ b/json-modules/json/pom.xml @@ -68,7 +68,7 @@ 1.0.72 1.0 1.0.1 - 20211205 + 20230227 2.8.5 1.1.2 2.28.0 From dbf99bc402d13f22dbce4b758b4b9675120c9893 Mon Sep 17 00:00:00 2001 From: Alejamdro Date: Tue, 2 May 2023 10:34:36 -0300 Subject: [PATCH 056/141] BAEL-6327 - Find the index of an element in a Java array (#13844) --- .../com/baeldung/arrayindex/ArrayIndex.java | 28 +++++ .../arrayindex/ArrayIndexUnitTest.java | 106 ++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/arrayindex/ArrayIndex.java create mode 100644 core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/arrayindex/ArrayIndexUnitTest.java diff --git a/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/arrayindex/ArrayIndex.java b/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/arrayindex/ArrayIndex.java new file mode 100644 index 0000000000..596e0d424f --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/arrayindex/ArrayIndex.java @@ -0,0 +1,28 @@ +package com.baeldung.arrayindex; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.IntStream; + +class ArrayIndex { + static int forLoop(int[] numbers, int target) { + for (int index = 0; index < numbers.length; index++) { + if (numbers[index] == target) { + return index; + } + } + return -1; + } + + static int listIndexOf(Integer[] numbers, int target) { + List list = Arrays.asList(numbers); + return list.indexOf(target); + } + + static int intStream(int[] numbers, int target) { + return IntStream.range(0, numbers.length) + .filter(i -> numbers[i] == target) + .findFirst() + .orElse(-1); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/arrayindex/ArrayIndexUnitTest.java b/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/arrayindex/ArrayIndexUnitTest.java new file mode 100644 index 0000000000..84c868d5e0 --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/arrayindex/ArrayIndexUnitTest.java @@ -0,0 +1,106 @@ +package com.baeldung.arrayindex; + +import static com.baeldung.arrayindex.ArrayIndex.forLoop; +import static com.baeldung.arrayindex.ArrayIndex.intStream; +import static com.baeldung.arrayindex.ArrayIndex.listIndexOf; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Arrays; + +import org.apache.commons.lang3.ArrayUtils; +import org.junit.jupiter.api.Test; + +import com.google.common.primitives.Ints; + +class ArrayIndexUnitTest { + + @Test + void givenIntegerArray_whenUseForLoop_thenWillGetElementIndex() { + int[] numbers = { 10, 20, 30, 40, 50 }; + assertEquals(2, forLoop(numbers, 30)); + } + + @Test + void givenIntegerArray_whenUseForLoop_thenWillGetElementMinusOneIndex() { + int[] numbers = { 10, 20, 30, 40, 50 }; + assertEquals(-1, forLoop(numbers, 100)); + } + + @Test + void givenIntegerArray_whenUseIndexOf_thenWillGetElementIndex() { + Integer[] numbers = { 10, 20, 30, 40, 50 }; + assertEquals(2, listIndexOf(numbers, 30)); + } + + @Test + void givenIntegerArray_whenUseIndexOf_thenWillGetElementMinusOneIndex() { + Integer[] numbers = { 10, 20, 30, 40, 50 }; + assertEquals(-1, listIndexOf(numbers, 100)); + } + + @Test + void givenIntegerArray_whenUseIntStream_thenWillGetElementIndex() { + int[] numbers = { 10, 20, 30, 40, 50 }; + assertEquals(2, intStream(numbers, 30)); + } + + @Test + void givenIntegerArray_whenUseIntStream_thenWillGetElementMinusOneIndex() { + int[] numbers = { 10, 20, 30, 40, 50 }; + assertEquals(-1, intStream(numbers, 100)); + } + + @Test + void givenIntegerArray_whenUseBinarySearch_thenWillGetElementIndex() { + int[] numbers = { 10, 20, 30, 40, 50 }; + assertEquals(2, Arrays.binarySearch(numbers, 30)); + } + + @Test + void givenIntegerArray_whenUseBinarySearch_thenWillGetUpperBoundMinusIndex() { + int[] numbers = { 10, 20, 30, 40, 50 }; + assertEquals(-6, Arrays.binarySearch(numbers, 100)); + } + + @Test + void givenIntegerArray_whenUseBinarySearch_thenWillGetInArrayMinusIndex() { + int[] numbers = { 10, 20, 30, 40, 50 }; + assertEquals(-2, Arrays.binarySearch(numbers, 15)); + } + + @Test + void givenIntegerArray_whenUseBinarySearch_thenWillGetLowerBoundMinusIndex() { + int[] numbers = { 10, 20, 30, 40, 50 }; + assertEquals(-1, Arrays.binarySearch(numbers, -15)); + } + + @Test + void givenIntegerArray_whenUseApacheCommons_thenWillGetElementIndex() { + int[] numbers = { 10, 20, 30, 40, 50 }; + assertEquals(2, ArrayUtils.indexOf(numbers, 30)); + } + + @Test + void givenIntegerArray_whenUseApacheCommonsStartingFromIndex_thenWillGetNegativeIndex() { + int[] numbers = { 10, 20, 30, 40, 50 }; + assertEquals(-1, ArrayUtils.indexOf(numbers, 30, 3)); + } + + @Test + void givenIntegerArray_whenUseApacheCommons_thenWillGetElementMinusOneIndex() { + int[] numbers = { 10, 20, 30, 40, 50 }; + assertEquals(-1, ArrayUtils.indexOf(numbers, 100)); + } + + @Test + void givenIntegerArray_whenUseGuavaInts_thenWillGetElementIndex() { + int[] numbers = { 10, 20, 30, 40, 50 }; + assertEquals(2, Ints.indexOf(numbers, 30)); + } + + @Test + void givenIntegerArray_whenUseGuavaInts_thenWillGetElementMinusOneIndex() { + int[] numbers = { 10, 20, 30, 40, 50 }; + assertEquals(-1, Ints.indexOf(numbers, 100)); + } +} \ No newline at end of file From cee6b74c190ea4c266dd5fa9352d10a15f344ea6 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 2 May 2023 21:55:20 +0530 Subject: [PATCH 057/141] JAVA-20898 Move article url from javaxval-2 to javaxval --- javaxval-2/README.md | 1 - javaxval/README.md | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/javaxval-2/README.md b/javaxval-2/README.md index 52c9b42ac4..0fd5ce163b 100644 --- a/javaxval-2/README.md +++ b/javaxval-2/README.md @@ -4,7 +4,6 @@ This module contains articles about Bean Validation. ### Relevant Articles: - [Method Constraints with Bean Validation 2.0](https://www.baeldung.com/javax-validation-method-constraints) -- [Difference Between @NotNull, @NotEmpty, and @NotBlank Constraints in Bean Validation](https://www.baeldung.com/java-bean-validation-not-null-empty-blank) - [Guide to ParameterMessageInterpolator](https://www.baeldung.com/hibernate-parametermessageinterpolator) - [Hibernate Validator Annotation Processor in Depth](https://www.baeldung.com/hibernate-validator-annotation-processor) - More articles: [[<-- prev]](../javaxval) \ No newline at end of file diff --git a/javaxval/README.md b/javaxval/README.md index 95d9410fff..b7e19d5794 100644 --- a/javaxval/README.md +++ b/javaxval/README.md @@ -10,4 +10,5 @@ This module contains articles about Bean Validation. - [Grouping Javax Validation Constraints](https://www.baeldung.com/javax-validation-groups) - [Constraint Composition with Bean Validation](https://www.baeldung.com/java-bean-validation-constraint-composition) - [Using @NotNull on a Method Parameter](https://www.baeldung.com/java-notnull-method-parameter) +- [Difference Between @NotNull, @NotEmpty, and @NotBlank Constraints in Bean Validation](https://www.baeldung.com/java-bean-validation-not-null-empty-blank) - More articles: [[next -->]](../javaxval-2) \ No newline at end of file From 34fa80a8128145cbc840c5d21c416b7dbea851a7 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Tue, 2 May 2023 23:26:38 +0530 Subject: [PATCH 058/141] Java 20643 (#13914) * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: changes made for removing web-modules from default --- pom.xml | 4 ++-- web-modules/apache-tapestry/pom.xml | 22 ++++++++++++++----- .../baeldung/tapestry/services/AppModule.java | 12 +++++----- .../tapestry/services/DevelopmentModule.java | 2 +- .../baeldung/tapestry/services/QaModule.java | 2 +- 5 files changed, 27 insertions(+), 15 deletions(-) diff --git a/pom.xml b/pom.xml index 53b5d6a358..7bca64c424 100644 --- a/pom.xml +++ b/pom.xml @@ -363,7 +363,6 @@ muleesb - web-modules persistence-modules/deltaspike @@ -550,7 +549,6 @@ lombok-modules/lombok-custom muleesb - web-modules persistence-modules/deltaspike @@ -936,6 +934,7 @@ persistence-modules/questdb vaadin libraries-3 + web-modules/apache-tapestry @@ -1187,6 +1186,7 @@ persistence-modules/questdb vaadin libraries-3 + web-modules/apache-tapestry diff --git a/web-modules/apache-tapestry/pom.xml b/web-modules/apache-tapestry/pom.xml index 7746520a56..9632dd70dc 100644 --- a/web-modules/apache-tapestry/pom.xml +++ b/web-modules/apache-tapestry/pom.xml @@ -115,6 +115,18 @@ + + org.apache.maven.plugins + maven-war-plugin + 3.3.1 + + + + true + + + + @@ -133,11 +145,11 @@ 6.1.16 - 2.7.2 - 2.3.2 - 1.8 - 1.8 - 5.4.5 + 3.0.0-M5 + 3.8.1 + 11 + 11 + 5.8.2 2.5 6.8.21 1.7.19 diff --git a/web-modules/apache-tapestry/src/main/java/com/baeldung/tapestry/services/AppModule.java b/web-modules/apache-tapestry/src/main/java/com/baeldung/tapestry/services/AppModule.java index c4d57d5b86..2798e4a75b 100644 --- a/web-modules/apache-tapestry/src/main/java/com/baeldung/tapestry/services/AppModule.java +++ b/web-modules/apache-tapestry/src/main/java/com/baeldung/tapestry/services/AppModule.java @@ -3,17 +3,17 @@ package com.baeldung.tapestry.services; import java.io.IOException; import org.apache.tapestry5.SymbolConstants; -import org.apache.tapestry5.ioc.MappedConfiguration; -import org.apache.tapestry5.ioc.OrderedConfiguration; +import org.apache.tapestry5.commons.MappedConfiguration; +import org.apache.tapestry5.commons.OrderedConfiguration; +import org.apache.tapestry5.http.services.Request; +import org.apache.tapestry5.http.services.RequestFilter; +import org.apache.tapestry5.http.services.RequestHandler; +import org.apache.tapestry5.http.services.Response; import org.apache.tapestry5.ioc.ServiceBinder; import org.apache.tapestry5.ioc.annotations.Contribute; import org.apache.tapestry5.ioc.annotations.Local; import org.apache.tapestry5.ioc.services.ApplicationDefaults; import org.apache.tapestry5.ioc.services.SymbolProvider; -import org.apache.tapestry5.services.Request; -import org.apache.tapestry5.services.RequestFilter; -import org.apache.tapestry5.services.RequestHandler; -import org.apache.tapestry5.services.Response; import org.slf4j.Logger; /** diff --git a/web-modules/apache-tapestry/src/main/java/com/baeldung/tapestry/services/DevelopmentModule.java b/web-modules/apache-tapestry/src/main/java/com/baeldung/tapestry/services/DevelopmentModule.java index d9c8493e39..1c89587c53 100644 --- a/web-modules/apache-tapestry/src/main/java/com/baeldung/tapestry/services/DevelopmentModule.java +++ b/web-modules/apache-tapestry/src/main/java/com/baeldung/tapestry/services/DevelopmentModule.java @@ -1,7 +1,7 @@ package com.baeldung.tapestry.services; import org.apache.tapestry5.SymbolConstants; -import org.apache.tapestry5.ioc.MappedConfiguration; +import org.apache.tapestry5.commons.MappedConfiguration; /** * This module is automatically included as part of the Tapestry IoC Registry if tapestry.execution-mode diff --git a/web-modules/apache-tapestry/src/main/java/com/baeldung/tapestry/services/QaModule.java b/web-modules/apache-tapestry/src/main/java/com/baeldung/tapestry/services/QaModule.java index fc6fb595e9..d16e498a4b 100644 --- a/web-modules/apache-tapestry/src/main/java/com/baeldung/tapestry/services/QaModule.java +++ b/web-modules/apache-tapestry/src/main/java/com/baeldung/tapestry/services/QaModule.java @@ -1,7 +1,7 @@ package com.baeldung.tapestry.services; import org.apache.tapestry5.SymbolConstants; -import org.apache.tapestry5.ioc.MappedConfiguration; +import org.apache.tapestry5.commons.MappedConfiguration; import org.apache.tapestry5.ioc.ServiceBinder; /** From 5cac883023ea3cbc7e52c11c74013df3e4905695 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Tue, 2 May 2023 23:31:35 +0200 Subject: [PATCH 059/141] [BAEL-6436_printQuotesAroundString] Print "" Quotes Around a String in Java (#13925) --- .../PrintQuotesAroundAStringUnitTest.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/stringwithquotes/PrintQuotesAroundAStringUnitTest.java diff --git a/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/stringwithquotes/PrintQuotesAroundAStringUnitTest.java b/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/stringwithquotes/PrintQuotesAroundAStringUnitTest.java new file mode 100644 index 0000000000..fd4ade1ef3 --- /dev/null +++ b/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/stringwithquotes/PrintQuotesAroundAStringUnitTest.java @@ -0,0 +1,60 @@ +package com.baeldung.stringwithquotes; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class PrintQuotesAroundAStringUnitTest { + private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + private final PrintStream originalOut = System.out; + + @BeforeEach + void replaceOut() { + System.setOut(new PrintStream(outContent)); + } + + @AfterEach + void restoreOut() { + System.setOut(originalOut); + } + + @Test + void whenWrappingAStringWithEscapedQuote_thenGetExpectedResult() { + String theySay = "All Java programmers are cute!"; + String quoted = "\"" + theySay + "\""; + + System.out.println(quoted); + + //assertion + String expected = "\"All Java programmers are cute!\"\n"; + assertEquals(expected, outContent.toString()); + } + + @Test + void whenCallingReplaceAll_thenGetExpectedResult() { + String theySay = "Can you write Java code?"; + String quoted = theySay.replaceAll("^|$", "\""); + + System.out.println(quoted); + + //assertion + String expected = "\"Can you write Java code?\"\n"; + assertEquals(expected, outContent.toString()); + } + + @Test + void whenWrappingAStringWithQuoteChar_thenGetExpectedResult() { + String weSay = "Yes, we can write beautiful Java codes!"; + String quoted = '"' + weSay + '"'; + System.out.println(quoted); + + //assertion + String expected = "\"Yes, we can write beautiful Java codes!\"\n"; + assertEquals(expected, outContent.toString()); + } +} \ No newline at end of file From f5910afe6fc88e64501f4c5be2d025ca42eecf4e Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Wed, 3 May 2023 14:28:43 +0530 Subject: [PATCH 060/141] JAVA-18113 Update spring-boot-swagger-keycloak module (#13506) * JAVA-18113 Update spring-boot-swagger-keycloak module --- .../spring-boot-swagger-keycloak/pom.xml | 129 +++++++++--------- .../swaggerkeycloak/GlobalSecurityConfig.java | 65 ++++----- .../KeycloakConfigResolverConfig.java | 23 ---- .../OpenAPISecurityConfig.java | 97 +++++-------- .../swaggerkeycloak/SwaggerUIConfig.java | 36 ----- .../swaggerkeycloak/TodosController.java | 14 +- .../springfox-swagger-ui/favicon-16x16.png | Bin 665 -> 0 bytes .../springfox-swagger-ui/favicon-32x32.png | Bin 628 -> 0 bytes .../springfox-swagger-ui/oauth2-redirect.html | 75 ---------- .../springfox-swagger-ui/swagger-ui.css | 4 - .../src/main/resources/application.yml | 25 +++- 11 files changed, 144 insertions(+), 324 deletions(-) delete mode 100644 spring-boot-modules/spring-boot-swagger-keycloak/src/main/java/com/baeldung/swaggerkeycloak/KeycloakConfigResolverConfig.java delete mode 100644 spring-boot-modules/spring-boot-swagger-keycloak/src/main/java/com/baeldung/swaggerkeycloak/SwaggerUIConfig.java delete mode 100644 spring-boot-modules/spring-boot-swagger-keycloak/src/main/resources/META-INF/resources/webjars/springfox-swagger-ui/favicon-16x16.png delete mode 100644 spring-boot-modules/spring-boot-swagger-keycloak/src/main/resources/META-INF/resources/webjars/springfox-swagger-ui/favicon-32x32.png delete mode 100644 spring-boot-modules/spring-boot-swagger-keycloak/src/main/resources/META-INF/resources/webjars/springfox-swagger-ui/oauth2-redirect.html delete mode 100644 spring-boot-modules/spring-boot-swagger-keycloak/src/main/resources/META-INF/resources/webjars/springfox-swagger-ui/swagger-ui.css diff --git a/spring-boot-modules/spring-boot-swagger-keycloak/pom.xml b/spring-boot-modules/spring-boot-swagger-keycloak/pom.xml index de2c8c68c4..e7950fe393 100644 --- a/spring-boot-modules/spring-boot-swagger-keycloak/pom.xml +++ b/spring-boot-modules/spring-boot-swagger-keycloak/pom.xml @@ -1,75 +1,72 @@ - 4.0.0 - spring-boot-swagger-keycloak - 0.1.0-SNAPSHOT - spring-boot-swagger-keycloak - jar - Module For Spring Boot Swagger UI with Keycloak + 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"> + 4.0.0 + spring-boot-swagger-keycloak + 0.1.0-SNAPSHOT + spring-boot-swagger-keycloak + jar + Module For Spring Boot Swagger UI with Keycloak - - com.baeldung.spring-boot-modules - spring-boot-modules - 1.0.0-SNAPSHOT - + + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 + - - - - org.keycloak.bom - keycloak-adapter-bom - ${keycloak.version} - pom - import - - - org.apache.logging.log4j - log4j-bom - ${log4j2.version} - import - pom - - - + + + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + + + - - - org.springframework.boot - spring-boot-starter-web - - - io.springfox - springfox-boot-starter - ${springfox.version} - - - - org.keycloak - keycloak-spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-security - - + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-oauth2-resource-server + + + + org.springframework.boot + spring-boot-starter-security + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + ${springdoc.version} + + + javax.annotation + javax.annotation-api + ${javax.version} + + - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + - - 2.4.5 - 3.0.0 - 15.0.2 - 2.17.1 - + + 2.1.0 + 2.17.1 + 1.3.2 + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-swagger-keycloak/src/main/java/com/baeldung/swaggerkeycloak/GlobalSecurityConfig.java b/spring-boot-modules/spring-boot-swagger-keycloak/src/main/java/com/baeldung/swaggerkeycloak/GlobalSecurityConfig.java index 985cbf7d06..5c24368ce6 100644 --- a/spring-boot-modules/spring-boot-swagger-keycloak/src/main/java/com/baeldung/swaggerkeycloak/GlobalSecurityConfig.java +++ b/spring-boot-modules/spring-boot-swagger-keycloak/src/main/java/com/baeldung/swaggerkeycloak/GlobalSecurityConfig.java @@ -1,59 +1,40 @@ package com.baeldung.swaggerkeycloak; -import org.keycloak.adapters.springsecurity.KeycloakConfiguration; -import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider; -import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper; -import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer; import org.springframework.security.core.session.SessionRegistryImpl; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy; import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy; -@KeycloakConfiguration +@Configuration +@EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) -public class GlobalSecurityConfig extends KeycloakWebSecurityConfigurerAdapter { +public class GlobalSecurityConfig { - @Override + @Bean protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl()); } - // otherwise, we'll get an error 'permitAll only works with HttpSecurity.authorizeRequests()' - @Override - protected void configure(HttpSecurity http) throws Exception { - super.configure(http); - http - .csrf().disable() - .authorizeRequests() - // we can set up authorization here alternatively to @Secured methods - .antMatchers(HttpMethod.OPTIONS).permitAll() - .antMatchers("/api/**").authenticated() - // force authentication for all requests (and use global method security) - .anyRequest().permitAll(); + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.csrf() + .disable() + .authorizeRequests() + .requestMatchers(HttpMethod.OPTIONS) + .permitAll() + .requestMatchers("/api/**") + .authenticated() + .anyRequest() + .permitAll(); + http.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt); + return http.build(); } - /* - * re-configure Spring Security to use - * registers the KeycloakAuthenticationProvider with the authentication manager - */ - @Autowired - void configureGlobal(AuthenticationManagerBuilder auth) { - KeycloakAuthenticationProvider provider = keycloakAuthenticationProvider(); - provider.setGrantedAuthoritiesMapper(authoritiesMapper()); - auth.authenticationProvider(provider); - } - - GrantedAuthoritiesMapper authoritiesMapper() { - SimpleAuthorityMapper mapper = new SimpleAuthorityMapper(); - mapper.setPrefix("ROLE_"); // Spring Security adds a prefix to the authority/role names (we use the default here) - mapper.setConvertToUpperCase(true); // convert names to uppercase - mapper.setDefaultAuthority("ROLE_ANONYMOUS"); // set a default authority - return mapper; - } - -} +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-swagger-keycloak/src/main/java/com/baeldung/swaggerkeycloak/KeycloakConfigResolverConfig.java b/spring-boot-modules/spring-boot-swagger-keycloak/src/main/java/com/baeldung/swaggerkeycloak/KeycloakConfigResolverConfig.java deleted file mode 100644 index bca764a17d..0000000000 --- a/spring-boot-modules/spring-boot-swagger-keycloak/src/main/java/com/baeldung/swaggerkeycloak/KeycloakConfigResolverConfig.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.swaggerkeycloak; - -import org.keycloak.adapters.KeycloakConfigResolver; -import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class KeycloakConfigResolverConfig { - - /* - * re-configure keycloak adapter for Spring Boot environment, - * i.e. to read config from application.yml - * (otherwise, we need a keycloak.json file) - */ - @Bean - public KeycloakConfigResolver configResolver() { - return new KeycloakSpringBootConfigResolver(); - } - - - -} diff --git a/spring-boot-modules/spring-boot-swagger-keycloak/src/main/java/com/baeldung/swaggerkeycloak/OpenAPISecurityConfig.java b/spring-boot-modules/spring-boot-swagger-keycloak/src/main/java/com/baeldung/swaggerkeycloak/OpenAPISecurityConfig.java index d3ab26e1ee..8d75a1a885 100644 --- a/spring-boot-modules/spring-boot-swagger-keycloak/src/main/java/com/baeldung/swaggerkeycloak/OpenAPISecurityConfig.java +++ b/spring-boot-modules/spring-boot-swagger-keycloak/src/main/java/com/baeldung/swaggerkeycloak/OpenAPISecurityConfig.java @@ -1,22 +1,17 @@ package com.baeldung.swaggerkeycloak; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpMethod; -import springfox.documentation.builders.OAuth2SchemeBuilder; -import springfox.documentation.service.AuthorizationScope; -import springfox.documentation.service.SecurityReference; -import springfox.documentation.service.SecurityScheme; -import springfox.documentation.spi.service.contexts.SecurityContext; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger.web.SecurityConfiguration; -import springfox.documentation.swagger.web.SecurityConfigurationBuilder; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.security.OAuthFlow; +import io.swagger.v3.oas.models.security.OAuthFlows; +import io.swagger.v3.oas.models.security.Scopes; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; @Configuration public class OpenAPISecurityConfig { @@ -25,59 +20,35 @@ public class OpenAPISecurityConfig { String authServerUrl; @Value("${keycloak.realm}") String realm; - @Value("${keycloak.resource}") - private String clientId; - @Value("${keycloak.credentials.secret}") - private String clientSecret; - @Autowired - void addSecurity(Docket docket) { - docket - .securitySchemes(Collections.singletonList(authenticationScheme())) - .securityContexts(Collections.singletonList(securityContext())); - } - - private SecurityScheme authenticationScheme() { - return new OAuth2SchemeBuilder("implicit") - .name("my_oAuth_security_schema") - .authorizationUrl(authServerUrl + "/realms/" + realm) - .scopes(authorizationScopes()) - .build(); - } - - private List authorizationScopes() { - return Arrays.asList( - new AuthorizationScope("read_access", "read data"), - new AuthorizationScope("write_access", "modify data") - ); - } - - private SecurityContext securityContext() { - return SecurityContext. - builder(). - securityReferences(readAccessAuth()) - .operationSelector(operationContext -> HttpMethod.GET.equals(operationContext.httpMethod())) - .build(); - } - - private List readAccessAuth() { - AuthorizationScope[] authorizationScopes = new AuthorizationScope[] { authorizationScopes().get(0) }; - return Collections.singletonList( - new SecurityReference("my_oAuth_security_schema", authorizationScopes) - ); - } + private static final String OAUTH_SCHEME_NAME = "my_oAuth_security_schema"; @Bean - public SecurityConfiguration security() { - return SecurityConfigurationBuilder.builder() - .clientId(clientId) - .clientSecret(clientSecret) - .realm(realm) - .appName(clientId) - .scopeSeparator(",") - .additionalQueryStringParams(null) - .useBasicAuthenticationWithAccessCodeGrant(false) - .build(); + public OpenAPI openAPI() { + return new OpenAPI().components(new Components() + .addSecuritySchemes(OAUTH_SCHEME_NAME, createOAuthScheme())) + .addSecurityItem(new SecurityRequirement().addList(OAUTH_SCHEME_NAME)) + .info(new Info().title("Todos Management Service") + .description("A service providing todos.") + .version("1.0")); + } + + private SecurityScheme createOAuthScheme() { + OAuthFlows flows = createOAuthFlows(); + return new SecurityScheme().type(SecurityScheme.Type.OAUTH2) + .flows(flows); + } + + private OAuthFlows createOAuthFlows() { + OAuthFlow flow = createAuthorizationCodeFlow(); + return new OAuthFlows().implicit(flow); + } + + private OAuthFlow createAuthorizationCodeFlow() { + return new OAuthFlow() + .authorizationUrl(authServerUrl + "/realms/" + realm + "/protocol/openid-connect/auth") + .scopes(new Scopes().addString("read_access", "read data") + .addString("write_access", "modify data")); } } diff --git a/spring-boot-modules/spring-boot-swagger-keycloak/src/main/java/com/baeldung/swaggerkeycloak/SwaggerUIConfig.java b/spring-boot-modules/spring-boot-swagger-keycloak/src/main/java/com/baeldung/swaggerkeycloak/SwaggerUIConfig.java deleted file mode 100644 index 1207fe5b9e..0000000000 --- a/spring-boot-modules/spring-boot-swagger-keycloak/src/main/java/com/baeldung/swaggerkeycloak/SwaggerUIConfig.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.baeldung.swaggerkeycloak; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.oas.annotations.EnableOpenApi; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; - -import static springfox.documentation.builders.RequestHandlerSelectors.basePackage; - -@EnableOpenApi -@Configuration -class SwaggerUIConfig { - - @Bean - Docket api() { - return new Docket(DocumentationType.OAS_30) - .useDefaultResponseMessages(false) - .select() - .apis(basePackage(TodosApplication.class.getPackage().getName())) - .paths(PathSelectors.any()) - .build() - .apiInfo(apiInfo()); - } - - private ApiInfo apiInfo() { - return new ApiInfoBuilder().title("Todos Management Service") - .description("A service providing todos.") - .version("1.0") - .build(); - } - -} diff --git a/spring-boot-modules/spring-boot-swagger-keycloak/src/main/java/com/baeldung/swaggerkeycloak/TodosController.java b/spring-boot-modules/spring-boot-swagger-keycloak/src/main/java/com/baeldung/swaggerkeycloak/TodosController.java index 6b70072ce3..6d48a0c67d 100644 --- a/spring-boot-modules/spring-boot-swagger-keycloak/src/main/java/com/baeldung/swaggerkeycloak/TodosController.java +++ b/spring-boot-modules/spring-boot-swagger-keycloak/src/main/java/com/baeldung/swaggerkeycloak/TodosController.java @@ -1,14 +1,15 @@ package com.baeldung.swaggerkeycloak; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; import org.springframework.http.MediaType; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + import javax.annotation.PostConstruct; import java.time.LocalDate; import java.util.Collection; @@ -28,13 +29,10 @@ public class TodosController { } @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation("Read all todos") - @ApiResponses({ - @ApiResponse(code = 200, message = "The todos were found and returned.") - }) + @Operation(description = "Read all todos") + @ApiResponses({ @ApiResponse(responseCode = "200", description = "The todos were found and returned.") }) @PreAuthorize("hasAuthority('SCOPE_read_access')") public Collection readAll() { return todos.values(); } - } diff --git a/spring-boot-modules/spring-boot-swagger-keycloak/src/main/resources/META-INF/resources/webjars/springfox-swagger-ui/favicon-16x16.png b/spring-boot-modules/spring-boot-swagger-keycloak/src/main/resources/META-INF/resources/webjars/springfox-swagger-ui/favicon-16x16.png deleted file mode 100644 index 8b194e617af1c135e6b37939591d24ac3a5efa18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 665 zcmV;K0%rY*P)}JKSduyL>)s!A4EhTMMEM%Q;aL6%l#xiZiF>S;#Y{N2Zz%pvTGHJduXuC6Lx-)0EGfRy*N{Tv4i8@4oJ41gw zKzThrcRe|7J~(YYIBq{SYCkn-KQm=N8$CrEK1CcqMI1dv9z#VRL_{D)L|`QmF8}}l zJ9JV`Q}p!p_4f7m_U`WQ@apR4;o;!mnU<7}iG_qr zF(e)x9~BG-3IzcG2M4an0002kNkl41`ZiN1i62V%{PM@Ry|IS_+Yc7{bb`MM~xm(7p4|kMHP&!VGuDW4kFixat zXw43VmgwEvB$hXt_u=vZ>+v4i7E}n~eG6;n4Z=zF1n?T*yg<;W6kOfxpC6nao>VR% z?fpr=asSJ&`L*wu^rLJ5Peq*PB0;alL#XazZCBxJLd&giTfw@!hW167F^`7kobi;( ze<<>qNlP|xy7S1zl@lZNIBR7#o9ybJsptO#%}P0hz~sBp00000NkvXXu0mjfUsDF? diff --git a/spring-boot-modules/spring-boot-swagger-keycloak/src/main/resources/META-INF/resources/webjars/springfox-swagger-ui/favicon-32x32.png b/spring-boot-modules/spring-boot-swagger-keycloak/src/main/resources/META-INF/resources/webjars/springfox-swagger-ui/favicon-32x32.png deleted file mode 100644 index 249737fe44558e679f0b67134e274461d988fa98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 628 zcmV-)0*n2LP)Ma*GM0}OV<074bNCP7P7GVd{iMr*I6y~TMLss@FjvgL~HxU z%Vvj33AwpD(Z4*$Mfx=HaU16axM zt2xG_rloN<$iy9j9I5 - - - Swagger UI: OAuth2 Redirect - - - - - diff --git a/spring-boot-modules/spring-boot-swagger-keycloak/src/main/resources/META-INF/resources/webjars/springfox-swagger-ui/swagger-ui.css b/spring-boot-modules/spring-boot-swagger-keycloak/src/main/resources/META-INF/resources/webjars/springfox-swagger-ui/swagger-ui.css deleted file mode 100644 index e43a572a13..0000000000 --- a/spring-boot-modules/spring-boot-swagger-keycloak/src/main/resources/META-INF/resources/webjars/springfox-swagger-ui/swagger-ui.css +++ /dev/null @@ -1,4 +0,0 @@ -.swagger-ui{color:#3b4151; - /*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */font-family:sans-serif}.swagger-ui html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}.swagger-ui body{margin:0}.swagger-ui article,.swagger-ui aside,.swagger-ui footer,.swagger-ui header,.swagger-ui nav,.swagger-ui section{display:block}.swagger-ui h1{font-size:2em;margin:.67em 0}.swagger-ui figcaption,.swagger-ui figure,.swagger-ui main{display:block}.swagger-ui figure{margin:1em 40px}.swagger-ui hr{box-sizing:content-box;height:0;overflow:visible}.swagger-ui pre{font-family:monospace,monospace;font-size:1em}.swagger-ui a{-webkit-text-decoration-skip:objects;background-color:transparent}.swagger-ui abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.swagger-ui b,.swagger-ui strong{font-weight:inherit;font-weight:bolder}.swagger-ui code,.swagger-ui kbd,.swagger-ui samp{font-family:monospace,monospace;font-size:1em}.swagger-ui dfn{font-style:italic}.swagger-ui mark{background-color:#ff0;color:#000}.swagger-ui small{font-size:80%}.swagger-ui sub,.swagger-ui sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.swagger-ui sub{bottom:-.25em}.swagger-ui sup{top:-.5em}.swagger-ui audio,.swagger-ui video{display:inline-block}.swagger-ui audio:not([controls]){display:none;height:0}.swagger-ui img{border-style:none}.swagger-ui svg:not(:root){overflow:hidden}.swagger-ui button,.swagger-ui input,.swagger-ui optgroup,.swagger-ui select,.swagger-ui textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}.swagger-ui button,.swagger-ui input{overflow:visible}.swagger-ui button,.swagger-ui select{text-transform:none}.swagger-ui [type=reset],.swagger-ui [type=submit],.swagger-ui button,.swagger-ui html [type=button]{-webkit-appearance:button}.swagger-ui [type=button]::-moz-focus-inner,.swagger-ui [type=reset]::-moz-focus-inner,.swagger-ui [type=submit]::-moz-focus-inner,.swagger-ui button::-moz-focus-inner{border-style:none;padding:0}.swagger-ui [type=button]:-moz-focusring,.swagger-ui [type=reset]:-moz-focusring,.swagger-ui [type=submit]:-moz-focusring,.swagger-ui button:-moz-focusring{outline:1px dotted ButtonText}.swagger-ui fieldset{padding:.35em .75em .625em}.swagger-ui legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}.swagger-ui progress{display:inline-block;vertical-align:baseline}.swagger-ui textarea{overflow:auto}.swagger-ui [type=checkbox],.swagger-ui [type=radio]{box-sizing:border-box;padding:0}.swagger-ui [type=number]::-webkit-inner-spin-button,.swagger-ui [type=number]::-webkit-outer-spin-button{height:auto}.swagger-ui [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.swagger-ui [type=search]::-webkit-search-cancel-button,.swagger-ui [type=search]::-webkit-search-decoration{-webkit-appearance:none}.swagger-ui ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.swagger-ui details,.swagger-ui menu{display:block}.swagger-ui summary{display:list-item}.swagger-ui canvas{display:inline-block}.swagger-ui [hidden],.swagger-ui template{display:none}.swagger-ui .debug *{outline:1px solid gold}.swagger-ui .debug-white *{outline:1px solid #fff}.swagger-ui .debug-black *{outline:1px solid #000}.swagger-ui .debug-grid{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTRDOTY4N0U2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTRDOTY4N0Q2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3NjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3NzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsBS+GMAAAAjSURBVHjaYvz//z8DLsD4gcGXiYEAGBIKGBne//fFpwAgwAB98AaF2pjlUQAAAABJRU5ErkJggg==) repeat 0 0}.swagger-ui .debug-grid-16{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODYyRjhERDU2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODYyRjhERDQ2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QTY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3QjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvCS01IAAABMSURBVHjaYmR4/5+BFPBfAMFm/MBgx8RAGWCn1AAmSg34Q6kBDKMGMDCwICeMIemF/5QawEipAWwUhwEjMDvbAWlWkvVBwu8vQIABAEwBCph8U6c0AAAAAElFTkSuQmCC) repeat 0 0}.swagger-ui .debug-grid-8-solid{background:#fff url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAAAAD/4QMxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzExMSA3OS4xNTgzMjUsIDIwMTUvMDkvMTAtMDE6MTA6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIxMjI0OTczNjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIxMjI0OTc0NjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjEyMjQ5NzE2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjEyMjQ5NzI2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAbGhopHSlBJiZBQi8vL0JHPz4+P0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHAR0pKTQmND8oKD9HPzU/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0f/wAARCAAIAAgDASIAAhEBAxEB/8QAWQABAQAAAAAAAAAAAAAAAAAAAAYBAQEAAAAAAAAAAAAAAAAAAAIEEAEBAAMBAAAAAAAAAAAAAAABADECA0ERAAEDBQAAAAAAAAAAAAAAAAARITFBUWESIv/aAAwDAQACEQMRAD8AoOnTV1QTD7JJshP3vSM3P//Z) repeat 0 0}.swagger-ui .debug-grid-16-solid{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzY3MkJEN0U2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzY3MkJEN0Y2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3RDY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pve6J3kAAAAzSURBVHjaYvz//z8D0UDsMwMjSRoYP5Gq4SPNbRjVMEQ1fCRDg+in/6+J1AJUxsgAEGAA31BAJMS0GYEAAAAASUVORK5CYII=) repeat 0 0}.swagger-ui .border-box,.swagger-ui a,.swagger-ui article,.swagger-ui body,.swagger-ui code,.swagger-ui dd,.swagger-ui div,.swagger-ui dl,.swagger-ui dt,.swagger-ui fieldset,.swagger-ui footer,.swagger-ui form,.swagger-ui h1,.swagger-ui h2,.swagger-ui h3,.swagger-ui h4,.swagger-ui h5,.swagger-ui h6,.swagger-ui header,.swagger-ui html,.swagger-ui input[type=email],.swagger-ui input[type=number],.swagger-ui input[type=password],.swagger-ui input[type=tel],.swagger-ui input[type=text],.swagger-ui input[type=url],.swagger-ui legend,.swagger-ui li,.swagger-ui main,.swagger-ui ol,.swagger-ui p,.swagger-ui pre,.swagger-ui section,.swagger-ui table,.swagger-ui td,.swagger-ui textarea,.swagger-ui th,.swagger-ui tr,.swagger-ui ul{box-sizing:border-box}.swagger-ui .aspect-ratio{height:0;position:relative}.swagger-ui .aspect-ratio--16x9{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1{padding-bottom:100%}.swagger-ui .aspect-ratio--object{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}@media screen and (min-width:30em){.swagger-ui .aspect-ratio-ns{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-ns{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-ns{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-ns{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-ns{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-ns{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-ns{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-ns{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-ns{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-ns{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-ns{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-ns{padding-bottom:100%}.swagger-ui .aspect-ratio--object-ns{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .aspect-ratio-m{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-m{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-m{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-m{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-m{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-m{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-m{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-m{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-m{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-m{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-m{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-m{padding-bottom:100%}.swagger-ui .aspect-ratio--object-m{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}@media screen and (min-width:60em){.swagger-ui .aspect-ratio-l{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-l{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-l{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-l{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-l{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-l{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-l{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-l{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-l{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-l{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-l{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-l{padding-bottom:100%}.swagger-ui .aspect-ratio--object-l{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}.swagger-ui img{max-width:100%}.swagger-ui .cover{background-size:cover!important}.swagger-ui .contain{background-size:contain!important}@media screen and (min-width:30em){.swagger-ui .cover-ns{background-size:cover!important}.swagger-ui .contain-ns{background-size:contain!important}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .cover-m{background-size:cover!important}.swagger-ui .contain-m{background-size:contain!important}}@media screen and (min-width:60em){.swagger-ui .cover-l{background-size:cover!important}.swagger-ui .contain-l{background-size:contain!important}}.swagger-ui .bg-center{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left{background-position:0;background-repeat:no-repeat}@media screen and (min-width:30em){.swagger-ui .bg-center-ns{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-ns{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-ns{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-ns{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-ns{background-position:0;background-repeat:no-repeat}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .bg-center-m{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-m{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-m{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-m{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-m{background-position:0;background-repeat:no-repeat}}@media screen and (min-width:60em){.swagger-ui .bg-center-l{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-l{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-l{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-l{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-l{background-position:0;background-repeat:no-repeat}}.swagger-ui .outline{outline:1px solid}.swagger-ui .outline-transparent{outline:1px solid transparent}.swagger-ui .outline-0{outline:0}@media screen and (min-width:30em){.swagger-ui .outline-ns{outline:1px solid}.swagger-ui .outline-transparent-ns{outline:1px solid transparent}.swagger-ui .outline-0-ns{outline:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .outline-m{outline:1px solid}.swagger-ui .outline-transparent-m{outline:1px solid transparent}.swagger-ui .outline-0-m{outline:0}}@media screen and (min-width:60em){.swagger-ui .outline-l{outline:1px solid}.swagger-ui .outline-transparent-l{outline:1px solid transparent}.swagger-ui .outline-0-l{outline:0}}.swagger-ui .ba{border-style:solid;border-width:1px}.swagger-ui .bt{border-top-style:solid;border-top-width:1px}.swagger-ui .br{border-right-style:solid;border-right-width:1px}.swagger-ui .bb{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl{border-left-style:solid;border-left-width:1px}.swagger-ui .bn{border-style:none;border-width:0}@media screen and (min-width:30em){.swagger-ui .ba-ns{border-style:solid;border-width:1px}.swagger-ui .bt-ns{border-top-style:solid;border-top-width:1px}.swagger-ui .br-ns{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-ns{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-ns{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-ns{border-style:none;border-width:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ba-m{border-style:solid;border-width:1px}.swagger-ui .bt-m{border-top-style:solid;border-top-width:1px}.swagger-ui .br-m{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-m{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-m{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-m{border-style:none;border-width:0}}@media screen and (min-width:60em){.swagger-ui .ba-l{border-style:solid;border-width:1px}.swagger-ui .bt-l{border-top-style:solid;border-top-width:1px}.swagger-ui .br-l{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-l{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-l{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-l{border-style:none;border-width:0}}.swagger-ui .b--black{border-color:#000}.swagger-ui .b--near-black{border-color:#111}.swagger-ui .b--dark-gray{border-color:#333}.swagger-ui .b--mid-gray{border-color:#555}.swagger-ui .b--gray{border-color:#777}.swagger-ui .b--silver{border-color:#999}.swagger-ui .b--light-silver{border-color:#aaa}.swagger-ui .b--moon-gray{border-color:#ccc}.swagger-ui .b--light-gray{border-color:#eee}.swagger-ui .b--near-white{border-color:#f4f4f4}.swagger-ui .b--white{border-color:#fff}.swagger-ui .b--white-90{border-color:hsla(0,0%,100%,.9)}.swagger-ui .b--white-80{border-color:hsla(0,0%,100%,.8)}.swagger-ui .b--white-70{border-color:hsla(0,0%,100%,.7)}.swagger-ui .b--white-60{border-color:hsla(0,0%,100%,.6)}.swagger-ui .b--white-50{border-color:hsla(0,0%,100%,.5)}.swagger-ui .b--white-40{border-color:hsla(0,0%,100%,.4)}.swagger-ui .b--white-30{border-color:hsla(0,0%,100%,.3)}.swagger-ui .b--white-20{border-color:hsla(0,0%,100%,.2)}.swagger-ui .b--white-10{border-color:hsla(0,0%,100%,.1)}.swagger-ui .b--white-05{border-color:hsla(0,0%,100%,.05)}.swagger-ui .b--white-025{border-color:hsla(0,0%,100%,.025)}.swagger-ui .b--white-0125{border-color:hsla(0,0%,100%,.013)}.swagger-ui .b--black-90{border-color:rgba(0,0,0,.9)}.swagger-ui .b--black-80{border-color:rgba(0,0,0,.8)}.swagger-ui .b--black-70{border-color:rgba(0,0,0,.7)}.swagger-ui .b--black-60{border-color:rgba(0,0,0,.6)}.swagger-ui .b--black-50{border-color:rgba(0,0,0,.5)}.swagger-ui .b--black-40{border-color:rgba(0,0,0,.4)}.swagger-ui .b--black-30{border-color:rgba(0,0,0,.3)}.swagger-ui .b--black-20{border-color:rgba(0,0,0,.2)}.swagger-ui .b--black-10{border-color:rgba(0,0,0,.1)}.swagger-ui .b--black-05{border-color:rgba(0,0,0,.05)}.swagger-ui .b--black-025{border-color:rgba(0,0,0,.025)}.swagger-ui .b--black-0125{border-color:rgba(0,0,0,.013)}.swagger-ui .b--dark-red{border-color:#e7040f}.swagger-ui .b--red{border-color:#ff4136}.swagger-ui .b--light-red{border-color:#ff725c}.swagger-ui .b--orange{border-color:#ff6300}.swagger-ui .b--gold{border-color:#ffb700}.swagger-ui .b--yellow{border-color:gold}.swagger-ui .b--light-yellow{border-color:#fbf1a9}.swagger-ui .b--purple{border-color:#5e2ca5}.swagger-ui .b--light-purple{border-color:#a463f2}.swagger-ui .b--dark-pink{border-color:#d5008f}.swagger-ui .b--hot-pink{border-color:#ff41b4}.swagger-ui .b--pink{border-color:#ff80cc}.swagger-ui .b--light-pink{border-color:#ffa3d7}.swagger-ui .b--dark-green{border-color:#137752}.swagger-ui .b--green{border-color:#19a974}.swagger-ui .b--light-green{border-color:#9eebcf}.swagger-ui .b--navy{border-color:#001b44}.swagger-ui .b--dark-blue{border-color:#00449e}.swagger-ui .b--blue{border-color:#357edd}.swagger-ui .b--light-blue{border-color:#96ccff}.swagger-ui .b--lightest-blue{border-color:#cdecff}.swagger-ui .b--washed-blue{border-color:#f6fffe}.swagger-ui .b--washed-green{border-color:#e8fdf5}.swagger-ui .b--washed-yellow{border-color:#fffceb}.swagger-ui .b--washed-red{border-color:#ffdfdf}.swagger-ui .b--transparent{border-color:transparent}.swagger-ui .b--inherit{border-color:inherit}.swagger-ui .br0{border-radius:0}.swagger-ui .br1{border-radius:.125rem}.swagger-ui .br2{border-radius:.25rem}.swagger-ui .br3{border-radius:.5rem}.swagger-ui .br4{border-radius:1rem}.swagger-ui .br-100{border-radius:100%}.swagger-ui .br-pill{border-radius:9999px}.swagger-ui .br--bottom{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left{border-bottom-right-radius:0;border-top-right-radius:0}@media screen and (min-width:30em){.swagger-ui .br0-ns{border-radius:0}.swagger-ui .br1-ns{border-radius:.125rem}.swagger-ui .br2-ns{border-radius:.25rem}.swagger-ui .br3-ns{border-radius:.5rem}.swagger-ui .br4-ns{border-radius:1rem}.swagger-ui .br-100-ns{border-radius:100%}.swagger-ui .br-pill-ns{border-radius:9999px}.swagger-ui .br--bottom-ns{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-ns{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-ns{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-ns{border-bottom-right-radius:0;border-top-right-radius:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .br0-m{border-radius:0}.swagger-ui .br1-m{border-radius:.125rem}.swagger-ui .br2-m{border-radius:.25rem}.swagger-ui .br3-m{border-radius:.5rem}.swagger-ui .br4-m{border-radius:1rem}.swagger-ui .br-100-m{border-radius:100%}.swagger-ui .br-pill-m{border-radius:9999px}.swagger-ui .br--bottom-m{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-m{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-m{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-m{border-bottom-right-radius:0;border-top-right-radius:0}}@media screen and (min-width:60em){.swagger-ui .br0-l{border-radius:0}.swagger-ui .br1-l{border-radius:.125rem}.swagger-ui .br2-l{border-radius:.25rem}.swagger-ui .br3-l{border-radius:.5rem}.swagger-ui .br4-l{border-radius:1rem}.swagger-ui .br-100-l{border-radius:100%}.swagger-ui .br-pill-l{border-radius:9999px}.swagger-ui .br--bottom-l{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-l{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-l{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-l{border-bottom-right-radius:0;border-top-right-radius:0}}.swagger-ui .b--dotted{border-style:dotted}.swagger-ui .b--dashed{border-style:dashed}.swagger-ui .b--solid{border-style:solid}.swagger-ui .b--none{border-style:none}@media screen and (min-width:30em){.swagger-ui .b--dotted-ns{border-style:dotted}.swagger-ui .b--dashed-ns{border-style:dashed}.swagger-ui .b--solid-ns{border-style:solid}.swagger-ui .b--none-ns{border-style:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .b--dotted-m{border-style:dotted}.swagger-ui .b--dashed-m{border-style:dashed}.swagger-ui .b--solid-m{border-style:solid}.swagger-ui .b--none-m{border-style:none}}@media screen and (min-width:60em){.swagger-ui .b--dotted-l{border-style:dotted}.swagger-ui .b--dashed-l{border-style:dashed}.swagger-ui .b--solid-l{border-style:solid}.swagger-ui .b--none-l{border-style:none}}.swagger-ui .bw0{border-width:0}.swagger-ui .bw1{border-width:.125rem}.swagger-ui .bw2{border-width:.25rem}.swagger-ui .bw3{border-width:.5rem}.swagger-ui .bw4{border-width:1rem}.swagger-ui .bw5{border-width:2rem}.swagger-ui .bt-0{border-top-width:0}.swagger-ui .br-0{border-right-width:0}.swagger-ui .bb-0{border-bottom-width:0}.swagger-ui .bl-0{border-left-width:0}@media screen and (min-width:30em){.swagger-ui .bw0-ns{border-width:0}.swagger-ui .bw1-ns{border-width:.125rem}.swagger-ui .bw2-ns{border-width:.25rem}.swagger-ui .bw3-ns{border-width:.5rem}.swagger-ui .bw4-ns{border-width:1rem}.swagger-ui .bw5-ns{border-width:2rem}.swagger-ui .bt-0-ns{border-top-width:0}.swagger-ui .br-0-ns{border-right-width:0}.swagger-ui .bb-0-ns{border-bottom-width:0}.swagger-ui .bl-0-ns{border-left-width:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .bw0-m{border-width:0}.swagger-ui .bw1-m{border-width:.125rem}.swagger-ui .bw2-m{border-width:.25rem}.swagger-ui .bw3-m{border-width:.5rem}.swagger-ui .bw4-m{border-width:1rem}.swagger-ui .bw5-m{border-width:2rem}.swagger-ui .bt-0-m{border-top-width:0}.swagger-ui .br-0-m{border-right-width:0}.swagger-ui .bb-0-m{border-bottom-width:0}.swagger-ui .bl-0-m{border-left-width:0}}@media screen and (min-width:60em){.swagger-ui .bw0-l{border-width:0}.swagger-ui .bw1-l{border-width:.125rem}.swagger-ui .bw2-l{border-width:.25rem}.swagger-ui .bw3-l{border-width:.5rem}.swagger-ui .bw4-l{border-width:1rem}.swagger-ui .bw5-l{border-width:2rem}.swagger-ui .bt-0-l{border-top-width:0}.swagger-ui .br-0-l{border-right-width:0}.swagger-ui .bb-0-l{border-bottom-width:0}.swagger-ui .bl-0-l{border-left-width:0}}.swagger-ui .shadow-1{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}@media screen and (min-width:30em){.swagger-ui .shadow-1-ns{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-ns{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-ns{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-ns{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-ns{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .shadow-1-m{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-m{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-m{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-m{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-m{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}@media screen and (min-width:60em){.swagger-ui .shadow-1-l{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-l{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-l{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-l{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-l{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}.swagger-ui .pre{overflow-x:auto;overflow-y:hidden;overflow:scroll}.swagger-ui .top-0{top:0}.swagger-ui .right-0{right:0}.swagger-ui .bottom-0{bottom:0}.swagger-ui .left-0{left:0}.swagger-ui .top-1{top:1rem}.swagger-ui .right-1{right:1rem}.swagger-ui .bottom-1{bottom:1rem}.swagger-ui .left-1{left:1rem}.swagger-ui .top-2{top:2rem}.swagger-ui .right-2{right:2rem}.swagger-ui .bottom-2{bottom:2rem}.swagger-ui .left-2{left:2rem}.swagger-ui .top--1{top:-1rem}.swagger-ui .right--1{right:-1rem}.swagger-ui .bottom--1{bottom:-1rem}.swagger-ui .left--1{left:-1rem}.swagger-ui .top--2{top:-2rem}.swagger-ui .right--2{right:-2rem}.swagger-ui .bottom--2{bottom:-2rem}.swagger-ui .left--2{left:-2rem}.swagger-ui .absolute--fill{bottom:0;left:0;right:0;top:0}@media screen and (min-width:30em){.swagger-ui .top-0-ns{top:0}.swagger-ui .left-0-ns{left:0}.swagger-ui .right-0-ns{right:0}.swagger-ui .bottom-0-ns{bottom:0}.swagger-ui .top-1-ns{top:1rem}.swagger-ui .left-1-ns{left:1rem}.swagger-ui .right-1-ns{right:1rem}.swagger-ui .bottom-1-ns{bottom:1rem}.swagger-ui .top-2-ns{top:2rem}.swagger-ui .left-2-ns{left:2rem}.swagger-ui .right-2-ns{right:2rem}.swagger-ui .bottom-2-ns{bottom:2rem}.swagger-ui .top--1-ns{top:-1rem}.swagger-ui .right--1-ns{right:-1rem}.swagger-ui .bottom--1-ns{bottom:-1rem}.swagger-ui .left--1-ns{left:-1rem}.swagger-ui .top--2-ns{top:-2rem}.swagger-ui .right--2-ns{right:-2rem}.swagger-ui .bottom--2-ns{bottom:-2rem}.swagger-ui .left--2-ns{left:-2rem}.swagger-ui .absolute--fill-ns{bottom:0;left:0;right:0;top:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .top-0-m{top:0}.swagger-ui .left-0-m{left:0}.swagger-ui .right-0-m{right:0}.swagger-ui .bottom-0-m{bottom:0}.swagger-ui .top-1-m{top:1rem}.swagger-ui .left-1-m{left:1rem}.swagger-ui .right-1-m{right:1rem}.swagger-ui .bottom-1-m{bottom:1rem}.swagger-ui .top-2-m{top:2rem}.swagger-ui .left-2-m{left:2rem}.swagger-ui .right-2-m{right:2rem}.swagger-ui .bottom-2-m{bottom:2rem}.swagger-ui .top--1-m{top:-1rem}.swagger-ui .right--1-m{right:-1rem}.swagger-ui .bottom--1-m{bottom:-1rem}.swagger-ui .left--1-m{left:-1rem}.swagger-ui .top--2-m{top:-2rem}.swagger-ui .right--2-m{right:-2rem}.swagger-ui .bottom--2-m{bottom:-2rem}.swagger-ui .left--2-m{left:-2rem}.swagger-ui .absolute--fill-m{bottom:0;left:0;right:0;top:0}}@media screen and (min-width:60em){.swagger-ui .top-0-l{top:0}.swagger-ui .left-0-l{left:0}.swagger-ui .right-0-l{right:0}.swagger-ui .bottom-0-l{bottom:0}.swagger-ui .top-1-l{top:1rem}.swagger-ui .left-1-l{left:1rem}.swagger-ui .right-1-l{right:1rem}.swagger-ui .bottom-1-l{bottom:1rem}.swagger-ui .top-2-l{top:2rem}.swagger-ui .left-2-l{left:2rem}.swagger-ui .right-2-l{right:2rem}.swagger-ui .bottom-2-l{bottom:2rem}.swagger-ui .top--1-l{top:-1rem}.swagger-ui .right--1-l{right:-1rem}.swagger-ui .bottom--1-l{bottom:-1rem}.swagger-ui .left--1-l{left:-1rem}.swagger-ui .top--2-l{top:-2rem}.swagger-ui .right--2-l{right:-2rem}.swagger-ui .bottom--2-l{bottom:-2rem}.swagger-ui .left--2-l{left:-2rem}.swagger-ui .absolute--fill-l{bottom:0;left:0;right:0;top:0}}.swagger-ui .cf:after,.swagger-ui .cf:before{content:" ";display:table}.swagger-ui .cf:after{clear:both}.swagger-ui .cf{*zoom:1}.swagger-ui .cl{clear:left}.swagger-ui .cr{clear:right}.swagger-ui .cb{clear:both}.swagger-ui .cn{clear:none}@media screen and (min-width:30em){.swagger-ui .cl-ns{clear:left}.swagger-ui .cr-ns{clear:right}.swagger-ui .cb-ns{clear:both}.swagger-ui .cn-ns{clear:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .cl-m{clear:left}.swagger-ui .cr-m{clear:right}.swagger-ui .cb-m{clear:both}.swagger-ui .cn-m{clear:none}}@media screen and (min-width:60em){.swagger-ui .cl-l{clear:left}.swagger-ui .cr-l{clear:right}.swagger-ui .cb-l{clear:both}.swagger-ui .cn-l{clear:none}}.swagger-ui .flex{display:flex}.swagger-ui .inline-flex{display:inline-flex}.swagger-ui .flex-auto{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none{flex:none}.swagger-ui .flex-column{flex-direction:column}.swagger-ui .flex-row{flex-direction:row}.swagger-ui .flex-wrap{flex-wrap:wrap}.swagger-ui .flex-nowrap{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse{flex-direction:column-reverse}.swagger-ui .flex-row-reverse{flex-direction:row-reverse}.swagger-ui .items-start{align-items:flex-start}.swagger-ui .items-end{align-items:flex-end}.swagger-ui .items-center{align-items:center}.swagger-ui .items-baseline{align-items:baseline}.swagger-ui .items-stretch{align-items:stretch}.swagger-ui .self-start{align-self:flex-start}.swagger-ui .self-end{align-self:flex-end}.swagger-ui .self-center{align-self:center}.swagger-ui .self-baseline{align-self:baseline}.swagger-ui .self-stretch{align-self:stretch}.swagger-ui .justify-start{justify-content:flex-start}.swagger-ui .justify-end{justify-content:flex-end}.swagger-ui .justify-center{justify-content:center}.swagger-ui .justify-between{justify-content:space-between}.swagger-ui .justify-around{justify-content:space-around}.swagger-ui .content-start{align-content:flex-start}.swagger-ui .content-end{align-content:flex-end}.swagger-ui .content-center{align-content:center}.swagger-ui .content-between{align-content:space-between}.swagger-ui .content-around{align-content:space-around}.swagger-ui .content-stretch{align-content:stretch}.swagger-ui .order-0{order:0}.swagger-ui .order-1{order:1}.swagger-ui .order-2{order:2}.swagger-ui .order-3{order:3}.swagger-ui .order-4{order:4}.swagger-ui .order-5{order:5}.swagger-ui .order-6{order:6}.swagger-ui .order-7{order:7}.swagger-ui .order-8{order:8}.swagger-ui .order-last{order:99999}.swagger-ui .flex-grow-0{flex-grow:0}.swagger-ui .flex-grow-1{flex-grow:1}.swagger-ui .flex-shrink-0{flex-shrink:0}.swagger-ui .flex-shrink-1{flex-shrink:1}@media screen and (min-width:30em){.swagger-ui .flex-ns{display:flex}.swagger-ui .inline-flex-ns{display:inline-flex}.swagger-ui .flex-auto-ns{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-ns{flex:none}.swagger-ui .flex-column-ns{flex-direction:column}.swagger-ui .flex-row-ns{flex-direction:row}.swagger-ui .flex-wrap-ns{flex-wrap:wrap}.swagger-ui .flex-nowrap-ns{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-ns{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-ns{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-ns{flex-direction:row-reverse}.swagger-ui .items-start-ns{align-items:flex-start}.swagger-ui .items-end-ns{align-items:flex-end}.swagger-ui .items-center-ns{align-items:center}.swagger-ui .items-baseline-ns{align-items:baseline}.swagger-ui .items-stretch-ns{align-items:stretch}.swagger-ui .self-start-ns{align-self:flex-start}.swagger-ui .self-end-ns{align-self:flex-end}.swagger-ui .self-center-ns{align-self:center}.swagger-ui .self-baseline-ns{align-self:baseline}.swagger-ui .self-stretch-ns{align-self:stretch}.swagger-ui .justify-start-ns{justify-content:flex-start}.swagger-ui .justify-end-ns{justify-content:flex-end}.swagger-ui .justify-center-ns{justify-content:center}.swagger-ui .justify-between-ns{justify-content:space-between}.swagger-ui .justify-around-ns{justify-content:space-around}.swagger-ui .content-start-ns{align-content:flex-start}.swagger-ui .content-end-ns{align-content:flex-end}.swagger-ui .content-center-ns{align-content:center}.swagger-ui .content-between-ns{align-content:space-between}.swagger-ui .content-around-ns{align-content:space-around}.swagger-ui .content-stretch-ns{align-content:stretch}.swagger-ui .order-0-ns{order:0}.swagger-ui .order-1-ns{order:1}.swagger-ui .order-2-ns{order:2}.swagger-ui .order-3-ns{order:3}.swagger-ui .order-4-ns{order:4}.swagger-ui .order-5-ns{order:5}.swagger-ui .order-6-ns{order:6}.swagger-ui .order-7-ns{order:7}.swagger-ui .order-8-ns{order:8}.swagger-ui .order-last-ns{order:99999}.swagger-ui .flex-grow-0-ns{flex-grow:0}.swagger-ui .flex-grow-1-ns{flex-grow:1}.swagger-ui .flex-shrink-0-ns{flex-shrink:0}.swagger-ui .flex-shrink-1-ns{flex-shrink:1}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .flex-m{display:flex}.swagger-ui .inline-flex-m{display:inline-flex}.swagger-ui .flex-auto-m{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-m{flex:none}.swagger-ui .flex-column-m{flex-direction:column}.swagger-ui .flex-row-m{flex-direction:row}.swagger-ui .flex-wrap-m{flex-wrap:wrap}.swagger-ui .flex-nowrap-m{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-m{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-m{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-m{flex-direction:row-reverse}.swagger-ui .items-start-m{align-items:flex-start}.swagger-ui .items-end-m{align-items:flex-end}.swagger-ui .items-center-m{align-items:center}.swagger-ui .items-baseline-m{align-items:baseline}.swagger-ui .items-stretch-m{align-items:stretch}.swagger-ui .self-start-m{align-self:flex-start}.swagger-ui .self-end-m{align-self:flex-end}.swagger-ui .self-center-m{align-self:center}.swagger-ui .self-baseline-m{align-self:baseline}.swagger-ui .self-stretch-m{align-self:stretch}.swagger-ui .justify-start-m{justify-content:flex-start}.swagger-ui .justify-end-m{justify-content:flex-end}.swagger-ui .justify-center-m{justify-content:center}.swagger-ui .justify-between-m{justify-content:space-between}.swagger-ui .justify-around-m{justify-content:space-around}.swagger-ui .content-start-m{align-content:flex-start}.swagger-ui .content-end-m{align-content:flex-end}.swagger-ui .content-center-m{align-content:center}.swagger-ui .content-between-m{align-content:space-between}.swagger-ui .content-around-m{align-content:space-around}.swagger-ui .content-stretch-m{align-content:stretch}.swagger-ui .order-0-m{order:0}.swagger-ui .order-1-m{order:1}.swagger-ui .order-2-m{order:2}.swagger-ui .order-3-m{order:3}.swagger-ui .order-4-m{order:4}.swagger-ui .order-5-m{order:5}.swagger-ui .order-6-m{order:6}.swagger-ui .order-7-m{order:7}.swagger-ui .order-8-m{order:8}.swagger-ui .order-last-m{order:99999}.swagger-ui .flex-grow-0-m{flex-grow:0}.swagger-ui .flex-grow-1-m{flex-grow:1}.swagger-ui .flex-shrink-0-m{flex-shrink:0}.swagger-ui .flex-shrink-1-m{flex-shrink:1}}@media screen and (min-width:60em){.swagger-ui .flex-l{display:flex}.swagger-ui .inline-flex-l{display:inline-flex}.swagger-ui .flex-auto-l{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-l{flex:none}.swagger-ui .flex-column-l{flex-direction:column}.swagger-ui .flex-row-l{flex-direction:row}.swagger-ui .flex-wrap-l{flex-wrap:wrap}.swagger-ui .flex-nowrap-l{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-l{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-l{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-l{flex-direction:row-reverse}.swagger-ui .items-start-l{align-items:flex-start}.swagger-ui .items-end-l{align-items:flex-end}.swagger-ui .items-center-l{align-items:center}.swagger-ui .items-baseline-l{align-items:baseline}.swagger-ui .items-stretch-l{align-items:stretch}.swagger-ui .self-start-l{align-self:flex-start}.swagger-ui .self-end-l{align-self:flex-end}.swagger-ui .self-center-l{align-self:center}.swagger-ui .self-baseline-l{align-self:baseline}.swagger-ui .self-stretch-l{align-self:stretch}.swagger-ui .justify-start-l{justify-content:flex-start}.swagger-ui .justify-end-l{justify-content:flex-end}.swagger-ui .justify-center-l{justify-content:center}.swagger-ui .justify-between-l{justify-content:space-between}.swagger-ui .justify-around-l{justify-content:space-around}.swagger-ui .content-start-l{align-content:flex-start}.swagger-ui .content-end-l{align-content:flex-end}.swagger-ui .content-center-l{align-content:center}.swagger-ui .content-between-l{align-content:space-between}.swagger-ui .content-around-l{align-content:space-around}.swagger-ui .content-stretch-l{align-content:stretch}.swagger-ui .order-0-l{order:0}.swagger-ui .order-1-l{order:1}.swagger-ui .order-2-l{order:2}.swagger-ui .order-3-l{order:3}.swagger-ui .order-4-l{order:4}.swagger-ui .order-5-l{order:5}.swagger-ui .order-6-l{order:6}.swagger-ui .order-7-l{order:7}.swagger-ui .order-8-l{order:8}.swagger-ui .order-last-l{order:99999}.swagger-ui .flex-grow-0-l{flex-grow:0}.swagger-ui .flex-grow-1-l{flex-grow:1}.swagger-ui .flex-shrink-0-l{flex-shrink:0}.swagger-ui .flex-shrink-1-l{flex-shrink:1}}.swagger-ui .dn{display:none}.swagger-ui .di{display:inline}.swagger-ui .db{display:block}.swagger-ui .dib{display:inline-block}.swagger-ui .dit{display:inline-table}.swagger-ui .dt{display:table}.swagger-ui .dtc{display:table-cell}.swagger-ui .dt-row{display:table-row}.swagger-ui .dt-row-group{display:table-row-group}.swagger-ui .dt-column{display:table-column}.swagger-ui .dt-column-group{display:table-column-group}.swagger-ui .dt--fixed{table-layout:fixed;width:100%}@media screen and (min-width:30em){.swagger-ui .dn-ns{display:none}.swagger-ui .di-ns{display:inline}.swagger-ui .db-ns{display:block}.swagger-ui .dib-ns{display:inline-block}.swagger-ui .dit-ns{display:inline-table}.swagger-ui .dt-ns{display:table}.swagger-ui .dtc-ns{display:table-cell}.swagger-ui .dt-row-ns{display:table-row}.swagger-ui .dt-row-group-ns{display:table-row-group}.swagger-ui .dt-column-ns{display:table-column}.swagger-ui .dt-column-group-ns{display:table-column-group}.swagger-ui .dt--fixed-ns{table-layout:fixed;width:100%}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .dn-m{display:none}.swagger-ui .di-m{display:inline}.swagger-ui .db-m{display:block}.swagger-ui .dib-m{display:inline-block}.swagger-ui .dit-m{display:inline-table}.swagger-ui .dt-m{display:table}.swagger-ui .dtc-m{display:table-cell}.swagger-ui .dt-row-m{display:table-row}.swagger-ui .dt-row-group-m{display:table-row-group}.swagger-ui .dt-column-m{display:table-column}.swagger-ui .dt-column-group-m{display:table-column-group}.swagger-ui .dt--fixed-m{table-layout:fixed;width:100%}}@media screen and (min-width:60em){.swagger-ui .dn-l{display:none}.swagger-ui .di-l{display:inline}.swagger-ui .db-l{display:block}.swagger-ui .dib-l{display:inline-block}.swagger-ui .dit-l{display:inline-table}.swagger-ui .dt-l{display:table}.swagger-ui .dtc-l{display:table-cell}.swagger-ui .dt-row-l{display:table-row}.swagger-ui .dt-row-group-l{display:table-row-group}.swagger-ui .dt-column-l{display:table-column}.swagger-ui .dt-column-group-l{display:table-column-group}.swagger-ui .dt--fixed-l{table-layout:fixed;width:100%}}.swagger-ui .fl{_display:inline;float:left}.swagger-ui .fr{_display:inline;float:right}.swagger-ui .fn{float:none}@media screen and (min-width:30em){.swagger-ui .fl-ns{_display:inline;float:left}.swagger-ui .fr-ns{_display:inline;float:right}.swagger-ui .fn-ns{float:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .fl-m{_display:inline;float:left}.swagger-ui .fr-m{_display:inline;float:right}.swagger-ui .fn-m{float:none}}@media screen and (min-width:60em){.swagger-ui .fl-l{_display:inline;float:left}.swagger-ui .fr-l{_display:inline;float:right}.swagger-ui .fn-l{float:none}}.swagger-ui .sans-serif{font-family:-apple-system,BlinkMacSystemFont,avenir next,avenir,helvetica,helvetica neue,ubuntu,roboto,noto,segoe ui,arial,sans-serif}.swagger-ui .serif{font-family:georgia,serif}.swagger-ui .system-sans-serif{font-family:sans-serif}.swagger-ui .system-serif{font-family:serif}.swagger-ui .code,.swagger-ui code{font-family:Consolas,monaco,monospace}.swagger-ui .courier{font-family:Courier Next,courier,monospace}.swagger-ui .helvetica{font-family:helvetica neue,helvetica,sans-serif}.swagger-ui .avenir{font-family:avenir next,avenir,sans-serif}.swagger-ui .athelas{font-family:athelas,georgia,serif}.swagger-ui .georgia{font-family:georgia,serif}.swagger-ui .times{font-family:times,serif}.swagger-ui .bodoni{font-family:Bodoni MT,serif}.swagger-ui .calisto{font-family:Calisto MT,serif}.swagger-ui .garamond{font-family:garamond,serif}.swagger-ui .baskerville{font-family:baskerville,serif}.swagger-ui .i{font-style:italic}.swagger-ui .fs-normal{font-style:normal}@media screen and (min-width:30em){.swagger-ui .i-ns{font-style:italic}.swagger-ui .fs-normal-ns{font-style:normal}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .i-m{font-style:italic}.swagger-ui .fs-normal-m{font-style:normal}}@media screen and (min-width:60em){.swagger-ui .i-l{font-style:italic}.swagger-ui .fs-normal-l{font-style:normal}}.swagger-ui .normal{font-weight:400}.swagger-ui .b{font-weight:700}.swagger-ui .fw1{font-weight:100}.swagger-ui .fw2{font-weight:200}.swagger-ui .fw3{font-weight:300}.swagger-ui .fw4{font-weight:400}.swagger-ui .fw5{font-weight:500}.swagger-ui .fw6{font-weight:600}.swagger-ui .fw7{font-weight:700}.swagger-ui .fw8{font-weight:800}.swagger-ui .fw9{font-weight:900}@media screen and (min-width:30em){.swagger-ui .normal-ns{font-weight:400}.swagger-ui .b-ns{font-weight:700}.swagger-ui .fw1-ns{font-weight:100}.swagger-ui .fw2-ns{font-weight:200}.swagger-ui .fw3-ns{font-weight:300}.swagger-ui .fw4-ns{font-weight:400}.swagger-ui .fw5-ns{font-weight:500}.swagger-ui .fw6-ns{font-weight:600}.swagger-ui .fw7-ns{font-weight:700}.swagger-ui .fw8-ns{font-weight:800}.swagger-ui .fw9-ns{font-weight:900}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .normal-m{font-weight:400}.swagger-ui .b-m{font-weight:700}.swagger-ui .fw1-m{font-weight:100}.swagger-ui .fw2-m{font-weight:200}.swagger-ui .fw3-m{font-weight:300}.swagger-ui .fw4-m{font-weight:400}.swagger-ui .fw5-m{font-weight:500}.swagger-ui .fw6-m{font-weight:600}.swagger-ui .fw7-m{font-weight:700}.swagger-ui .fw8-m{font-weight:800}.swagger-ui .fw9-m{font-weight:900}}@media screen and (min-width:60em){.swagger-ui .normal-l{font-weight:400}.swagger-ui .b-l{font-weight:700}.swagger-ui .fw1-l{font-weight:100}.swagger-ui .fw2-l{font-weight:200}.swagger-ui .fw3-l{font-weight:300}.swagger-ui .fw4-l{font-weight:400}.swagger-ui .fw5-l{font-weight:500}.swagger-ui .fw6-l{font-weight:600}.swagger-ui .fw7-l{font-weight:700}.swagger-ui .fw8-l{font-weight:800}.swagger-ui .fw9-l{font-weight:900}}.swagger-ui .input-reset{-webkit-appearance:none;-moz-appearance:none}.swagger-ui .button-reset::-moz-focus-inner,.swagger-ui .input-reset::-moz-focus-inner{border:0;padding:0}.swagger-ui .h1{height:1rem}.swagger-ui .h2{height:2rem}.swagger-ui .h3{height:4rem}.swagger-ui .h4{height:8rem}.swagger-ui .h5{height:16rem}.swagger-ui .h-25{height:25%}.swagger-ui .h-50{height:50%}.swagger-ui .h-75{height:75%}.swagger-ui .h-100{height:100%}.swagger-ui .min-h-100{min-height:100%}.swagger-ui .vh-25{height:25vh}.swagger-ui .vh-50{height:50vh}.swagger-ui .vh-75{height:75vh}.swagger-ui .vh-100{height:100vh}.swagger-ui .min-vh-100{min-height:100vh}.swagger-ui .h-auto{height:auto}.swagger-ui .h-inherit{height:inherit}@media screen and (min-width:30em){.swagger-ui .h1-ns{height:1rem}.swagger-ui .h2-ns{height:2rem}.swagger-ui .h3-ns{height:4rem}.swagger-ui .h4-ns{height:8rem}.swagger-ui .h5-ns{height:16rem}.swagger-ui .h-25-ns{height:25%}.swagger-ui .h-50-ns{height:50%}.swagger-ui .h-75-ns{height:75%}.swagger-ui .h-100-ns{height:100%}.swagger-ui .min-h-100-ns{min-height:100%}.swagger-ui .vh-25-ns{height:25vh}.swagger-ui .vh-50-ns{height:50vh}.swagger-ui .vh-75-ns{height:75vh}.swagger-ui .vh-100-ns{height:100vh}.swagger-ui .min-vh-100-ns{min-height:100vh}.swagger-ui .h-auto-ns{height:auto}.swagger-ui .h-inherit-ns{height:inherit}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .h1-m{height:1rem}.swagger-ui .h2-m{height:2rem}.swagger-ui .h3-m{height:4rem}.swagger-ui .h4-m{height:8rem}.swagger-ui .h5-m{height:16rem}.swagger-ui .h-25-m{height:25%}.swagger-ui .h-50-m{height:50%}.swagger-ui .h-75-m{height:75%}.swagger-ui .h-100-m{height:100%}.swagger-ui .min-h-100-m{min-height:100%}.swagger-ui .vh-25-m{height:25vh}.swagger-ui .vh-50-m{height:50vh}.swagger-ui .vh-75-m{height:75vh}.swagger-ui .vh-100-m{height:100vh}.swagger-ui .min-vh-100-m{min-height:100vh}.swagger-ui .h-auto-m{height:auto}.swagger-ui .h-inherit-m{height:inherit}}@media screen and (min-width:60em){.swagger-ui .h1-l{height:1rem}.swagger-ui .h2-l{height:2rem}.swagger-ui .h3-l{height:4rem}.swagger-ui .h4-l{height:8rem}.swagger-ui .h5-l{height:16rem}.swagger-ui .h-25-l{height:25%}.swagger-ui .h-50-l{height:50%}.swagger-ui .h-75-l{height:75%}.swagger-ui .h-100-l{height:100%}.swagger-ui .min-h-100-l{min-height:100%}.swagger-ui .vh-25-l{height:25vh}.swagger-ui .vh-50-l{height:50vh}.swagger-ui .vh-75-l{height:75vh}.swagger-ui .vh-100-l{height:100vh}.swagger-ui .min-vh-100-l{min-height:100vh}.swagger-ui .h-auto-l{height:auto}.swagger-ui .h-inherit-l{height:inherit}}.swagger-ui .tracked{letter-spacing:.1em}.swagger-ui .tracked-tight{letter-spacing:-.05em}.swagger-ui .tracked-mega{letter-spacing:.25em}@media screen and (min-width:30em){.swagger-ui .tracked-ns{letter-spacing:.1em}.swagger-ui .tracked-tight-ns{letter-spacing:-.05em}.swagger-ui .tracked-mega-ns{letter-spacing:.25em}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .tracked-m{letter-spacing:.1em}.swagger-ui .tracked-tight-m{letter-spacing:-.05em}.swagger-ui .tracked-mega-m{letter-spacing:.25em}}@media screen and (min-width:60em){.swagger-ui .tracked-l{letter-spacing:.1em}.swagger-ui .tracked-tight-l{letter-spacing:-.05em}.swagger-ui .tracked-mega-l{letter-spacing:.25em}}.swagger-ui .lh-solid{line-height:1}.swagger-ui .lh-title{line-height:1.25}.swagger-ui .lh-copy{line-height:1.5}@media screen and (min-width:30em){.swagger-ui .lh-solid-ns{line-height:1}.swagger-ui .lh-title-ns{line-height:1.25}.swagger-ui .lh-copy-ns{line-height:1.5}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .lh-solid-m{line-height:1}.swagger-ui .lh-title-m{line-height:1.25}.swagger-ui .lh-copy-m{line-height:1.5}}@media screen and (min-width:60em){.swagger-ui .lh-solid-l{line-height:1}.swagger-ui .lh-title-l{line-height:1.25}.swagger-ui .lh-copy-l{line-height:1.5}}.swagger-ui .link{text-decoration:none}.swagger-ui .link,.swagger-ui .link:active,.swagger-ui .link:focus,.swagger-ui .link:hover,.swagger-ui .link:link,.swagger-ui .link:visited{transition:color .15s ease-in}.swagger-ui .link:focus{outline:1px dotted currentColor}.swagger-ui .list{list-style-type:none}.swagger-ui .mw-100{max-width:100%}.swagger-ui .mw1{max-width:1rem}.swagger-ui .mw2{max-width:2rem}.swagger-ui .mw3{max-width:4rem}.swagger-ui .mw4{max-width:8rem}.swagger-ui .mw5{max-width:16rem}.swagger-ui .mw6{max-width:32rem}.swagger-ui .mw7{max-width:48rem}.swagger-ui .mw8{max-width:64rem}.swagger-ui .mw9{max-width:96rem}.swagger-ui .mw-none{max-width:none}@media screen and (min-width:30em){.swagger-ui .mw-100-ns{max-width:100%}.swagger-ui .mw1-ns{max-width:1rem}.swagger-ui .mw2-ns{max-width:2rem}.swagger-ui .mw3-ns{max-width:4rem}.swagger-ui .mw4-ns{max-width:8rem}.swagger-ui .mw5-ns{max-width:16rem}.swagger-ui .mw6-ns{max-width:32rem}.swagger-ui .mw7-ns{max-width:48rem}.swagger-ui .mw8-ns{max-width:64rem}.swagger-ui .mw9-ns{max-width:96rem}.swagger-ui .mw-none-ns{max-width:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .mw-100-m{max-width:100%}.swagger-ui .mw1-m{max-width:1rem}.swagger-ui .mw2-m{max-width:2rem}.swagger-ui .mw3-m{max-width:4rem}.swagger-ui .mw4-m{max-width:8rem}.swagger-ui .mw5-m{max-width:16rem}.swagger-ui .mw6-m{max-width:32rem}.swagger-ui .mw7-m{max-width:48rem}.swagger-ui .mw8-m{max-width:64rem}.swagger-ui .mw9-m{max-width:96rem}.swagger-ui .mw-none-m{max-width:none}}@media screen and (min-width:60em){.swagger-ui .mw-100-l{max-width:100%}.swagger-ui .mw1-l{max-width:1rem}.swagger-ui .mw2-l{max-width:2rem}.swagger-ui .mw3-l{max-width:4rem}.swagger-ui .mw4-l{max-width:8rem}.swagger-ui .mw5-l{max-width:16rem}.swagger-ui .mw6-l{max-width:32rem}.swagger-ui .mw7-l{max-width:48rem}.swagger-ui .mw8-l{max-width:64rem}.swagger-ui .mw9-l{max-width:96rem}.swagger-ui .mw-none-l{max-width:none}}.swagger-ui .w1{width:1rem}.swagger-ui .w2{width:2rem}.swagger-ui .w3{width:4rem}.swagger-ui .w4{width:8rem}.swagger-ui .w5{width:16rem}.swagger-ui .w-10{width:10%}.swagger-ui .w-20{width:20%}.swagger-ui .w-25{width:25%}.swagger-ui .w-30{width:30%}.swagger-ui .w-33{width:33%}.swagger-ui .w-34{width:34%}.swagger-ui .w-40{width:40%}.swagger-ui .w-50{width:50%}.swagger-ui .w-60{width:60%}.swagger-ui .w-70{width:70%}.swagger-ui .w-75{width:75%}.swagger-ui .w-80{width:80%}.swagger-ui .w-90{width:90%}.swagger-ui .w-100{width:100%}.swagger-ui .w-third{width:33.3333333333%}.swagger-ui .w-two-thirds{width:66.6666666667%}.swagger-ui .w-auto{width:auto}@media screen and (min-width:30em){.swagger-ui .w1-ns{width:1rem}.swagger-ui .w2-ns{width:2rem}.swagger-ui .w3-ns{width:4rem}.swagger-ui .w4-ns{width:8rem}.swagger-ui .w5-ns{width:16rem}.swagger-ui .w-10-ns{width:10%}.swagger-ui .w-20-ns{width:20%}.swagger-ui .w-25-ns{width:25%}.swagger-ui .w-30-ns{width:30%}.swagger-ui .w-33-ns{width:33%}.swagger-ui .w-34-ns{width:34%}.swagger-ui .w-40-ns{width:40%}.swagger-ui .w-50-ns{width:50%}.swagger-ui .w-60-ns{width:60%}.swagger-ui .w-70-ns{width:70%}.swagger-ui .w-75-ns{width:75%}.swagger-ui .w-80-ns{width:80%}.swagger-ui .w-90-ns{width:90%}.swagger-ui .w-100-ns{width:100%}.swagger-ui .w-third-ns{width:33.3333333333%}.swagger-ui .w-two-thirds-ns{width:66.6666666667%}.swagger-ui .w-auto-ns{width:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .w1-m{width:1rem}.swagger-ui .w2-m{width:2rem}.swagger-ui .w3-m{width:4rem}.swagger-ui .w4-m{width:8rem}.swagger-ui .w5-m{width:16rem}.swagger-ui .w-10-m{width:10%}.swagger-ui .w-20-m{width:20%}.swagger-ui .w-25-m{width:25%}.swagger-ui .w-30-m{width:30%}.swagger-ui .w-33-m{width:33%}.swagger-ui .w-34-m{width:34%}.swagger-ui .w-40-m{width:40%}.swagger-ui .w-50-m{width:50%}.swagger-ui .w-60-m{width:60%}.swagger-ui .w-70-m{width:70%}.swagger-ui .w-75-m{width:75%}.swagger-ui .w-80-m{width:80%}.swagger-ui .w-90-m{width:90%}.swagger-ui .w-100-m{width:100%}.swagger-ui .w-third-m{width:33.3333333333%}.swagger-ui .w-two-thirds-m{width:66.6666666667%}.swagger-ui .w-auto-m{width:auto}}@media screen and (min-width:60em){.swagger-ui .w1-l{width:1rem}.swagger-ui .w2-l{width:2rem}.swagger-ui .w3-l{width:4rem}.swagger-ui .w4-l{width:8rem}.swagger-ui .w5-l{width:16rem}.swagger-ui .w-10-l{width:10%}.swagger-ui .w-20-l{width:20%}.swagger-ui .w-25-l{width:25%}.swagger-ui .w-30-l{width:30%}.swagger-ui .w-33-l{width:33%}.swagger-ui .w-34-l{width:34%}.swagger-ui .w-40-l{width:40%}.swagger-ui .w-50-l{width:50%}.swagger-ui .w-60-l{width:60%}.swagger-ui .w-70-l{width:70%}.swagger-ui .w-75-l{width:75%}.swagger-ui .w-80-l{width:80%}.swagger-ui .w-90-l{width:90%}.swagger-ui .w-100-l{width:100%}.swagger-ui .w-third-l{width:33.3333333333%}.swagger-ui .w-two-thirds-l{width:66.6666666667%}.swagger-ui .w-auto-l{width:auto}}.swagger-ui .overflow-visible{overflow:visible}.swagger-ui .overflow-hidden{overflow:hidden}.swagger-ui .overflow-scroll{overflow:scroll}.swagger-ui .overflow-auto{overflow:auto}.swagger-ui .overflow-x-visible{overflow-x:visible}.swagger-ui .overflow-x-hidden{overflow-x:hidden}.swagger-ui .overflow-x-scroll{overflow-x:scroll}.swagger-ui .overflow-x-auto{overflow-x:auto}.swagger-ui .overflow-y-visible{overflow-y:visible}.swagger-ui .overflow-y-hidden{overflow-y:hidden}.swagger-ui .overflow-y-scroll{overflow-y:scroll}.swagger-ui .overflow-y-auto{overflow-y:auto}@media screen and (min-width:30em){.swagger-ui .overflow-visible-ns{overflow:visible}.swagger-ui .overflow-hidden-ns{overflow:hidden}.swagger-ui .overflow-scroll-ns{overflow:scroll}.swagger-ui .overflow-auto-ns{overflow:auto}.swagger-ui .overflow-x-visible-ns{overflow-x:visible}.swagger-ui .overflow-x-hidden-ns{overflow-x:hidden}.swagger-ui .overflow-x-scroll-ns{overflow-x:scroll}.swagger-ui .overflow-x-auto-ns{overflow-x:auto}.swagger-ui .overflow-y-visible-ns{overflow-y:visible}.swagger-ui .overflow-y-hidden-ns{overflow-y:hidden}.swagger-ui .overflow-y-scroll-ns{overflow-y:scroll}.swagger-ui .overflow-y-auto-ns{overflow-y:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .overflow-visible-m{overflow:visible}.swagger-ui .overflow-hidden-m{overflow:hidden}.swagger-ui .overflow-scroll-m{overflow:scroll}.swagger-ui .overflow-auto-m{overflow:auto}.swagger-ui .overflow-x-visible-m{overflow-x:visible}.swagger-ui .overflow-x-hidden-m{overflow-x:hidden}.swagger-ui .overflow-x-scroll-m{overflow-x:scroll}.swagger-ui .overflow-x-auto-m{overflow-x:auto}.swagger-ui .overflow-y-visible-m{overflow-y:visible}.swagger-ui .overflow-y-hidden-m{overflow-y:hidden}.swagger-ui .overflow-y-scroll-m{overflow-y:scroll}.swagger-ui .overflow-y-auto-m{overflow-y:auto}}@media screen and (min-width:60em){.swagger-ui .overflow-visible-l{overflow:visible}.swagger-ui .overflow-hidden-l{overflow:hidden}.swagger-ui .overflow-scroll-l{overflow:scroll}.swagger-ui .overflow-auto-l{overflow:auto}.swagger-ui .overflow-x-visible-l{overflow-x:visible}.swagger-ui .overflow-x-hidden-l{overflow-x:hidden}.swagger-ui .overflow-x-scroll-l{overflow-x:scroll}.swagger-ui .overflow-x-auto-l{overflow-x:auto}.swagger-ui .overflow-y-visible-l{overflow-y:visible}.swagger-ui .overflow-y-hidden-l{overflow-y:hidden}.swagger-ui .overflow-y-scroll-l{overflow-y:scroll}.swagger-ui .overflow-y-auto-l{overflow-y:auto}}.swagger-ui .static{position:static}.swagger-ui .relative{position:relative}.swagger-ui .absolute{position:absolute}.swagger-ui .fixed{position:fixed}@media screen and (min-width:30em){.swagger-ui .static-ns{position:static}.swagger-ui .relative-ns{position:relative}.swagger-ui .absolute-ns{position:absolute}.swagger-ui .fixed-ns{position:fixed}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .static-m{position:static}.swagger-ui .relative-m{position:relative}.swagger-ui .absolute-m{position:absolute}.swagger-ui .fixed-m{position:fixed}}@media screen and (min-width:60em){.swagger-ui .static-l{position:static}.swagger-ui .relative-l{position:relative}.swagger-ui .absolute-l{position:absolute}.swagger-ui .fixed-l{position:fixed}}.swagger-ui .o-100{opacity:1}.swagger-ui .o-90{opacity:.9}.swagger-ui .o-80{opacity:.8}.swagger-ui .o-70{opacity:.7}.swagger-ui .o-60{opacity:.6}.swagger-ui .o-50{opacity:.5}.swagger-ui .o-40{opacity:.4}.swagger-ui .o-30{opacity:.3}.swagger-ui .o-20{opacity:.2}.swagger-ui .o-10{opacity:.1}.swagger-ui .o-05{opacity:.05}.swagger-ui .o-025{opacity:.025}.swagger-ui .o-0{opacity:0}.swagger-ui .rotate-45{transform:rotate(45deg)}.swagger-ui .rotate-90{transform:rotate(90deg)}.swagger-ui .rotate-135{transform:rotate(135deg)}.swagger-ui .rotate-180{transform:rotate(180deg)}.swagger-ui .rotate-225{transform:rotate(225deg)}.swagger-ui .rotate-270{transform:rotate(270deg)}.swagger-ui .rotate-315{transform:rotate(315deg)}@media screen and (min-width:30em){.swagger-ui .rotate-45-ns{transform:rotate(45deg)}.swagger-ui .rotate-90-ns{transform:rotate(90deg)}.swagger-ui .rotate-135-ns{transform:rotate(135deg)}.swagger-ui .rotate-180-ns{transform:rotate(180deg)}.swagger-ui .rotate-225-ns{transform:rotate(225deg)}.swagger-ui .rotate-270-ns{transform:rotate(270deg)}.swagger-ui .rotate-315-ns{transform:rotate(315deg)}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .rotate-45-m{transform:rotate(45deg)}.swagger-ui .rotate-90-m{transform:rotate(90deg)}.swagger-ui .rotate-135-m{transform:rotate(135deg)}.swagger-ui .rotate-180-m{transform:rotate(180deg)}.swagger-ui .rotate-225-m{transform:rotate(225deg)}.swagger-ui .rotate-270-m{transform:rotate(270deg)}.swagger-ui .rotate-315-m{transform:rotate(315deg)}}@media screen and (min-width:60em){.swagger-ui .rotate-45-l{transform:rotate(45deg)}.swagger-ui .rotate-90-l{transform:rotate(90deg)}.swagger-ui .rotate-135-l{transform:rotate(135deg)}.swagger-ui .rotate-180-l{transform:rotate(180deg)}.swagger-ui .rotate-225-l{transform:rotate(225deg)}.swagger-ui .rotate-270-l{transform:rotate(270deg)}.swagger-ui .rotate-315-l{transform:rotate(315deg)}}.swagger-ui .black-90{color:rgba(0,0,0,.9)}.swagger-ui .black-80{color:rgba(0,0,0,.8)}.swagger-ui .black-70{color:rgba(0,0,0,.7)}.swagger-ui .black-60{color:rgba(0,0,0,.6)}.swagger-ui .black-50{color:rgba(0,0,0,.5)}.swagger-ui .black-40{color:rgba(0,0,0,.4)}.swagger-ui .black-30{color:rgba(0,0,0,.3)}.swagger-ui .black-20{color:rgba(0,0,0,.2)}.swagger-ui .black-10{color:rgba(0,0,0,.1)}.swagger-ui .black-05{color:rgba(0,0,0,.05)}.swagger-ui .white-90{color:hsla(0,0%,100%,.9)}.swagger-ui .white-80{color:hsla(0,0%,100%,.8)}.swagger-ui .white-70{color:hsla(0,0%,100%,.7)}.swagger-ui .white-60{color:hsla(0,0%,100%,.6)}.swagger-ui .white-50{color:hsla(0,0%,100%,.5)}.swagger-ui .white-40{color:hsla(0,0%,100%,.4)}.swagger-ui .white-30{color:hsla(0,0%,100%,.3)}.swagger-ui .white-20{color:hsla(0,0%,100%,.2)}.swagger-ui .white-10{color:hsla(0,0%,100%,.1)}.swagger-ui .black{color:#000}.swagger-ui .near-black{color:#111}.swagger-ui .dark-gray{color:#333}.swagger-ui .mid-gray{color:#555}.swagger-ui .gray{color:#777}.swagger-ui .silver{color:#999}.swagger-ui .light-silver{color:#aaa}.swagger-ui .moon-gray{color:#ccc}.swagger-ui .light-gray{color:#eee}.swagger-ui .near-white{color:#f4f4f4}.swagger-ui .white{color:#fff}.swagger-ui .dark-red{color:#e7040f}.swagger-ui .red{color:#ff4136}.swagger-ui .light-red{color:#ff725c}.swagger-ui .orange{color:#ff6300}.swagger-ui .gold{color:#ffb700}.swagger-ui .yellow{color:gold}.swagger-ui .light-yellow{color:#fbf1a9}.swagger-ui .purple{color:#5e2ca5}.swagger-ui .light-purple{color:#a463f2}.swagger-ui .dark-pink{color:#d5008f}.swagger-ui .hot-pink{color:#ff41b4}.swagger-ui .pink{color:#ff80cc}.swagger-ui .light-pink{color:#ffa3d7}.swagger-ui .dark-green{color:#137752}.swagger-ui .green{color:#19a974}.swagger-ui .light-green{color:#9eebcf}.swagger-ui .navy{color:#001b44}.swagger-ui .dark-blue{color:#00449e}.swagger-ui .blue{color:#357edd}.swagger-ui .light-blue{color:#96ccff}.swagger-ui .lightest-blue{color:#cdecff}.swagger-ui .washed-blue{color:#f6fffe}.swagger-ui .washed-green{color:#e8fdf5}.swagger-ui .washed-yellow{color:#fffceb}.swagger-ui .washed-red{color:#ffdfdf}.swagger-ui .color-inherit{color:inherit}.swagger-ui .bg-black-90{background-color:rgba(0,0,0,.9)}.swagger-ui .bg-black-80{background-color:rgba(0,0,0,.8)}.swagger-ui .bg-black-70{background-color:rgba(0,0,0,.7)}.swagger-ui .bg-black-60{background-color:rgba(0,0,0,.6)}.swagger-ui .bg-black-50{background-color:rgba(0,0,0,.5)}.swagger-ui .bg-black-40{background-color:rgba(0,0,0,.4)}.swagger-ui .bg-black-30{background-color:rgba(0,0,0,.3)}.swagger-ui .bg-black-20{background-color:rgba(0,0,0,.2)}.swagger-ui .bg-black-10{background-color:rgba(0,0,0,.1)}.swagger-ui .bg-black-05{background-color:rgba(0,0,0,.05)}.swagger-ui .bg-white-90{background-color:hsla(0,0%,100%,.9)}.swagger-ui .bg-white-80{background-color:hsla(0,0%,100%,.8)}.swagger-ui .bg-white-70{background-color:hsla(0,0%,100%,.7)}.swagger-ui .bg-white-60{background-color:hsla(0,0%,100%,.6)}.swagger-ui .bg-white-50{background-color:hsla(0,0%,100%,.5)}.swagger-ui .bg-white-40{background-color:hsla(0,0%,100%,.4)}.swagger-ui .bg-white-30{background-color:hsla(0,0%,100%,.3)}.swagger-ui .bg-white-20{background-color:hsla(0,0%,100%,.2)}.swagger-ui .bg-white-10{background-color:hsla(0,0%,100%,.1)}.swagger-ui .bg-black{background-color:#000}.swagger-ui .bg-near-black{background-color:#111}.swagger-ui .bg-dark-gray{background-color:#333}.swagger-ui .bg-mid-gray{background-color:#555}.swagger-ui .bg-gray{background-color:#777}.swagger-ui .bg-silver{background-color:#999}.swagger-ui .bg-light-silver{background-color:#aaa}.swagger-ui .bg-moon-gray{background-color:#ccc}.swagger-ui .bg-light-gray{background-color:#eee}.swagger-ui .bg-near-white{background-color:#f4f4f4}.swagger-ui .bg-white{background-color:#fff}.swagger-ui .bg-transparent{background-color:transparent}.swagger-ui .bg-dark-red{background-color:#e7040f}.swagger-ui .bg-red{background-color:#ff4136}.swagger-ui .bg-light-red{background-color:#ff725c}.swagger-ui .bg-orange{background-color:#ff6300}.swagger-ui .bg-gold{background-color:#ffb700}.swagger-ui .bg-yellow{background-color:gold}.swagger-ui .bg-light-yellow{background-color:#fbf1a9}.swagger-ui .bg-purple{background-color:#5e2ca5}.swagger-ui .bg-light-purple{background-color:#a463f2}.swagger-ui .bg-dark-pink{background-color:#d5008f}.swagger-ui .bg-hot-pink{background-color:#ff41b4}.swagger-ui .bg-pink{background-color:#ff80cc}.swagger-ui .bg-light-pink{background-color:#ffa3d7}.swagger-ui .bg-dark-green{background-color:#137752}.swagger-ui .bg-green{background-color:#19a974}.swagger-ui .bg-light-green{background-color:#9eebcf}.swagger-ui .bg-navy{background-color:#001b44}.swagger-ui .bg-dark-blue{background-color:#00449e}.swagger-ui .bg-blue{background-color:#357edd}.swagger-ui .bg-light-blue{background-color:#96ccff}.swagger-ui .bg-lightest-blue{background-color:#cdecff}.swagger-ui .bg-washed-blue{background-color:#f6fffe}.swagger-ui .bg-washed-green{background-color:#e8fdf5}.swagger-ui .bg-washed-yellow{background-color:#fffceb}.swagger-ui .bg-washed-red{background-color:#ffdfdf}.swagger-ui .bg-inherit{background-color:inherit}.swagger-ui .hover-black:focus,.swagger-ui .hover-black:hover{color:#000}.swagger-ui .hover-near-black:focus,.swagger-ui .hover-near-black:hover{color:#111}.swagger-ui .hover-dark-gray:focus,.swagger-ui .hover-dark-gray:hover{color:#333}.swagger-ui .hover-mid-gray:focus,.swagger-ui .hover-mid-gray:hover{color:#555}.swagger-ui .hover-gray:focus,.swagger-ui .hover-gray:hover{color:#777}.swagger-ui .hover-silver:focus,.swagger-ui .hover-silver:hover{color:#999}.swagger-ui .hover-light-silver:focus,.swagger-ui .hover-light-silver:hover{color:#aaa}.swagger-ui .hover-moon-gray:focus,.swagger-ui .hover-moon-gray:hover{color:#ccc}.swagger-ui .hover-light-gray:focus,.swagger-ui .hover-light-gray:hover{color:#eee}.swagger-ui .hover-near-white:focus,.swagger-ui .hover-near-white:hover{color:#f4f4f4}.swagger-ui .hover-white:focus,.swagger-ui .hover-white:hover{color:#fff}.swagger-ui .hover-black-90:focus,.swagger-ui .hover-black-90:hover{color:rgba(0,0,0,.9)}.swagger-ui .hover-black-80:focus,.swagger-ui .hover-black-80:hover{color:rgba(0,0,0,.8)}.swagger-ui .hover-black-70:focus,.swagger-ui .hover-black-70:hover{color:rgba(0,0,0,.7)}.swagger-ui .hover-black-60:focus,.swagger-ui .hover-black-60:hover{color:rgba(0,0,0,.6)}.swagger-ui .hover-black-50:focus,.swagger-ui .hover-black-50:hover{color:rgba(0,0,0,.5)}.swagger-ui .hover-black-40:focus,.swagger-ui .hover-black-40:hover{color:rgba(0,0,0,.4)}.swagger-ui .hover-black-30:focus,.swagger-ui .hover-black-30:hover{color:rgba(0,0,0,.3)}.swagger-ui .hover-black-20:focus,.swagger-ui .hover-black-20:hover{color:rgba(0,0,0,.2)}.swagger-ui .hover-black-10:focus,.swagger-ui .hover-black-10:hover{color:rgba(0,0,0,.1)}.swagger-ui .hover-white-90:focus,.swagger-ui .hover-white-90:hover{color:hsla(0,0%,100%,.9)}.swagger-ui .hover-white-80:focus,.swagger-ui .hover-white-80:hover{color:hsla(0,0%,100%,.8)}.swagger-ui .hover-white-70:focus,.swagger-ui .hover-white-70:hover{color:hsla(0,0%,100%,.7)}.swagger-ui .hover-white-60:focus,.swagger-ui .hover-white-60:hover{color:hsla(0,0%,100%,.6)}.swagger-ui .hover-white-50:focus,.swagger-ui .hover-white-50:hover{color:hsla(0,0%,100%,.5)}.swagger-ui .hover-white-40:focus,.swagger-ui .hover-white-40:hover{color:hsla(0,0%,100%,.4)}.swagger-ui .hover-white-30:focus,.swagger-ui .hover-white-30:hover{color:hsla(0,0%,100%,.3)}.swagger-ui .hover-white-20:focus,.swagger-ui .hover-white-20:hover{color:hsla(0,0%,100%,.2)}.swagger-ui .hover-white-10:focus,.swagger-ui .hover-white-10:hover{color:hsla(0,0%,100%,.1)}.swagger-ui .hover-inherit:focus,.swagger-ui .hover-inherit:hover{color:inherit}.swagger-ui .hover-bg-black:focus,.swagger-ui .hover-bg-black:hover{background-color:#000}.swagger-ui .hover-bg-near-black:focus,.swagger-ui .hover-bg-near-black:hover{background-color:#111}.swagger-ui .hover-bg-dark-gray:focus,.swagger-ui .hover-bg-dark-gray:hover{background-color:#333}.swagger-ui .hover-bg-mid-gray:focus,.swagger-ui .hover-bg-mid-gray:hover{background-color:#555}.swagger-ui .hover-bg-gray:focus,.swagger-ui .hover-bg-gray:hover{background-color:#777}.swagger-ui .hover-bg-silver:focus,.swagger-ui .hover-bg-silver:hover{background-color:#999}.swagger-ui .hover-bg-light-silver:focus,.swagger-ui .hover-bg-light-silver:hover{background-color:#aaa}.swagger-ui .hover-bg-moon-gray:focus,.swagger-ui .hover-bg-moon-gray:hover{background-color:#ccc}.swagger-ui .hover-bg-light-gray:focus,.swagger-ui .hover-bg-light-gray:hover{background-color:#eee}.swagger-ui .hover-bg-near-white:focus,.swagger-ui .hover-bg-near-white:hover{background-color:#f4f4f4}.swagger-ui .hover-bg-white:focus,.swagger-ui .hover-bg-white:hover{background-color:#fff}.swagger-ui .hover-bg-transparent:focus,.swagger-ui .hover-bg-transparent:hover{background-color:transparent}.swagger-ui .hover-bg-black-90:focus,.swagger-ui .hover-bg-black-90:hover{background-color:rgba(0,0,0,.9)}.swagger-ui .hover-bg-black-80:focus,.swagger-ui .hover-bg-black-80:hover{background-color:rgba(0,0,0,.8)}.swagger-ui .hover-bg-black-70:focus,.swagger-ui .hover-bg-black-70:hover{background-color:rgba(0,0,0,.7)}.swagger-ui .hover-bg-black-60:focus,.swagger-ui .hover-bg-black-60:hover{background-color:rgba(0,0,0,.6)}.swagger-ui .hover-bg-black-50:focus,.swagger-ui .hover-bg-black-50:hover{background-color:rgba(0,0,0,.5)}.swagger-ui .hover-bg-black-40:focus,.swagger-ui .hover-bg-black-40:hover{background-color:rgba(0,0,0,.4)}.swagger-ui .hover-bg-black-30:focus,.swagger-ui .hover-bg-black-30:hover{background-color:rgba(0,0,0,.3)}.swagger-ui .hover-bg-black-20:focus,.swagger-ui .hover-bg-black-20:hover{background-color:rgba(0,0,0,.2)}.swagger-ui .hover-bg-black-10:focus,.swagger-ui .hover-bg-black-10:hover{background-color:rgba(0,0,0,.1)}.swagger-ui .hover-bg-white-90:focus,.swagger-ui .hover-bg-white-90:hover{background-color:hsla(0,0%,100%,.9)}.swagger-ui .hover-bg-white-80:focus,.swagger-ui .hover-bg-white-80:hover{background-color:hsla(0,0%,100%,.8)}.swagger-ui .hover-bg-white-70:focus,.swagger-ui .hover-bg-white-70:hover{background-color:hsla(0,0%,100%,.7)}.swagger-ui .hover-bg-white-60:focus,.swagger-ui .hover-bg-white-60:hover{background-color:hsla(0,0%,100%,.6)}.swagger-ui .hover-bg-white-50:focus,.swagger-ui .hover-bg-white-50:hover{background-color:hsla(0,0%,100%,.5)}.swagger-ui .hover-bg-white-40:focus,.swagger-ui .hover-bg-white-40:hover{background-color:hsla(0,0%,100%,.4)}.swagger-ui .hover-bg-white-30:focus,.swagger-ui .hover-bg-white-30:hover{background-color:hsla(0,0%,100%,.3)}.swagger-ui .hover-bg-white-20:focus,.swagger-ui .hover-bg-white-20:hover{background-color:hsla(0,0%,100%,.2)}.swagger-ui .hover-bg-white-10:focus,.swagger-ui .hover-bg-white-10:hover{background-color:hsla(0,0%,100%,.1)}.swagger-ui .hover-dark-red:focus,.swagger-ui .hover-dark-red:hover{color:#e7040f}.swagger-ui .hover-red:focus,.swagger-ui .hover-red:hover{color:#ff4136}.swagger-ui .hover-light-red:focus,.swagger-ui .hover-light-red:hover{color:#ff725c}.swagger-ui .hover-orange:focus,.swagger-ui .hover-orange:hover{color:#ff6300}.swagger-ui .hover-gold:focus,.swagger-ui .hover-gold:hover{color:#ffb700}.swagger-ui .hover-yellow:focus,.swagger-ui .hover-yellow:hover{color:gold}.swagger-ui .hover-light-yellow:focus,.swagger-ui .hover-light-yellow:hover{color:#fbf1a9}.swagger-ui .hover-purple:focus,.swagger-ui .hover-purple:hover{color:#5e2ca5}.swagger-ui .hover-light-purple:focus,.swagger-ui .hover-light-purple:hover{color:#a463f2}.swagger-ui .hover-dark-pink:focus,.swagger-ui .hover-dark-pink:hover{color:#d5008f}.swagger-ui .hover-hot-pink:focus,.swagger-ui .hover-hot-pink:hover{color:#ff41b4}.swagger-ui .hover-pink:focus,.swagger-ui .hover-pink:hover{color:#ff80cc}.swagger-ui .hover-light-pink:focus,.swagger-ui .hover-light-pink:hover{color:#ffa3d7}.swagger-ui .hover-dark-green:focus,.swagger-ui .hover-dark-green:hover{color:#137752}.swagger-ui .hover-green:focus,.swagger-ui .hover-green:hover{color:#19a974}.swagger-ui .hover-light-green:focus,.swagger-ui .hover-light-green:hover{color:#9eebcf}.swagger-ui .hover-navy:focus,.swagger-ui .hover-navy:hover{color:#001b44}.swagger-ui .hover-dark-blue:focus,.swagger-ui .hover-dark-blue:hover{color:#00449e}.swagger-ui .hover-blue:focus,.swagger-ui .hover-blue:hover{color:#357edd}.swagger-ui .hover-light-blue:focus,.swagger-ui .hover-light-blue:hover{color:#96ccff}.swagger-ui .hover-lightest-blue:focus,.swagger-ui .hover-lightest-blue:hover{color:#cdecff}.swagger-ui .hover-washed-blue:focus,.swagger-ui .hover-washed-blue:hover{color:#f6fffe}.swagger-ui .hover-washed-green:focus,.swagger-ui .hover-washed-green:hover{color:#e8fdf5}.swagger-ui .hover-washed-yellow:focus,.swagger-ui .hover-washed-yellow:hover{color:#fffceb}.swagger-ui .hover-washed-red:focus,.swagger-ui .hover-washed-red:hover{color:#ffdfdf}.swagger-ui .hover-bg-dark-red:focus,.swagger-ui .hover-bg-dark-red:hover{background-color:#e7040f}.swagger-ui .hover-bg-red:focus,.swagger-ui .hover-bg-red:hover{background-color:#ff4136}.swagger-ui .hover-bg-light-red:focus,.swagger-ui .hover-bg-light-red:hover{background-color:#ff725c}.swagger-ui .hover-bg-orange:focus,.swagger-ui .hover-bg-orange:hover{background-color:#ff6300}.swagger-ui .hover-bg-gold:focus,.swagger-ui .hover-bg-gold:hover{background-color:#ffb700}.swagger-ui .hover-bg-yellow:focus,.swagger-ui .hover-bg-yellow:hover{background-color:gold}.swagger-ui .hover-bg-light-yellow:focus,.swagger-ui .hover-bg-light-yellow:hover{background-color:#fbf1a9}.swagger-ui .hover-bg-purple:focus,.swagger-ui .hover-bg-purple:hover{background-color:#5e2ca5}.swagger-ui .hover-bg-light-purple:focus,.swagger-ui .hover-bg-light-purple:hover{background-color:#a463f2}.swagger-ui .hover-bg-dark-pink:focus,.swagger-ui .hover-bg-dark-pink:hover{background-color:#d5008f}.swagger-ui .hover-bg-hot-pink:focus,.swagger-ui .hover-bg-hot-pink:hover{background-color:#ff41b4}.swagger-ui .hover-bg-pink:focus,.swagger-ui .hover-bg-pink:hover{background-color:#ff80cc}.swagger-ui .hover-bg-light-pink:focus,.swagger-ui .hover-bg-light-pink:hover{background-color:#ffa3d7}.swagger-ui .hover-bg-dark-green:focus,.swagger-ui .hover-bg-dark-green:hover{background-color:#137752}.swagger-ui .hover-bg-green:focus,.swagger-ui .hover-bg-green:hover{background-color:#19a974}.swagger-ui .hover-bg-light-green:focus,.swagger-ui .hover-bg-light-green:hover{background-color:#9eebcf}.swagger-ui .hover-bg-navy:focus,.swagger-ui .hover-bg-navy:hover{background-color:#001b44}.swagger-ui .hover-bg-dark-blue:focus,.swagger-ui .hover-bg-dark-blue:hover{background-color:#00449e}.swagger-ui .hover-bg-blue:focus,.swagger-ui .hover-bg-blue:hover{background-color:#357edd}.swagger-ui .hover-bg-light-blue:focus,.swagger-ui .hover-bg-light-blue:hover{background-color:#96ccff}.swagger-ui .hover-bg-lightest-blue:focus,.swagger-ui .hover-bg-lightest-blue:hover{background-color:#cdecff}.swagger-ui .hover-bg-washed-blue:focus,.swagger-ui .hover-bg-washed-blue:hover{background-color:#f6fffe}.swagger-ui .hover-bg-washed-green:focus,.swagger-ui .hover-bg-washed-green:hover{background-color:#e8fdf5}.swagger-ui .hover-bg-washed-yellow:focus,.swagger-ui .hover-bg-washed-yellow:hover{background-color:#fffceb}.swagger-ui .hover-bg-washed-red:focus,.swagger-ui .hover-bg-washed-red:hover{background-color:#ffdfdf}.swagger-ui .hover-bg-inherit:focus,.swagger-ui .hover-bg-inherit:hover{background-color:inherit}.swagger-ui .pa0{padding:0}.swagger-ui .pa1{padding:.25rem}.swagger-ui .pa2{padding:.5rem}.swagger-ui .pa3{padding:1rem}.swagger-ui .pa4{padding:2rem}.swagger-ui .pa5{padding:4rem}.swagger-ui .pa6{padding:8rem}.swagger-ui .pa7{padding:16rem}.swagger-ui .pl0{padding-left:0}.swagger-ui .pl1{padding-left:.25rem}.swagger-ui .pl2{padding-left:.5rem}.swagger-ui .pl3{padding-left:1rem}.swagger-ui .pl4{padding-left:2rem}.swagger-ui .pl5{padding-left:4rem}.swagger-ui .pl6{padding-left:8rem}.swagger-ui .pl7{padding-left:16rem}.swagger-ui .pr0{padding-right:0}.swagger-ui .pr1{padding-right:.25rem}.swagger-ui .pr2{padding-right:.5rem}.swagger-ui .pr3{padding-right:1rem}.swagger-ui .pr4{padding-right:2rem}.swagger-ui .pr5{padding-right:4rem}.swagger-ui .pr6{padding-right:8rem}.swagger-ui .pr7{padding-right:16rem}.swagger-ui .pb0{padding-bottom:0}.swagger-ui .pb1{padding-bottom:.25rem}.swagger-ui .pb2{padding-bottom:.5rem}.swagger-ui .pb3{padding-bottom:1rem}.swagger-ui .pb4{padding-bottom:2rem}.swagger-ui .pb5{padding-bottom:4rem}.swagger-ui .pb6{padding-bottom:8rem}.swagger-ui .pb7{padding-bottom:16rem}.swagger-ui .pt0{padding-top:0}.swagger-ui .pt1{padding-top:.25rem}.swagger-ui .pt2{padding-top:.5rem}.swagger-ui .pt3{padding-top:1rem}.swagger-ui .pt4{padding-top:2rem}.swagger-ui .pt5{padding-top:4rem}.swagger-ui .pt6{padding-top:8rem}.swagger-ui .pt7{padding-top:16rem}.swagger-ui .pv0{padding-bottom:0;padding-top:0}.swagger-ui .pv1{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0{padding-left:0;padding-right:0}.swagger-ui .ph1{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0{margin:0}.swagger-ui .ma1{margin:.25rem}.swagger-ui .ma2{margin:.5rem}.swagger-ui .ma3{margin:1rem}.swagger-ui .ma4{margin:2rem}.swagger-ui .ma5{margin:4rem}.swagger-ui .ma6{margin:8rem}.swagger-ui .ma7{margin:16rem}.swagger-ui .ml0{margin-left:0}.swagger-ui .ml1{margin-left:.25rem}.swagger-ui .ml2{margin-left:.5rem}.swagger-ui .ml3{margin-left:1rem}.swagger-ui .ml4{margin-left:2rem}.swagger-ui .ml5{margin-left:4rem}.swagger-ui .ml6{margin-left:8rem}.swagger-ui .ml7{margin-left:16rem}.swagger-ui .mr0{margin-right:0}.swagger-ui .mr1{margin-right:.25rem}.swagger-ui .mr2{margin-right:.5rem}.swagger-ui .mr3{margin-right:1rem}.swagger-ui .mr4{margin-right:2rem}.swagger-ui .mr5{margin-right:4rem}.swagger-ui .mr6{margin-right:8rem}.swagger-ui .mr7{margin-right:16rem}.swagger-ui .mb0{margin-bottom:0}.swagger-ui .mb1{margin-bottom:.25rem}.swagger-ui .mb2{margin-bottom:.5rem}.swagger-ui .mb3{margin-bottom:1rem}.swagger-ui .mb4{margin-bottom:2rem}.swagger-ui .mb5{margin-bottom:4rem}.swagger-ui .mb6{margin-bottom:8rem}.swagger-ui .mb7{margin-bottom:16rem}.swagger-ui .mt0{margin-top:0}.swagger-ui .mt1{margin-top:.25rem}.swagger-ui .mt2{margin-top:.5rem}.swagger-ui .mt3{margin-top:1rem}.swagger-ui .mt4{margin-top:2rem}.swagger-ui .mt5{margin-top:4rem}.swagger-ui .mt6{margin-top:8rem}.swagger-ui .mt7{margin-top:16rem}.swagger-ui .mv0{margin-bottom:0;margin-top:0}.swagger-ui .mv1{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0{margin-left:0;margin-right:0}.swagger-ui .mh1{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7{margin-left:16rem;margin-right:16rem}@media screen and (min-width:30em){.swagger-ui .pa0-ns{padding:0}.swagger-ui .pa1-ns{padding:.25rem}.swagger-ui .pa2-ns{padding:.5rem}.swagger-ui .pa3-ns{padding:1rem}.swagger-ui .pa4-ns{padding:2rem}.swagger-ui .pa5-ns{padding:4rem}.swagger-ui .pa6-ns{padding:8rem}.swagger-ui .pa7-ns{padding:16rem}.swagger-ui .pl0-ns{padding-left:0}.swagger-ui .pl1-ns{padding-left:.25rem}.swagger-ui .pl2-ns{padding-left:.5rem}.swagger-ui .pl3-ns{padding-left:1rem}.swagger-ui .pl4-ns{padding-left:2rem}.swagger-ui .pl5-ns{padding-left:4rem}.swagger-ui .pl6-ns{padding-left:8rem}.swagger-ui .pl7-ns{padding-left:16rem}.swagger-ui .pr0-ns{padding-right:0}.swagger-ui .pr1-ns{padding-right:.25rem}.swagger-ui .pr2-ns{padding-right:.5rem}.swagger-ui .pr3-ns{padding-right:1rem}.swagger-ui .pr4-ns{padding-right:2rem}.swagger-ui .pr5-ns{padding-right:4rem}.swagger-ui .pr6-ns{padding-right:8rem}.swagger-ui .pr7-ns{padding-right:16rem}.swagger-ui .pb0-ns{padding-bottom:0}.swagger-ui .pb1-ns{padding-bottom:.25rem}.swagger-ui .pb2-ns{padding-bottom:.5rem}.swagger-ui .pb3-ns{padding-bottom:1rem}.swagger-ui .pb4-ns{padding-bottom:2rem}.swagger-ui .pb5-ns{padding-bottom:4rem}.swagger-ui .pb6-ns{padding-bottom:8rem}.swagger-ui .pb7-ns{padding-bottom:16rem}.swagger-ui .pt0-ns{padding-top:0}.swagger-ui .pt1-ns{padding-top:.25rem}.swagger-ui .pt2-ns{padding-top:.5rem}.swagger-ui .pt3-ns{padding-top:1rem}.swagger-ui .pt4-ns{padding-top:2rem}.swagger-ui .pt5-ns{padding-top:4rem}.swagger-ui .pt6-ns{padding-top:8rem}.swagger-ui .pt7-ns{padding-top:16rem}.swagger-ui .pv0-ns{padding-bottom:0;padding-top:0}.swagger-ui .pv1-ns{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-ns{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-ns{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-ns{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-ns{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-ns{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-ns{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-ns{padding-left:0;padding-right:0}.swagger-ui .ph1-ns{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-ns{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-ns{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-ns{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-ns{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-ns{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-ns{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-ns{margin:0}.swagger-ui .ma1-ns{margin:.25rem}.swagger-ui .ma2-ns{margin:.5rem}.swagger-ui .ma3-ns{margin:1rem}.swagger-ui .ma4-ns{margin:2rem}.swagger-ui .ma5-ns{margin:4rem}.swagger-ui .ma6-ns{margin:8rem}.swagger-ui .ma7-ns{margin:16rem}.swagger-ui .ml0-ns{margin-left:0}.swagger-ui .ml1-ns{margin-left:.25rem}.swagger-ui .ml2-ns{margin-left:.5rem}.swagger-ui .ml3-ns{margin-left:1rem}.swagger-ui .ml4-ns{margin-left:2rem}.swagger-ui .ml5-ns{margin-left:4rem}.swagger-ui .ml6-ns{margin-left:8rem}.swagger-ui .ml7-ns{margin-left:16rem}.swagger-ui .mr0-ns{margin-right:0}.swagger-ui .mr1-ns{margin-right:.25rem}.swagger-ui .mr2-ns{margin-right:.5rem}.swagger-ui .mr3-ns{margin-right:1rem}.swagger-ui .mr4-ns{margin-right:2rem}.swagger-ui .mr5-ns{margin-right:4rem}.swagger-ui .mr6-ns{margin-right:8rem}.swagger-ui .mr7-ns{margin-right:16rem}.swagger-ui .mb0-ns{margin-bottom:0}.swagger-ui .mb1-ns{margin-bottom:.25rem}.swagger-ui .mb2-ns{margin-bottom:.5rem}.swagger-ui .mb3-ns{margin-bottom:1rem}.swagger-ui .mb4-ns{margin-bottom:2rem}.swagger-ui .mb5-ns{margin-bottom:4rem}.swagger-ui .mb6-ns{margin-bottom:8rem}.swagger-ui .mb7-ns{margin-bottom:16rem}.swagger-ui .mt0-ns{margin-top:0}.swagger-ui .mt1-ns{margin-top:.25rem}.swagger-ui .mt2-ns{margin-top:.5rem}.swagger-ui .mt3-ns{margin-top:1rem}.swagger-ui .mt4-ns{margin-top:2rem}.swagger-ui .mt5-ns{margin-top:4rem}.swagger-ui .mt6-ns{margin-top:8rem}.swagger-ui .mt7-ns{margin-top:16rem}.swagger-ui .mv0-ns{margin-bottom:0;margin-top:0}.swagger-ui .mv1-ns{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-ns{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-ns{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-ns{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-ns{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-ns{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-ns{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-ns{margin-left:0;margin-right:0}.swagger-ui .mh1-ns{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-ns{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-ns{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-ns{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-ns{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-ns{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-ns{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .pa0-m{padding:0}.swagger-ui .pa1-m{padding:.25rem}.swagger-ui .pa2-m{padding:.5rem}.swagger-ui .pa3-m{padding:1rem}.swagger-ui .pa4-m{padding:2rem}.swagger-ui .pa5-m{padding:4rem}.swagger-ui .pa6-m{padding:8rem}.swagger-ui .pa7-m{padding:16rem}.swagger-ui .pl0-m{padding-left:0}.swagger-ui .pl1-m{padding-left:.25rem}.swagger-ui .pl2-m{padding-left:.5rem}.swagger-ui .pl3-m{padding-left:1rem}.swagger-ui .pl4-m{padding-left:2rem}.swagger-ui .pl5-m{padding-left:4rem}.swagger-ui .pl6-m{padding-left:8rem}.swagger-ui .pl7-m{padding-left:16rem}.swagger-ui .pr0-m{padding-right:0}.swagger-ui .pr1-m{padding-right:.25rem}.swagger-ui .pr2-m{padding-right:.5rem}.swagger-ui .pr3-m{padding-right:1rem}.swagger-ui .pr4-m{padding-right:2rem}.swagger-ui .pr5-m{padding-right:4rem}.swagger-ui .pr6-m{padding-right:8rem}.swagger-ui .pr7-m{padding-right:16rem}.swagger-ui .pb0-m{padding-bottom:0}.swagger-ui .pb1-m{padding-bottom:.25rem}.swagger-ui .pb2-m{padding-bottom:.5rem}.swagger-ui .pb3-m{padding-bottom:1rem}.swagger-ui .pb4-m{padding-bottom:2rem}.swagger-ui .pb5-m{padding-bottom:4rem}.swagger-ui .pb6-m{padding-bottom:8rem}.swagger-ui .pb7-m{padding-bottom:16rem}.swagger-ui .pt0-m{padding-top:0}.swagger-ui .pt1-m{padding-top:.25rem}.swagger-ui .pt2-m{padding-top:.5rem}.swagger-ui .pt3-m{padding-top:1rem}.swagger-ui .pt4-m{padding-top:2rem}.swagger-ui .pt5-m{padding-top:4rem}.swagger-ui .pt6-m{padding-top:8rem}.swagger-ui .pt7-m{padding-top:16rem}.swagger-ui .pv0-m{padding-bottom:0;padding-top:0}.swagger-ui .pv1-m{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-m{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-m{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-m{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-m{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-m{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-m{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-m{padding-left:0;padding-right:0}.swagger-ui .ph1-m{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-m{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-m{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-m{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-m{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-m{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-m{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-m{margin:0}.swagger-ui .ma1-m{margin:.25rem}.swagger-ui .ma2-m{margin:.5rem}.swagger-ui .ma3-m{margin:1rem}.swagger-ui .ma4-m{margin:2rem}.swagger-ui .ma5-m{margin:4rem}.swagger-ui .ma6-m{margin:8rem}.swagger-ui .ma7-m{margin:16rem}.swagger-ui .ml0-m{margin-left:0}.swagger-ui .ml1-m{margin-left:.25rem}.swagger-ui .ml2-m{margin-left:.5rem}.swagger-ui .ml3-m{margin-left:1rem}.swagger-ui .ml4-m{margin-left:2rem}.swagger-ui .ml5-m{margin-left:4rem}.swagger-ui .ml6-m{margin-left:8rem}.swagger-ui .ml7-m{margin-left:16rem}.swagger-ui .mr0-m{margin-right:0}.swagger-ui .mr1-m{margin-right:.25rem}.swagger-ui .mr2-m{margin-right:.5rem}.swagger-ui .mr3-m{margin-right:1rem}.swagger-ui .mr4-m{margin-right:2rem}.swagger-ui .mr5-m{margin-right:4rem}.swagger-ui .mr6-m{margin-right:8rem}.swagger-ui .mr7-m{margin-right:16rem}.swagger-ui .mb0-m{margin-bottom:0}.swagger-ui .mb1-m{margin-bottom:.25rem}.swagger-ui .mb2-m{margin-bottom:.5rem}.swagger-ui .mb3-m{margin-bottom:1rem}.swagger-ui .mb4-m{margin-bottom:2rem}.swagger-ui .mb5-m{margin-bottom:4rem}.swagger-ui .mb6-m{margin-bottom:8rem}.swagger-ui .mb7-m{margin-bottom:16rem}.swagger-ui .mt0-m{margin-top:0}.swagger-ui .mt1-m{margin-top:.25rem}.swagger-ui .mt2-m{margin-top:.5rem}.swagger-ui .mt3-m{margin-top:1rem}.swagger-ui .mt4-m{margin-top:2rem}.swagger-ui .mt5-m{margin-top:4rem}.swagger-ui .mt6-m{margin-top:8rem}.swagger-ui .mt7-m{margin-top:16rem}.swagger-ui .mv0-m{margin-bottom:0;margin-top:0}.swagger-ui .mv1-m{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-m{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-m{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-m{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-m{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-m{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-m{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-m{margin-left:0;margin-right:0}.swagger-ui .mh1-m{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-m{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-m{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-m{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-m{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-m{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-m{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:60em){.swagger-ui .pa0-l{padding:0}.swagger-ui .pa1-l{padding:.25rem}.swagger-ui .pa2-l{padding:.5rem}.swagger-ui .pa3-l{padding:1rem}.swagger-ui .pa4-l{padding:2rem}.swagger-ui .pa5-l{padding:4rem}.swagger-ui .pa6-l{padding:8rem}.swagger-ui .pa7-l{padding:16rem}.swagger-ui .pl0-l{padding-left:0}.swagger-ui .pl1-l{padding-left:.25rem}.swagger-ui .pl2-l{padding-left:.5rem}.swagger-ui .pl3-l{padding-left:1rem}.swagger-ui .pl4-l{padding-left:2rem}.swagger-ui .pl5-l{padding-left:4rem}.swagger-ui .pl6-l{padding-left:8rem}.swagger-ui .pl7-l{padding-left:16rem}.swagger-ui .pr0-l{padding-right:0}.swagger-ui .pr1-l{padding-right:.25rem}.swagger-ui .pr2-l{padding-right:.5rem}.swagger-ui .pr3-l{padding-right:1rem}.swagger-ui .pr4-l{padding-right:2rem}.swagger-ui .pr5-l{padding-right:4rem}.swagger-ui .pr6-l{padding-right:8rem}.swagger-ui .pr7-l{padding-right:16rem}.swagger-ui .pb0-l{padding-bottom:0}.swagger-ui .pb1-l{padding-bottom:.25rem}.swagger-ui .pb2-l{padding-bottom:.5rem}.swagger-ui .pb3-l{padding-bottom:1rem}.swagger-ui .pb4-l{padding-bottom:2rem}.swagger-ui .pb5-l{padding-bottom:4rem}.swagger-ui .pb6-l{padding-bottom:8rem}.swagger-ui .pb7-l{padding-bottom:16rem}.swagger-ui .pt0-l{padding-top:0}.swagger-ui .pt1-l{padding-top:.25rem}.swagger-ui .pt2-l{padding-top:.5rem}.swagger-ui .pt3-l{padding-top:1rem}.swagger-ui .pt4-l{padding-top:2rem}.swagger-ui .pt5-l{padding-top:4rem}.swagger-ui .pt6-l{padding-top:8rem}.swagger-ui .pt7-l{padding-top:16rem}.swagger-ui .pv0-l{padding-bottom:0;padding-top:0}.swagger-ui .pv1-l{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-l{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-l{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-l{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-l{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-l{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-l{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-l{padding-left:0;padding-right:0}.swagger-ui .ph1-l{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-l{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-l{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-l{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-l{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-l{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-l{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-l{margin:0}.swagger-ui .ma1-l{margin:.25rem}.swagger-ui .ma2-l{margin:.5rem}.swagger-ui .ma3-l{margin:1rem}.swagger-ui .ma4-l{margin:2rem}.swagger-ui .ma5-l{margin:4rem}.swagger-ui .ma6-l{margin:8rem}.swagger-ui .ma7-l{margin:16rem}.swagger-ui .ml0-l{margin-left:0}.swagger-ui .ml1-l{margin-left:.25rem}.swagger-ui .ml2-l{margin-left:.5rem}.swagger-ui .ml3-l{margin-left:1rem}.swagger-ui .ml4-l{margin-left:2rem}.swagger-ui .ml5-l{margin-left:4rem}.swagger-ui .ml6-l{margin-left:8rem}.swagger-ui .ml7-l{margin-left:16rem}.swagger-ui .mr0-l{margin-right:0}.swagger-ui .mr1-l{margin-right:.25rem}.swagger-ui .mr2-l{margin-right:.5rem}.swagger-ui .mr3-l{margin-right:1rem}.swagger-ui .mr4-l{margin-right:2rem}.swagger-ui .mr5-l{margin-right:4rem}.swagger-ui .mr6-l{margin-right:8rem}.swagger-ui .mr7-l{margin-right:16rem}.swagger-ui .mb0-l{margin-bottom:0}.swagger-ui .mb1-l{margin-bottom:.25rem}.swagger-ui .mb2-l{margin-bottom:.5rem}.swagger-ui .mb3-l{margin-bottom:1rem}.swagger-ui .mb4-l{margin-bottom:2rem}.swagger-ui .mb5-l{margin-bottom:4rem}.swagger-ui .mb6-l{margin-bottom:8rem}.swagger-ui .mb7-l{margin-bottom:16rem}.swagger-ui .mt0-l{margin-top:0}.swagger-ui .mt1-l{margin-top:.25rem}.swagger-ui .mt2-l{margin-top:.5rem}.swagger-ui .mt3-l{margin-top:1rem}.swagger-ui .mt4-l{margin-top:2rem}.swagger-ui .mt5-l{margin-top:4rem}.swagger-ui .mt6-l{margin-top:8rem}.swagger-ui .mt7-l{margin-top:16rem}.swagger-ui .mv0-l{margin-bottom:0;margin-top:0}.swagger-ui .mv1-l{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-l{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-l{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-l{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-l{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-l{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-l{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-l{margin-left:0;margin-right:0}.swagger-ui .mh1-l{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-l{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-l{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-l{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-l{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-l{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-l{margin-left:16rem;margin-right:16rem}}.swagger-ui .na1{margin:-.25rem}.swagger-ui .na2{margin:-.5rem}.swagger-ui .na3{margin:-1rem}.swagger-ui .na4{margin:-2rem}.swagger-ui .na5{margin:-4rem}.swagger-ui .na6{margin:-8rem}.swagger-ui .na7{margin:-16rem}.swagger-ui .nl1{margin-left:-.25rem}.swagger-ui .nl2{margin-left:-.5rem}.swagger-ui .nl3{margin-left:-1rem}.swagger-ui .nl4{margin-left:-2rem}.swagger-ui .nl5{margin-left:-4rem}.swagger-ui .nl6{margin-left:-8rem}.swagger-ui .nl7{margin-left:-16rem}.swagger-ui .nr1{margin-right:-.25rem}.swagger-ui .nr2{margin-right:-.5rem}.swagger-ui .nr3{margin-right:-1rem}.swagger-ui .nr4{margin-right:-2rem}.swagger-ui .nr5{margin-right:-4rem}.swagger-ui .nr6{margin-right:-8rem}.swagger-ui .nr7{margin-right:-16rem}.swagger-ui .nb1{margin-bottom:-.25rem}.swagger-ui .nb2{margin-bottom:-.5rem}.swagger-ui .nb3{margin-bottom:-1rem}.swagger-ui .nb4{margin-bottom:-2rem}.swagger-ui .nb5{margin-bottom:-4rem}.swagger-ui .nb6{margin-bottom:-8rem}.swagger-ui .nb7{margin-bottom:-16rem}.swagger-ui .nt1{margin-top:-.25rem}.swagger-ui .nt2{margin-top:-.5rem}.swagger-ui .nt3{margin-top:-1rem}.swagger-ui .nt4{margin-top:-2rem}.swagger-ui .nt5{margin-top:-4rem}.swagger-ui .nt6{margin-top:-8rem}.swagger-ui .nt7{margin-top:-16rem}@media screen and (min-width:30em){.swagger-ui .na1-ns{margin:-.25rem}.swagger-ui .na2-ns{margin:-.5rem}.swagger-ui .na3-ns{margin:-1rem}.swagger-ui .na4-ns{margin:-2rem}.swagger-ui .na5-ns{margin:-4rem}.swagger-ui .na6-ns{margin:-8rem}.swagger-ui .na7-ns{margin:-16rem}.swagger-ui .nl1-ns{margin-left:-.25rem}.swagger-ui .nl2-ns{margin-left:-.5rem}.swagger-ui .nl3-ns{margin-left:-1rem}.swagger-ui .nl4-ns{margin-left:-2rem}.swagger-ui .nl5-ns{margin-left:-4rem}.swagger-ui .nl6-ns{margin-left:-8rem}.swagger-ui .nl7-ns{margin-left:-16rem}.swagger-ui .nr1-ns{margin-right:-.25rem}.swagger-ui .nr2-ns{margin-right:-.5rem}.swagger-ui .nr3-ns{margin-right:-1rem}.swagger-ui .nr4-ns{margin-right:-2rem}.swagger-ui .nr5-ns{margin-right:-4rem}.swagger-ui .nr6-ns{margin-right:-8rem}.swagger-ui .nr7-ns{margin-right:-16rem}.swagger-ui .nb1-ns{margin-bottom:-.25rem}.swagger-ui .nb2-ns{margin-bottom:-.5rem}.swagger-ui .nb3-ns{margin-bottom:-1rem}.swagger-ui .nb4-ns{margin-bottom:-2rem}.swagger-ui .nb5-ns{margin-bottom:-4rem}.swagger-ui .nb6-ns{margin-bottom:-8rem}.swagger-ui .nb7-ns{margin-bottom:-16rem}.swagger-ui .nt1-ns{margin-top:-.25rem}.swagger-ui .nt2-ns{margin-top:-.5rem}.swagger-ui .nt3-ns{margin-top:-1rem}.swagger-ui .nt4-ns{margin-top:-2rem}.swagger-ui .nt5-ns{margin-top:-4rem}.swagger-ui .nt6-ns{margin-top:-8rem}.swagger-ui .nt7-ns{margin-top:-16rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .na1-m{margin:-.25rem}.swagger-ui .na2-m{margin:-.5rem}.swagger-ui .na3-m{margin:-1rem}.swagger-ui .na4-m{margin:-2rem}.swagger-ui .na5-m{margin:-4rem}.swagger-ui .na6-m{margin:-8rem}.swagger-ui .na7-m{margin:-16rem}.swagger-ui .nl1-m{margin-left:-.25rem}.swagger-ui .nl2-m{margin-left:-.5rem}.swagger-ui .nl3-m{margin-left:-1rem}.swagger-ui .nl4-m{margin-left:-2rem}.swagger-ui .nl5-m{margin-left:-4rem}.swagger-ui .nl6-m{margin-left:-8rem}.swagger-ui .nl7-m{margin-left:-16rem}.swagger-ui .nr1-m{margin-right:-.25rem}.swagger-ui .nr2-m{margin-right:-.5rem}.swagger-ui .nr3-m{margin-right:-1rem}.swagger-ui .nr4-m{margin-right:-2rem}.swagger-ui .nr5-m{margin-right:-4rem}.swagger-ui .nr6-m{margin-right:-8rem}.swagger-ui .nr7-m{margin-right:-16rem}.swagger-ui .nb1-m{margin-bottom:-.25rem}.swagger-ui .nb2-m{margin-bottom:-.5rem}.swagger-ui .nb3-m{margin-bottom:-1rem}.swagger-ui .nb4-m{margin-bottom:-2rem}.swagger-ui .nb5-m{margin-bottom:-4rem}.swagger-ui .nb6-m{margin-bottom:-8rem}.swagger-ui .nb7-m{margin-bottom:-16rem}.swagger-ui .nt1-m{margin-top:-.25rem}.swagger-ui .nt2-m{margin-top:-.5rem}.swagger-ui .nt3-m{margin-top:-1rem}.swagger-ui .nt4-m{margin-top:-2rem}.swagger-ui .nt5-m{margin-top:-4rem}.swagger-ui .nt6-m{margin-top:-8rem}.swagger-ui .nt7-m{margin-top:-16rem}}@media screen and (min-width:60em){.swagger-ui .na1-l{margin:-.25rem}.swagger-ui .na2-l{margin:-.5rem}.swagger-ui .na3-l{margin:-1rem}.swagger-ui .na4-l{margin:-2rem}.swagger-ui .na5-l{margin:-4rem}.swagger-ui .na6-l{margin:-8rem}.swagger-ui .na7-l{margin:-16rem}.swagger-ui .nl1-l{margin-left:-.25rem}.swagger-ui .nl2-l{margin-left:-.5rem}.swagger-ui .nl3-l{margin-left:-1rem}.swagger-ui .nl4-l{margin-left:-2rem}.swagger-ui .nl5-l{margin-left:-4rem}.swagger-ui .nl6-l{margin-left:-8rem}.swagger-ui .nl7-l{margin-left:-16rem}.swagger-ui .nr1-l{margin-right:-.25rem}.swagger-ui .nr2-l{margin-right:-.5rem}.swagger-ui .nr3-l{margin-right:-1rem}.swagger-ui .nr4-l{margin-right:-2rem}.swagger-ui .nr5-l{margin-right:-4rem}.swagger-ui .nr6-l{margin-right:-8rem}.swagger-ui .nr7-l{margin-right:-16rem}.swagger-ui .nb1-l{margin-bottom:-.25rem}.swagger-ui .nb2-l{margin-bottom:-.5rem}.swagger-ui .nb3-l{margin-bottom:-1rem}.swagger-ui .nb4-l{margin-bottom:-2rem}.swagger-ui .nb5-l{margin-bottom:-4rem}.swagger-ui .nb6-l{margin-bottom:-8rem}.swagger-ui .nb7-l{margin-bottom:-16rem}.swagger-ui .nt1-l{margin-top:-.25rem}.swagger-ui .nt2-l{margin-top:-.5rem}.swagger-ui .nt3-l{margin-top:-1rem}.swagger-ui .nt4-l{margin-top:-2rem}.swagger-ui .nt5-l{margin-top:-4rem}.swagger-ui .nt6-l{margin-top:-8rem}.swagger-ui .nt7-l{margin-top:-16rem}}.swagger-ui .collapse{border-collapse:collapse;border-spacing:0}.swagger-ui .striped--light-silver:nth-child(odd){background-color:#aaa}.swagger-ui .striped--moon-gray:nth-child(odd){background-color:#ccc}.swagger-ui .striped--light-gray:nth-child(odd){background-color:#eee}.swagger-ui .striped--near-white:nth-child(odd){background-color:#f4f4f4}.swagger-ui .stripe-light:nth-child(odd){background-color:hsla(0,0%,100%,.1)}.swagger-ui .stripe-dark:nth-child(odd){background-color:rgba(0,0,0,.1)}.swagger-ui .strike{text-decoration:line-through}.swagger-ui .underline{text-decoration:underline}.swagger-ui .no-underline{text-decoration:none}@media screen and (min-width:30em){.swagger-ui .strike-ns{text-decoration:line-through}.swagger-ui .underline-ns{text-decoration:underline}.swagger-ui .no-underline-ns{text-decoration:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .strike-m{text-decoration:line-through}.swagger-ui .underline-m{text-decoration:underline}.swagger-ui .no-underline-m{text-decoration:none}}@media screen and (min-width:60em){.swagger-ui .strike-l{text-decoration:line-through}.swagger-ui .underline-l{text-decoration:underline}.swagger-ui .no-underline-l{text-decoration:none}}.swagger-ui .tl{text-align:left}.swagger-ui .tr{text-align:right}.swagger-ui .tc{text-align:center}.swagger-ui .tj{text-align:justify}@media screen and (min-width:30em){.swagger-ui .tl-ns{text-align:left}.swagger-ui .tr-ns{text-align:right}.swagger-ui .tc-ns{text-align:center}.swagger-ui .tj-ns{text-align:justify}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .tl-m{text-align:left}.swagger-ui .tr-m{text-align:right}.swagger-ui .tc-m{text-align:center}.swagger-ui .tj-m{text-align:justify}}@media screen and (min-width:60em){.swagger-ui .tl-l{text-align:left}.swagger-ui .tr-l{text-align:right}.swagger-ui .tc-l{text-align:center}.swagger-ui .tj-l{text-align:justify}}.swagger-ui .ttc{text-transform:capitalize}.swagger-ui .ttl{text-transform:lowercase}.swagger-ui .ttu{text-transform:uppercase}.swagger-ui .ttn{text-transform:none}@media screen and (min-width:30em){.swagger-ui .ttc-ns{text-transform:capitalize}.swagger-ui .ttl-ns{text-transform:lowercase}.swagger-ui .ttu-ns{text-transform:uppercase}.swagger-ui .ttn-ns{text-transform:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ttc-m{text-transform:capitalize}.swagger-ui .ttl-m{text-transform:lowercase}.swagger-ui .ttu-m{text-transform:uppercase}.swagger-ui .ttn-m{text-transform:none}}@media screen and (min-width:60em){.swagger-ui .ttc-l{text-transform:capitalize}.swagger-ui .ttl-l{text-transform:lowercase}.swagger-ui .ttu-l{text-transform:uppercase}.swagger-ui .ttn-l{text-transform:none}}.swagger-ui .f-6,.swagger-ui .f-headline{font-size:6rem}.swagger-ui .f-5,.swagger-ui .f-subheadline{font-size:5rem}.swagger-ui .f1{font-size:3rem}.swagger-ui .f2{font-size:2.25rem}.swagger-ui .f3{font-size:1.5rem}.swagger-ui .f4{font-size:1.25rem}.swagger-ui .f5{font-size:1rem}.swagger-ui .f6{font-size:.875rem}.swagger-ui .f7{font-size:.75rem}@media screen and (min-width:30em){.swagger-ui .f-6-ns,.swagger-ui .f-headline-ns{font-size:6rem}.swagger-ui .f-5-ns,.swagger-ui .f-subheadline-ns{font-size:5rem}.swagger-ui .f1-ns{font-size:3rem}.swagger-ui .f2-ns{font-size:2.25rem}.swagger-ui .f3-ns{font-size:1.5rem}.swagger-ui .f4-ns{font-size:1.25rem}.swagger-ui .f5-ns{font-size:1rem}.swagger-ui .f6-ns{font-size:.875rem}.swagger-ui .f7-ns{font-size:.75rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .f-6-m,.swagger-ui .f-headline-m{font-size:6rem}.swagger-ui .f-5-m,.swagger-ui .f-subheadline-m{font-size:5rem}.swagger-ui .f1-m{font-size:3rem}.swagger-ui .f2-m{font-size:2.25rem}.swagger-ui .f3-m{font-size:1.5rem}.swagger-ui .f4-m{font-size:1.25rem}.swagger-ui .f5-m{font-size:1rem}.swagger-ui .f6-m{font-size:.875rem}.swagger-ui .f7-m{font-size:.75rem}}@media screen and (min-width:60em){.swagger-ui .f-6-l,.swagger-ui .f-headline-l{font-size:6rem}.swagger-ui .f-5-l,.swagger-ui .f-subheadline-l{font-size:5rem}.swagger-ui .f1-l{font-size:3rem}.swagger-ui .f2-l{font-size:2.25rem}.swagger-ui .f3-l{font-size:1.5rem}.swagger-ui .f4-l{font-size:1.25rem}.swagger-ui .f5-l{font-size:1rem}.swagger-ui .f6-l{font-size:.875rem}.swagger-ui .f7-l{font-size:.75rem}}.swagger-ui .measure{max-width:30em}.swagger-ui .measure-wide{max-width:34em}.swagger-ui .measure-narrow{max-width:20em}.swagger-ui .indent{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media screen and (min-width:30em){.swagger-ui .measure-ns{max-width:30em}.swagger-ui .measure-wide-ns{max-width:34em}.swagger-ui .measure-narrow-ns{max-width:20em}.swagger-ui .indent-ns{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-ns{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-ns{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .measure-m{max-width:30em}.swagger-ui .measure-wide-m{max-width:34em}.swagger-ui .measure-narrow-m{max-width:20em}.swagger-ui .indent-m{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-m{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-m{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}@media screen and (min-width:60em){.swagger-ui .measure-l{max-width:30em}.swagger-ui .measure-wide-l{max-width:34em}.swagger-ui .measure-narrow-l{max-width:20em}.swagger-ui .indent-l{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-l{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-l{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}.swagger-ui .overflow-container{overflow-y:scroll}.swagger-ui .center{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto{margin-right:auto}.swagger-ui .ml-auto{margin-left:auto}@media screen and (min-width:30em){.swagger-ui .center-ns{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-ns{margin-right:auto}.swagger-ui .ml-auto-ns{margin-left:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .center-m{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-m{margin-right:auto}.swagger-ui .ml-auto-m{margin-left:auto}}@media screen and (min-width:60em){.swagger-ui .center-l{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-l{margin-right:auto}.swagger-ui .ml-auto-l{margin-left:auto}}.swagger-ui .clip{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);position:fixed!important;_position:absolute!important}@media screen and (min-width:30em){.swagger-ui .clip-ns{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);position:fixed!important;_position:absolute!important}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .clip-m{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);position:fixed!important;_position:absolute!important}}@media screen and (min-width:60em){.swagger-ui .clip-l{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);position:fixed!important;_position:absolute!important}}.swagger-ui .ws-normal{white-space:normal}.swagger-ui .nowrap{white-space:nowrap}.swagger-ui .pre{white-space:pre}@media screen and (min-width:30em){.swagger-ui .ws-normal-ns{white-space:normal}.swagger-ui .nowrap-ns{white-space:nowrap}.swagger-ui .pre-ns{white-space:pre}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ws-normal-m{white-space:normal}.swagger-ui .nowrap-m{white-space:nowrap}.swagger-ui .pre-m{white-space:pre}}@media screen and (min-width:60em){.swagger-ui .ws-normal-l{white-space:normal}.swagger-ui .nowrap-l{white-space:nowrap}.swagger-ui .pre-l{white-space:pre}}.swagger-ui .v-base{vertical-align:baseline}.swagger-ui .v-mid{vertical-align:middle}.swagger-ui .v-top{vertical-align:top}.swagger-ui .v-btm{vertical-align:bottom}@media screen and (min-width:30em){.swagger-ui .v-base-ns{vertical-align:baseline}.swagger-ui .v-mid-ns{vertical-align:middle}.swagger-ui .v-top-ns{vertical-align:top}.swagger-ui .v-btm-ns{vertical-align:bottom}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .v-base-m{vertical-align:baseline}.swagger-ui .v-mid-m{vertical-align:middle}.swagger-ui .v-top-m{vertical-align:top}.swagger-ui .v-btm-m{vertical-align:bottom}}@media screen and (min-width:60em){.swagger-ui .v-base-l{vertical-align:baseline}.swagger-ui .v-mid-l{vertical-align:middle}.swagger-ui .v-top-l{vertical-align:top}.swagger-ui .v-btm-l{vertical-align:bottom}}.swagger-ui .dim{opacity:1;transition:opacity .15s ease-in}.swagger-ui .dim:focus,.swagger-ui .dim:hover{opacity:.5;transition:opacity .15s ease-in}.swagger-ui .dim:active{opacity:.8;transition:opacity .15s ease-out}.swagger-ui .glow{transition:opacity .15s ease-in}.swagger-ui .glow:focus,.swagger-ui .glow:hover{opacity:1;transition:opacity .15s ease-in}.swagger-ui .hide-child .child{opacity:0;transition:opacity .15s ease-in}.swagger-ui .hide-child:active .child,.swagger-ui .hide-child:focus .child,.swagger-ui .hide-child:hover .child{opacity:1;transition:opacity .15s ease-in}.swagger-ui .underline-hover:focus,.swagger-ui .underline-hover:hover{text-decoration:underline}.swagger-ui .grow{-moz-osx-font-smoothing:grayscale;-webkit-backface-visibility:hidden;backface-visibility:hidden;transform:translateZ(0);transition:transform .25s ease-out}.swagger-ui .grow:focus,.swagger-ui .grow:hover{transform:scale(1.05)}.swagger-ui .grow:active{transform:scale(.9)}.swagger-ui .grow-large{-moz-osx-font-smoothing:grayscale;-webkit-backface-visibility:hidden;backface-visibility:hidden;transform:translateZ(0);transition:transform .25s ease-in-out}.swagger-ui .grow-large:focus,.swagger-ui .grow-large:hover{transform:scale(1.2)}.swagger-ui .grow-large:active{transform:scale(.95)}.swagger-ui .pointer:hover{cursor:pointer}.swagger-ui .shadow-hover{cursor:pointer;position:relative;transition:all .5s cubic-bezier(.165,.84,.44,1)}.swagger-ui .shadow-hover:after{border-radius:inherit;box-shadow:0 0 16px 2px rgba(0,0,0,.2);content:"";height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .5s cubic-bezier(.165,.84,.44,1);width:100%;z-index:-1}.swagger-ui .shadow-hover:focus:after,.swagger-ui .shadow-hover:hover:after{opacity:1}.swagger-ui .bg-animate,.swagger-ui .bg-animate:focus,.swagger-ui .bg-animate:hover{transition:background-color .15s ease-in-out}.swagger-ui .z-0{z-index:0}.swagger-ui .z-1{z-index:1}.swagger-ui .z-2{z-index:2}.swagger-ui .z-3{z-index:3}.swagger-ui .z-4{z-index:4}.swagger-ui .z-5{z-index:5}.swagger-ui .z-999{z-index:999}.swagger-ui .z-9999{z-index:9999}.swagger-ui .z-max{z-index:2147483647}.swagger-ui .z-inherit{z-index:inherit}.swagger-ui .z-initial{z-index:auto}.swagger-ui .z-unset{z-index:unset}.swagger-ui .nested-copy-line-height ol,.swagger-ui .nested-copy-line-height p,.swagger-ui .nested-copy-line-height ul{line-height:1.5}.swagger-ui .nested-headline-line-height h1,.swagger-ui .nested-headline-line-height h2,.swagger-ui .nested-headline-line-height h3,.swagger-ui .nested-headline-line-height h4,.swagger-ui .nested-headline-line-height h5,.swagger-ui .nested-headline-line-height h6{line-height:1.25}.swagger-ui .nested-list-reset ol,.swagger-ui .nested-list-reset ul{list-style-type:none;margin-left:0;padding-left:0}.swagger-ui .nested-copy-indent p+p{margin-bottom:0;margin-top:0;text-indent:.1em}.swagger-ui .nested-copy-seperator p+p{margin-top:1.5em}.swagger-ui .nested-img img{display:block;max-width:100%;width:100%}.swagger-ui .nested-links a{color:#357edd;transition:color .15s ease-in}.swagger-ui .nested-links a:focus,.swagger-ui .nested-links a:hover{color:#96ccff;transition:color .15s ease-in}.swagger-ui .wrapper{box-sizing:border-box;margin:0 auto;max-width:1460px;padding:0 20px;width:100%}.swagger-ui .opblock-tag-section{display:flex;flex-direction:column}.swagger-ui .try-out.btn-group{display:flex;flex:0.1 2 auto;padding:0}.swagger-ui .try-out__btn{margin-left:1.25rem}.swagger-ui .opblock-tag{align-items:center;border-bottom:1px solid rgba(59,65,81,.3);cursor:pointer;display:flex;padding:10px 20px 10px 10px;transition:all .2s}.swagger-ui .opblock-tag:hover{background:rgba(0,0,0,.02)}.swagger-ui .opblock-tag{color:#3b4151;font-family:sans-serif;font-size:24px;margin:0 0 5px}.swagger-ui .opblock-tag.no-desc span{flex:1}.swagger-ui .opblock-tag svg{transition:all .4s}.swagger-ui .opblock-tag small{color:#3b4151;flex:1;font-family:sans-serif;font-size:14px;font-weight:400;padding:0 10px}.swagger-ui .parameter__type{color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;padding:5px 0}.swagger-ui .parameter-controls{margin-top:.75em}.swagger-ui .examples__title{display:block;font-size:1.1em;font-weight:700;margin-bottom:.75em}.swagger-ui .examples__section{margin-top:1.5em}.swagger-ui .examples__section-header{font-size:.9rem;font-weight:700;margin-bottom:.5rem}.swagger-ui .examples-select{display:inline-block;margin-bottom:.75em}.swagger-ui .examples-select .examples-select-element{width:100%}.swagger-ui .examples-select__section-label{font-size:.9rem;font-weight:700;margin-right:.5rem}.swagger-ui .example__section{margin-top:1.5em}.swagger-ui .example__section-header{font-size:.9rem;font-weight:700;margin-bottom:.5rem}.swagger-ui .view-line-link{cursor:pointer;margin:0 5px;position:relative;top:3px;transition:all .5s;width:20px}.swagger-ui .opblock{border:1px solid #000;border-radius:4px;box-shadow:0 0 3px rgba(0,0,0,.19);margin:0 0 15px}.swagger-ui .opblock .tab-header{display:flex;flex:1}.swagger-ui .opblock .tab-header .tab-item{cursor:pointer;padding:0 40px}.swagger-ui .opblock .tab-header .tab-item:first-of-type{padding:0 40px 0 0}.swagger-ui .opblock .tab-header .tab-item.active h4 span{position:relative}.swagger-ui .opblock .tab-header .tab-item.active h4 span:after{background:gray;bottom:-15px;content:"";height:4px;left:50%;position:absolute;transform:translateX(-50%);width:120%}.swagger-ui .opblock.is-open .opblock-summary{border-bottom:1px solid #000}.swagger-ui .opblock .opblock-section-header{align-items:center;background:hsla(0,0%,100%,.8);box-shadow:0 1px 2px rgba(0,0,0,.1);display:flex;min-height:50px;padding:8px 20px}.swagger-ui .opblock .opblock-section-header>label{align-items:center;color:#3b4151;display:flex;font-family:sans-serif;font-size:12px;font-weight:700;margin:0 0 0 auto}.swagger-ui .opblock .opblock-section-header>label>span{padding:0 10px 0 0}.swagger-ui .opblock .opblock-section-header h4{color:#3b4151;flex:1;font-family:sans-serif;font-size:14px;margin:0}.swagger-ui .opblock .opblock-summary-method{background:#000;border-radius:3px;color:#fff;font-family:sans-serif;font-size:14px;font-weight:700;min-width:80px;padding:6px 0;text-align:center;text-shadow:0 1px 0 rgba(0,0,0,.1)}.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{align-items:center;color:#3b4151;display:flex;font-family:monospace;font-size:16px;font-weight:600;padding:0 10px;word-break:break-word}@media (max-width:768px){.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{font-size:12px}}.swagger-ui .opblock .opblock-summary-path{flex-shrink:0;max-width:calc(100% - 110px - 15rem)}.swagger-ui .opblock .opblock-summary-path__deprecated{text-decoration:line-through}.swagger-ui .opblock .opblock-summary-operation-id{font-size:14px}.swagger-ui .opblock .opblock-summary-description{color:#3b4151;flex:1 1 auto;font-family:sans-serif;font-size:13px;word-break:break-word}.swagger-ui .opblock .opblock-summary{align-items:center;cursor:pointer;display:flex;padding:5px}.swagger-ui .opblock .opblock-summary .view-line-link{cursor:pointer;margin:0;position:relative;top:2px;transition:all .5s;width:0}.swagger-ui .opblock .opblock-summary:hover .view-line-link{margin:0 5px;width:18px}.swagger-ui .opblock.opblock-post{background:rgba(73,204,144,.1);border-color:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary-method{background:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary{border-color:#49cc90}.swagger-ui .opblock.opblock-post .tab-header .tab-item.active h4 span:after{background:#49cc90}.swagger-ui .opblock.opblock-put{background:rgba(252,161,48,.1);border-color:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary-method{background:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary{border-color:#fca130}.swagger-ui .opblock.opblock-put .tab-header .tab-item.active h4 span:after{background:#fca130}.swagger-ui .opblock.opblock-delete{background:rgba(249,62,62,.1);border-color:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary-method{background:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary{border-color:#f93e3e}.swagger-ui .opblock.opblock-delete .tab-header .tab-item.active h4 span:after{background:#f93e3e}.swagger-ui .opblock.opblock-get{background:rgba(97,175,254,.1);border-color:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary-method{background:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary{border-color:#61affe}.swagger-ui .opblock.opblock-get .tab-header .tab-item.active h4 span:after{background:#61affe}.swagger-ui .opblock.opblock-patch{background:rgba(80,227,194,.1);border-color:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary-method{background:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary{border-color:#50e3c2}.swagger-ui .opblock.opblock-patch .tab-header .tab-item.active h4 span:after{background:#50e3c2}.swagger-ui .opblock.opblock-head{background:rgba(144,18,254,.1);border-color:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary-method{background:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary{border-color:#9012fe}.swagger-ui .opblock.opblock-head .tab-header .tab-item.active h4 span:after{background:#9012fe}.swagger-ui .opblock.opblock-options{background:rgba(13,90,167,.1);border-color:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary-method{background:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary{border-color:#0d5aa7}.swagger-ui .opblock.opblock-options .tab-header .tab-item.active h4 span:after{background:#0d5aa7}.swagger-ui .opblock.opblock-deprecated{background:hsla(0,0%,92%,.1);border-color:#ebebeb;opacity:.6}.swagger-ui .opblock.opblock-deprecated .opblock-summary-method{background:#ebebeb}.swagger-ui .opblock.opblock-deprecated .opblock-summary{border-color:#ebebeb}.swagger-ui .opblock.opblock-deprecated .tab-header .tab-item.active h4 span:after{background:#ebebeb}.swagger-ui .opblock .opblock-schemes{padding:8px 20px}.swagger-ui .opblock .opblock-schemes .schemes-title{padding:0 10px 0 0}.swagger-ui .filter .operation-filter-input{border:2px solid #d8dde7;margin:20px 0;padding:10px;width:100%}.swagger-ui .download-url-wrapper .failed,.swagger-ui .filter .failed{color:red}.swagger-ui .download-url-wrapper .loading,.swagger-ui .filter .loading{color:#aaa}.swagger-ui .model-example{margin-top:1em}.swagger-ui .tab{display:flex;list-style:none;padding:0}.swagger-ui .tab li{color:#3b4151;cursor:pointer;font-family:sans-serif;font-size:12px;min-width:60px;padding:0}.swagger-ui .tab li:first-of-type{padding-left:0;padding-right:12px;position:relative}.swagger-ui .tab li:first-of-type:after{background:rgba(0,0,0,.2);content:"";height:100%;position:absolute;right:6px;top:0;width:1px}.swagger-ui .tab li.active{font-weight:700}.swagger-ui .tab li button.tablinks{background:none;border:0;color:inherit;font-family:inherit;font-weight:inherit;padding:0}.swagger-ui .opblock-description-wrapper,.swagger-ui .opblock-external-docs-wrapper,.swagger-ui .opblock-title_normal{color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px;padding:15px 20px}.swagger-ui .opblock-description-wrapper h4,.swagger-ui .opblock-external-docs-wrapper h4,.swagger-ui .opblock-title_normal h4{color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px}.swagger-ui .opblock-description-wrapper p,.swagger-ui .opblock-external-docs-wrapper p,.swagger-ui .opblock-title_normal p{color:#3b4151;font-family:sans-serif;font-size:14px;margin:0}.swagger-ui .opblock-external-docs-wrapper h4{padding-left:0}.swagger-ui .execute-wrapper{padding:20px;text-align:right}.swagger-ui .execute-wrapper .btn{padding:8px 40px;width:100%}.swagger-ui .body-param-options{display:flex;flex-direction:column}.swagger-ui .body-param-options .body-param-edit{padding:10px 0}.swagger-ui .body-param-options label{padding:8px 0}.swagger-ui .body-param-options label select{margin:3px 0 0}.swagger-ui .responses-inner{padding:20px}.swagger-ui .responses-inner h4,.swagger-ui .responses-inner h5{color:#3b4151;font-family:sans-serif;font-size:12px;margin:10px 0 5px}.swagger-ui .responses-inner .curl{white-space:normal}.swagger-ui .response-col_status{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .response-col_status .response-undocumented{color:#909090;font-family:monospace;font-size:11px;font-weight:600}.swagger-ui .response-col_links{color:#3b4151;font-family:sans-serif;font-size:14px;max-width:40em;padding-left:2em}.swagger-ui .response-col_links .response-undocumented{color:#909090;font-family:monospace;font-size:11px;font-weight:600}.swagger-ui .response-col_links .operation-link{margin-bottom:1.5em}.swagger-ui .response-col_links .operation-link .description{margin-bottom:.5em}.swagger-ui .opblock-body .opblock-loading-animation{display:block;margin:3em auto}.swagger-ui .opblock-body pre.microlight{word-wrap:break-word;background:#333;border-radius:4px;color:#fff;font-family:monospace;font-size:12px;font-weight:600;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;margin:0;padding:10px;white-space:pre-wrap;word-break:break-all;word-break:break-word}.swagger-ui .opblock-body pre.microlight .headerline{display:block}.swagger-ui .highlight-code{position:relative}.swagger-ui .highlight-code>.microlight{max-height:400px;min-height:6em;overflow-y:auto}.swagger-ui .highlight-code>.microlight code{white-space:pre-wrap!important;word-break:break-all}.swagger-ui .curl-command{position:relative}.swagger-ui .download-contents{align-items:center;background:#7d8293;border-radius:4px;bottom:10px;color:#fff;cursor:pointer;display:flex;font-family:sans-serif;font-size:14px;font-weight:600;height:30px;justify-content:center;padding:5px;position:absolute;right:10px;text-align:center}.swagger-ui .scheme-container{background:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.15);margin:0 0 20px;padding:30px 0}.swagger-ui .scheme-container .schemes{align-items:flex-end;display:flex}.swagger-ui .scheme-container .schemes>label{color:#3b4151;display:flex;flex-direction:column;font-family:sans-serif;font-size:12px;font-weight:700;margin:-20px 15px 0 0}.swagger-ui .scheme-container .schemes>label select{min-width:130px;text-transform:uppercase}.swagger-ui .loading-container{align-items:center;display:flex;flex-direction:column;justify-content:center;margin-top:1em;min-height:1px;padding:40px 0 60px}.swagger-ui .loading-container .loading{position:relative}.swagger-ui .loading-container .loading:after{color:#3b4151;content:"loading";font-family:sans-serif;font-size:10px;font-weight:700;left:50%;position:absolute;text-transform:uppercase;top:50%;transform:translate(-50%,-50%)}.swagger-ui .loading-container .loading:before{-webkit-animation:rotation 1s linear infinite,opacity .5s;animation:rotation 1s linear infinite,opacity .5s;-webkit-backface-visibility:hidden;backface-visibility:hidden;border:2px solid rgba(85,85,85,.1);border-radius:100%;border-top-color:rgba(0,0,0,.6);content:"";display:block;height:60px;left:50%;margin:-30px;opacity:1;position:absolute;top:50%;width:60px}@-webkit-keyframes rotation{to{transform:rotate(1turn)}}@keyframes rotation{to{transform:rotate(1turn)}}.swagger-ui .response-controls{display:flex;padding-top:1em}.swagger-ui .response-control-media-type{margin-right:1em}.swagger-ui .response-control-media-type--accept-controller select{border-color:green}.swagger-ui .response-control-media-type__accept-message{color:green;font-size:.7em}.swagger-ui .response-control-examples__title,.swagger-ui .response-control-media-type__title{display:block;font-size:.7em;margin-bottom:.2em}@-webkit-keyframes blinker{50%{opacity:0}}@keyframes blinker{50%{opacity:0}}.swagger-ui .hidden{display:none}.swagger-ui .no-margin{border:none;height:auto;margin:0;padding:0}.swagger-ui .float-right{float:right}.swagger-ui .svg-assets{height:0;position:absolute;width:0}.swagger-ui section h3{color:#3b4151;font-family:sans-serif}.swagger-ui a.nostyle{display:inline}.swagger-ui a.nostyle,.swagger-ui a.nostyle:visited{color:inherit;cursor:pointer;text-decoration:inherit}.swagger-ui .fallback{color:#aaa;padding:1em}.swagger-ui .version-pragma{height:100%;padding:5em 0}.swagger-ui .version-pragma__message{display:flex;font-size:1.2em;height:100%;justify-content:center;line-height:1.5em;padding:0 .6em;text-align:center}.swagger-ui .version-pragma__message>div{flex:1;max-width:55ch}.swagger-ui .version-pragma__message code{background-color:#dedede;padding:4px 4px 2px;white-space:pre}.swagger-ui .opblock-link{font-weight:400}.swagger-ui .opblock-link.shown{font-weight:700}.swagger-ui span.token-string{color:#555}.swagger-ui span.token-not-formatted{color:#555;font-weight:700}.swagger-ui .btn{background:transparent;border:2px solid gray;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.1);color:#3b4151;font-family:sans-serif;font-size:14px;font-weight:700;padding:5px 23px;transition:all .3s}.swagger-ui .btn.btn-sm{font-size:12px;padding:4px 23px}.swagger-ui .btn[disabled]{cursor:not-allowed;opacity:.3}.swagger-ui .btn:hover{box-shadow:0 0 5px rgba(0,0,0,.3)}.swagger-ui .btn.cancel{background-color:transparent;border-color:#ff6060;color:#ff6060;font-family:sans-serif}.swagger-ui .btn.authorize{background-color:transparent;border-color:#49cc90;color:#49cc90;display:inline;line-height:1}.swagger-ui .btn.authorize span{float:left;padding:4px 20px 0 0}.swagger-ui .btn.authorize svg{fill:#49cc90}.swagger-ui .btn.execute{background-color:#4990e2;border-color:#4990e2;color:#fff}.swagger-ui .btn-group{display:flex;padding:30px}.swagger-ui .btn-group .btn{flex:1}.swagger-ui .btn-group .btn:first-child{border-radius:4px 0 0 4px}.swagger-ui .btn-group .btn:last-child{border-radius:0 4px 4px 0}.swagger-ui .authorization__btn{background:none;border:none;padding:0 10px}.swagger-ui .authorization__btn.locked{opacity:1}.swagger-ui .authorization__btn.unlocked{opacity:.4}.swagger-ui .model-box-control,.swagger-ui .models-control,.swagger-ui .opblock-summary-control{all:inherit;border-bottom:0;cursor:pointer;flex:1;padding:0}.swagger-ui .model-box-control:focus,.swagger-ui .models-control:focus,.swagger-ui .opblock-summary-control:focus{outline:auto}.swagger-ui .expand-methods,.swagger-ui .expand-operation{background:none;border:none}.swagger-ui .expand-methods svg,.swagger-ui .expand-operation svg{height:20px;width:20px}.swagger-ui .expand-methods{padding:0 10px}.swagger-ui .expand-methods:hover svg{fill:#404040}.swagger-ui .expand-methods svg{fill:#707070;transition:all .3s}.swagger-ui button{cursor:pointer}.swagger-ui button.invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui .copy-to-clipboard{align-items:center;background:#7d8293;border:none;border-radius:4px;bottom:10px;display:flex;height:30px;justify-content:center;position:absolute;right:100px;width:30px}.swagger-ui .copy-to-clipboard button{background:url('data:image/svg+xml;charset=utf-8,') 50% no-repeat;border:none;flex-grow:1;flex-shrink:1;height:25px}.swagger-ui .curl-command .copy-to-clipboard{bottom:5px;height:20px;right:10px;width:20px}.swagger-ui .curl-command .copy-to-clipboard button{height:18px}.swagger-ui select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#f7f7f7 url('data:image/svg+xml;charset=utf-8,') right 10px center no-repeat;background-size:20px;border:2px solid #41444e;border-radius:4px;box-shadow:0 1px 2px 0 rgba(0,0,0,.25);color:#3b4151;font-family:sans-serif;font-size:14px;font-weight:700;padding:5px 40px 5px 10px}.swagger-ui select[multiple]{background:#f7f7f7;margin:5px 0;padding:5px}.swagger-ui select.invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui .opblock-body select{min-width:230px}@media (max-width:768px){.swagger-ui .opblock-body select{min-width:180px}}.swagger-ui label{color:#3b4151;font-family:sans-serif;font-size:12px;font-weight:700;margin:0 0 5px}@media (max-width:768px){.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text]{max-width:175px}}.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text],.swagger-ui textarea{background:#fff;border:1px solid #d9d9d9;border-radius:4px;margin:5px 0;min-width:100px;padding:8px 10px}.swagger-ui input[type=email].invalid,.swagger-ui input[type=file].invalid,.swagger-ui input[type=password].invalid,.swagger-ui input[type=search].invalid,.swagger-ui input[type=text].invalid,.swagger-ui textarea.invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui input[disabled],.swagger-ui select[disabled],.swagger-ui textarea[disabled]{background-color:#fafafa;color:#888;cursor:not-allowed}.swagger-ui select[disabled]{border-color:#888}.swagger-ui textarea[disabled]{background-color:#41444e;color:#fff}@-webkit-keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}@keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}.swagger-ui textarea{background:hsla(0,0%,100%,.8);border:none;border-radius:4px;color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;min-height:280px;outline:none;padding:10px;width:100%}.swagger-ui textarea:focus{border:2px solid #61affe}.swagger-ui textarea.curl{background:#41444e;border-radius:4px;color:#fff;font-family:monospace;font-size:12px;font-weight:600;margin:0;min-height:100px;padding:10px;resize:none}.swagger-ui .checkbox{color:#303030;padding:5px 0 10px;transition:opacity .5s}.swagger-ui .checkbox label{display:flex}.swagger-ui .checkbox p{color:#3b4151;font-family:monospace;font-style:italic;font-weight:400!important;font-weight:600;margin:0!important}.swagger-ui .checkbox input[type=checkbox]{display:none}.swagger-ui .checkbox input[type=checkbox]+label>.item{background:#e8e8e8;border-radius:1px;box-shadow:0 0 0 2px #e8e8e8;cursor:pointer;display:inline-block;flex:none;height:16px;margin:0 8px 0 0;padding:5px;position:relative;top:3px;width:16px}.swagger-ui .checkbox input[type=checkbox]+label>.item:active{transform:scale(.9)}.swagger-ui .checkbox input[type=checkbox]:checked+label>.item{background:#e8e8e8 url('data:image/svg+xml;charset=utf-8,') 50% no-repeat}.swagger-ui .dialog-ux{bottom:0;left:0;position:fixed;right:0;top:0;z-index:9999}.swagger-ui .dialog-ux .backdrop-ux{background:rgba(0,0,0,.8);bottom:0;left:0;position:fixed;right:0;top:0}.swagger-ui .dialog-ux .modal-ux{background:#fff;border:1px solid #ebebeb;border-radius:4px;box-shadow:0 10px 30px 0 rgba(0,0,0,.2);left:50%;max-width:650px;min-width:300px;position:absolute;top:50%;transform:translate(-50%,-50%);width:100%;z-index:9999}.swagger-ui .dialog-ux .modal-ux-content{max-height:540px;overflow-y:auto;padding:20px}.swagger-ui .dialog-ux .modal-ux-content p{color:#41444e;color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px}.swagger-ui .dialog-ux .modal-ux-content h4{color:#3b4151;font-family:sans-serif;font-size:18px;font-weight:600;margin:15px 0 0}.swagger-ui .dialog-ux .modal-ux-header{align-items:center;border-bottom:1px solid #ebebeb;display:flex;padding:12px 0}.swagger-ui .dialog-ux .modal-ux-header .close-modal{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:none;padding:0 10px}.swagger-ui .dialog-ux .modal-ux-header h3{color:#3b4151;flex:1;font-family:sans-serif;font-size:20px;font-weight:600;margin:0;padding:0 20px}.swagger-ui .model{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300;font-weight:600}.swagger-ui .model .deprecated span,.swagger-ui .model .deprecated td{color:#a0a0a0!important}.swagger-ui .model .deprecated>td:first-of-type{text-decoration:line-through}.swagger-ui .model-toggle{cursor:pointer;display:inline-block;font-size:10px;margin:auto .3em;position:relative;top:6px;transform:rotate(90deg);transform-origin:50% 50%;transition:transform .15s ease-in}.swagger-ui .model-toggle.collapsed{transform:rotate(0deg)}.swagger-ui .model-toggle:after{background:url('data:image/svg+xml;charset=utf-8,') 50% no-repeat;background-size:100%;content:"";display:block;height:20px;width:20px}.swagger-ui .model-jump-to-path{cursor:pointer;position:relative}.swagger-ui .model-jump-to-path .view-line-link{cursor:pointer;position:absolute;top:-.4em}.swagger-ui .model-title{position:relative}.swagger-ui .model-title:hover .model-hint{visibility:visible}.swagger-ui .model-hint{background:rgba(0,0,0,.7);border-radius:4px;color:#ebebeb;padding:.1em .5em;position:absolute;top:-1.8em;visibility:hidden;white-space:nowrap}.swagger-ui .model p{margin:0 0 1em}.swagger-ui .model .property{color:#999;font-style:italic}.swagger-ui .model .property.primitive{color:#6b6b6b}.swagger-ui table.model tr.description{color:#666;font-weight:400}.swagger-ui table.model tr.description td:first-child,.swagger-ui table.model tr.property-row.required td:first-child{font-weight:700}.swagger-ui table.model tr.property-row td{vertical-align:top}.swagger-ui table.model tr.property-row td:first-child{padding-right:.2em}.swagger-ui table.model tr.property-row .star{color:red}.swagger-ui table.model tr.extension{color:#777}.swagger-ui table.model tr.extension td:last-child{vertical-align:top}.swagger-ui section.models{border:1px solid rgba(59,65,81,.3);border-radius:4px;margin:30px 0}.swagger-ui section.models .pointer{cursor:pointer}.swagger-ui section.models.is-open{padding:0 0 20px}.swagger-ui section.models.is-open h4{border-bottom:1px solid rgba(59,65,81,.3);margin:0 0 5px}.swagger-ui section.models h4{align-items:center;color:#606060;cursor:pointer;display:flex;font-family:sans-serif;font-size:16px;margin:0;padding:10px 20px 10px 10px;transition:all .2s}.swagger-ui section.models h4 svg{transition:all .4s}.swagger-ui section.models h4 span{flex:1}.swagger-ui section.models h4:hover{background:rgba(0,0,0,.02)}.swagger-ui section.models h5{color:#707070;font-family:sans-serif;font-size:16px;margin:0 0 10px}.swagger-ui section.models .model-jump-to-path{position:relative;top:5px}.swagger-ui section.models .model-container{background:rgba(0,0,0,.05);border-radius:4px;margin:0 20px 15px;position:relative;transition:all .5s}.swagger-ui section.models .model-container:hover{background:rgba(0,0,0,.07)}.swagger-ui section.models .model-container:first-of-type{margin:20px}.swagger-ui section.models .model-container:last-of-type{margin:0 20px}.swagger-ui section.models .model-container .models-jump-to-path{opacity:.65;position:absolute;right:5px;top:8px}.swagger-ui section.models .model-box{background:none}.swagger-ui .model-box{background:rgba(0,0,0,.1);border-radius:4px;display:inline-block;padding:10px}.swagger-ui .model-box .model-jump-to-path{position:relative;top:4px}.swagger-ui .model-box.deprecated{opacity:.5}.swagger-ui .model-title{color:#505050;font-family:sans-serif;font-size:16px}.swagger-ui .model-title img{bottom:0;margin-left:1em;position:relative}.swagger-ui .model-deprecated-warning{color:#f93e3e;font-family:sans-serif;font-size:16px;font-weight:600;margin-right:1em}.swagger-ui span>span.model .brace-close{padding:0 0 0 10px}.swagger-ui .prop-name{display:inline-block;margin-right:1em}.swagger-ui .prop-type{color:#55a}.swagger-ui .prop-enum{display:block}.swagger-ui .prop-format{color:#606060}.swagger-ui .servers>label{color:#3b4151;font-family:sans-serif;font-size:12px;margin:-20px 15px 0 0}.swagger-ui .servers>label select{max-width:100%;min-width:130px}.swagger-ui .servers h4.message{padding-bottom:2em}.swagger-ui .servers table tr{width:30em}.swagger-ui .servers table td{display:inline-block;max-width:15em;padding-bottom:10px;padding-top:10px;vertical-align:middle}.swagger-ui .servers table td:first-of-type{padding-right:1em}.swagger-ui .servers table td input{height:100%;width:100%}.swagger-ui .servers .computed-url{margin:2em 0}.swagger-ui .servers .computed-url code{display:inline-block;font-size:16px;margin:0 1em;padding:4px}.swagger-ui .servers-title{font-size:12px;font-weight:700}.swagger-ui .operation-servers h4.message{margin-bottom:2em}.swagger-ui table{border-collapse:collapse;padding:0 10px;width:100%}.swagger-ui table.model tbody tr td{padding:0;vertical-align:top}.swagger-ui table.model tbody tr td:first-of-type{padding:0 0 0 2em;width:174px}.swagger-ui table.headers td{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300;font-weight:600;vertical-align:middle}.swagger-ui table.headers .header-example{color:#999;font-style:italic}.swagger-ui table tbody tr td{padding:10px 0 0;vertical-align:top}.swagger-ui table tbody tr td:first-of-type{min-width:6em;padding:10px 0}.swagger-ui table thead tr td,.swagger-ui table thead tr th{border-bottom:1px solid rgba(59,65,81,.2);color:#3b4151;font-family:sans-serif;font-size:12px;font-weight:700;padding:12px 0;text-align:left}.swagger-ui .parameters-col_description{margin-bottom:2em;width:99%}.swagger-ui .parameters-col_description input[type=text]{max-width:340px;width:100%}.swagger-ui .parameters-col_description select{border-width:1px}.swagger-ui .parameter__name{color:#3b4151;font-family:sans-serif;font-size:16px;font-weight:400;margin-right:.75em}.swagger-ui .parameter__name.required{font-weight:700}.swagger-ui .parameter__name.required span{color:red}.swagger-ui .parameter__name.required:after{color:rgba(255,0,0,.6);content:"required";font-size:10px;padding:5px;position:relative;top:-6px}.swagger-ui .parameter__extension,.swagger-ui .parameter__in{color:gray;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .parameter__deprecated{color:red;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .parameter__empty_value_toggle{display:block;font-size:13px;padding-bottom:12px;padding-top:5px}.swagger-ui .parameter__empty_value_toggle input{margin-right:7px}.swagger-ui .parameter__empty_value_toggle.disabled{opacity:.7}.swagger-ui .table-container{padding:20px}.swagger-ui .response-col_description{width:99%}.swagger-ui .response-col_links{min-width:6em}.swagger-ui .response__extension{color:gray;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .topbar{background-color:#1b1b1b;padding:10px 0}.swagger-ui .topbar .topbar-wrapper,.swagger-ui .topbar a{align-items:center;display:flex}.swagger-ui .topbar a{color:#fff;flex:1;font-family:sans-serif;font-size:1.5em;font-weight:700;max-width:300px;text-decoration:none}.swagger-ui .topbar a span{margin:0;padding:0 10px}.swagger-ui .topbar .download-url-wrapper{display:flex;flex:3;justify-content:flex-end}.swagger-ui .topbar .download-url-wrapper input[type=text]{border:2px solid #62a03f;border-radius:4px 0 0 4px;margin:0;outline:none;width:100%}.swagger-ui .topbar .download-url-wrapper .select-label{align-items:center;color:#f0f0f0;display:flex;margin:0;max-width:600px;width:100%}.swagger-ui .topbar .download-url-wrapper .select-label span{flex:1;font-size:16px;padding:0 10px 0 0;text-align:right}.swagger-ui .topbar .download-url-wrapper .select-label select{border:2px solid #62a03f;box-shadow:none;flex:2;outline:none;width:100%}.swagger-ui .topbar .download-url-wrapper .download-url-button{background:#62a03f;border:none;border-radius:0 4px 4px 0;color:#fff;font-family:sans-serif;font-size:16px;font-weight:700;padding:4px 30px}.swagger-ui .info{margin:50px 0}.swagger-ui .info.failed-config{margin-left:auto;margin-right:auto;max-width:880px;text-align:center}.swagger-ui .info hgroup.main{margin:0 0 20px}.swagger-ui .info hgroup.main a{font-size:12px}.swagger-ui .info pre{font-size:14px}.swagger-ui .info li,.swagger-ui .info p,.swagger-ui .info table{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .info h1,.swagger-ui .info h2,.swagger-ui .info h3,.swagger-ui .info h4,.swagger-ui .info h5{color:#3b4151;font-family:sans-serif}.swagger-ui .info a{color:#4990e2;font-family:sans-serif;font-size:14px;transition:all .4s}.swagger-ui .info a:hover{color:#1f69c0}.swagger-ui .info>div{margin:0 0 5px}.swagger-ui .info .base-url{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300!important;font-weight:600;margin:0}.swagger-ui .info .title{color:#3b4151;font-family:sans-serif;font-size:36px;margin:0}.swagger-ui .info .title small{background:#7d8492;border-radius:57px;display:inline-block;font-size:10px;margin:0 0 0 5px;padding:2px 4px;position:relative;top:-5px;vertical-align:super}.swagger-ui .info .title small.version-stamp{background-color:#89bf04}.swagger-ui .info .title small pre{color:#fff;font-family:sans-serif;margin:0;padding:0}.swagger-ui .auth-btn-wrapper{display:flex;justify-content:center;padding:10px 0}.swagger-ui .auth-btn-wrapper .btn-done{margin-right:1em}.swagger-ui .auth-wrapper{display:flex;flex:1;justify-content:flex-end}.swagger-ui .auth-wrapper .authorize{margin-right:10px;padding-right:20px}.swagger-ui .auth-container{border-bottom:1px solid #ebebeb;margin:0 0 10px;padding:10px 20px}.swagger-ui .auth-container:last-of-type{border:0;margin:0;padding:10px 20px}.swagger-ui .auth-container h4{margin:5px 0 15px!important}.swagger-ui .auth-container .wrapper{margin:0;padding:0}.swagger-ui .auth-container input[type=password],.swagger-ui .auth-container input[type=text]{min-width:230px}.swagger-ui .auth-container .errors{background-color:#fee;border-radius:4px;color:red;color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;margin:1em;padding:10px}.swagger-ui .auth-container .errors b{margin-right:1em;text-transform:capitalize}.swagger-ui .scopes h2{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .scopes h2 a{color:#4990e2;cursor:pointer;font-size:12px;padding-left:10px;text-decoration:underline}.swagger-ui .scope-def{padding:0 0 20px}.swagger-ui .errors-wrapper{-webkit-animation:scaleUp .5s;animation:scaleUp .5s;background:rgba(249,62,62,.1);border:2px solid #f93e3e;border-radius:4px;margin:20px;padding:10px 20px}.swagger-ui .errors-wrapper .error-wrapper{margin:0 0 10px}.swagger-ui .errors-wrapper .errors h4{color:#3b4151;font-family:monospace;font-size:14px;font-weight:600;margin:0}.swagger-ui .errors-wrapper .errors small{color:#606060}.swagger-ui .errors-wrapper .errors .message{white-space:pre-line}.swagger-ui .errors-wrapper .errors .message.thrown{max-width:100%}.swagger-ui .errors-wrapper .errors .error-line{cursor:pointer;text-decoration:underline}.swagger-ui .errors-wrapper hgroup{align-items:center;display:flex}.swagger-ui .errors-wrapper hgroup h4{color:#3b4151;flex:1;font-family:sans-serif;font-size:20px;margin:0}@-webkit-keyframes scaleUp{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes scaleUp{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}.swagger-ui .Resizer.vertical.disabled{display:none}.swagger-ui .markdown p,.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown p,.swagger-ui .renderedMarkdown pre{margin:1em auto;word-break:break-all;word-break:break-word}.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown pre{background:none;color:#000;font-weight:400;padding:0;white-space:pre-wrap}.swagger-ui .markdown code,.swagger-ui .renderedMarkdown code{background:rgba(0,0,0,.05);border-radius:4px;color:#9012fe;font-family:monospace;font-size:14px;font-weight:600;padding:5px 7px}.swagger-ui .markdown pre>code,.swagger-ui .renderedMarkdown pre>code{display:block} - -/*# sourceMappingURL=swagger-ui.css.map*/ \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-swagger-keycloak/src/main/resources/application.yml b/spring-boot-modules/spring-boot-swagger-keycloak/src/main/resources/application.yml index 5d3c8b3af5..7d1618b4e7 100644 --- a/spring-boot-modules/spring-boot-swagger-keycloak/src/main/resources/application.yml +++ b/spring-boot-modules/spring-boot-swagger-keycloak/src/main/resources/application.yml @@ -1,8 +1,19 @@ +server: + port: 8081 + keycloak: - auth-server-url: https://api.example.com/auth # Keycloak server url - realm: todos-service-realm # Keycloak Realm - resource: todos-service-clients # Keycloak Client - principal-attribute: preferred_username - ssl-required: external - credentials: - secret: 00000000-0000-0000-0000-000000000000 + auth-server-url: http://localhost:8080 # Keycloak server url + realm: SpringBootKeycloak # Keycloak Realm + +spring: + security: + oauth2: + resourceserver: + jwt.issuer-uri: http://localhost:8080/realms/SpringBootKeycloak + +springdoc: + swagger-ui: + oauth: + client-id: login-app + + From 87e4bc434fb4447cfad8eb0b35be9d7e63ad6141 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Wed, 3 May 2023 15:06:25 +0530 Subject: [PATCH 061/141] JAVA-16612: Mock Final Classes and Methods with Mockito article; MockMaker improvement (#13890) --- testing-modules/mockito-simple/pom.xml | 2 +- .../com/baeldung/mockito/MockFinalsUnitTest.java | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/testing-modules/mockito-simple/pom.xml b/testing-modules/mockito-simple/pom.xml index 3bfca2db2a..29c7966a08 100644 --- a/testing-modules/mockito-simple/pom.xml +++ b/testing-modules/mockito-simple/pom.xml @@ -57,7 +57,7 @@ 5.3.20 - 4.6.1 + 4.8.0 \ No newline at end of file diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockFinalsUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockFinalsUnitTest.java index a4b2bd03b4..8abd51bb85 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockFinalsUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockFinalsUnitTest.java @@ -3,8 +3,10 @@ package com.baeldung.mockito; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.mockito.Mockito.withSettings; import org.junit.jupiter.api.Test; +import org.mockito.MockMakers; class MockFinalsUnitTest { @@ -29,4 +31,14 @@ class MockFinalsUnitTest { assertThat(mock.size()).isNotEqualTo(finalList.size()); } + + @Test + public void whenMockFinalMethodMockWorks_withInlineMockMaker() { + MyList myList = new MyList(); + + MyList mock = mock(MyList.class, withSettings().mockMaker(MockMakers.INLINE)); + when(mock.finalMethod()).thenReturn(1); + + assertThat(mock.finalMethod()).isNotEqualTo(myList.finalMethod()); + } } From 078826eef55009ef7598a74cdb52e0bf9489d931 Mon Sep 17 00:00:00 2001 From: Daniel Strmecki Date: Wed, 3 May 2023 22:00:47 +0200 Subject: [PATCH 062/141] BAEL-6254: Scoped values (#13756) --- core-java-modules/core-java-20/README.md | 2 + core-java-modules/core-java-20/pom.xml | 65 +++++++++++++++++++ .../scopedvalues/classic/Controller.java | 33 ++++++++++ .../scopedvalues/classic/Repository.java | 16 +++++ .../baeldung/scopedvalues/classic/Server.java | 42 ++++++++++++ .../scopedvalues/classic/Service.java | 18 +++++ .../com/baeldung/scopedvalues/data/Data.java | 3 + .../com/baeldung/scopedvalues/data/User.java | 3 + .../scopedvalues/scoped/Controller.java | 37 +++++++++++ .../scopedvalues/scoped/Repository.java | 17 +++++ .../baeldung/scopedvalues/scoped/Server.java | 41 ++++++++++++ .../baeldung/scopedvalues/scoped/Service.java | 23 +++++++ .../scoped/inheriting/Controller.java | 44 +++++++++++++ .../scoped/inheriting/ExternalService.java | 9 +++ .../scoped/inheriting/InternalService.java | 17 +++++ .../scoped/inheriting/Repository.java | 17 +++++ .../scoped/inheriting/Server.java | 41 ++++++++++++ .../scopedvalues/classic/ServerUnitTest.java | 52 +++++++++++++++ .../scopedvalues/scoped/ServerUnitTest.java | 52 +++++++++++++++ .../scoped/inheriting/ServerUnitTest.java | 52 +++++++++++++++ 20 files changed, 584 insertions(+) create mode 100644 core-java-modules/core-java-20/README.md create mode 100644 core-java-modules/core-java-20/pom.xml create mode 100644 core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/classic/Controller.java create mode 100644 core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/classic/Repository.java create mode 100644 core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/classic/Server.java create mode 100644 core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/classic/Service.java create mode 100644 core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/data/Data.java create mode 100644 core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/data/User.java create mode 100644 core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/Controller.java create mode 100644 core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/Repository.java create mode 100644 core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/Server.java create mode 100644 core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/Service.java create mode 100644 core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/inheriting/Controller.java create mode 100644 core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/inheriting/ExternalService.java create mode 100644 core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/inheriting/InternalService.java create mode 100644 core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/inheriting/Repository.java create mode 100644 core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/inheriting/Server.java create mode 100644 core-java-modules/core-java-20/src/test/java/com/baeldung/scopedvalues/classic/ServerUnitTest.java create mode 100644 core-java-modules/core-java-20/src/test/java/com/baeldung/scopedvalues/scoped/ServerUnitTest.java create mode 100644 core-java-modules/core-java-20/src/test/java/com/baeldung/scopedvalues/scoped/inheriting/ServerUnitTest.java diff --git a/core-java-modules/core-java-20/README.md b/core-java-modules/core-java-20/README.md new file mode 100644 index 0000000000..7e20469e44 --- /dev/null +++ b/core-java-modules/core-java-20/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- TBD \ No newline at end of file diff --git a/core-java-modules/core-java-20/pom.xml b/core-java-modules/core-java-20/pom.xml new file mode 100644 index 0000000000..9562a41b1c --- /dev/null +++ b/core-java-modules/core-java-20/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + core-java-20 + + + 20 + 20 + UTF-8 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 20 + 20 + + --enable-preview + --add-modules=jdk.incubator.concurrent + + + + + org.apache.maven.plugins + maven-surefire-plugin + + --enable-preview --add-modules=jdk.incubator.concurrent + + + + + + + + jakarta.servlet + jakarta.servlet-api + 6.0.0 + provided + + + org.assertj + assertj-core + 3.24.2 + test + + + org.mockito + mockito-junit-jupiter + 5.2.0 + test + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/classic/Controller.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/classic/Controller.java new file mode 100644 index 0000000000..92edc57e48 --- /dev/null +++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/classic/Controller.java @@ -0,0 +1,33 @@ +package com.baeldung.scopedvalues.classic; + +import com.baeldung.scopedvalues.data.Data; +import com.baeldung.scopedvalues.data.User; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Optional; + +public class Controller { + + private final Service service = new Service(); + + public void processRequest(HttpServletRequest request, HttpServletResponse response, User loggedInUser) { + Optional data = service.getData(request, loggedInUser); + if (data.isPresent()) { + try { + PrintWriter out = response.getWriter(); + response.setContentType("application/json"); + out.print(data.get()); + out.flush(); + response.setStatus(200); + } catch (IOException e) { + response.setStatus(500); + } + } else { + response.setStatus(400); + } + } + +} diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/classic/Repository.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/classic/Repository.java new file mode 100644 index 0000000000..3085b3be58 --- /dev/null +++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/classic/Repository.java @@ -0,0 +1,16 @@ +package com.baeldung.scopedvalues.classic; + +import com.baeldung.scopedvalues.data.Data; +import com.baeldung.scopedvalues.data.User; + +import java.util.Optional; + +public class Repository { + + public Optional getData(String id, User user) { + return user.isAdmin() + ? Optional.of(new Data(id, "Title 1", "Description 1")) + : Optional.empty(); + } + +} diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/classic/Server.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/classic/Server.java new file mode 100644 index 0000000000..71afa9e675 --- /dev/null +++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/classic/Server.java @@ -0,0 +1,42 @@ +package com.baeldung.scopedvalues.classic; + +import com.baeldung.scopedvalues.data.User; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.util.List; +import java.util.Optional; +import java.util.concurrent.*; + +public class Server { + + private static final List AUTHENTICATED_USERS = List.of( + new User("1", "admin", "123456", true), + new User("2", "user", "123456", false) + ); + private final Controller controller = new Controller(); + private final ExecutorService executor = Executors.newFixedThreadPool(5); + + public void serve(HttpServletRequest request, HttpServletResponse response) throws InterruptedException, ExecutionException { + Optional user = authenticateUser(request); + if (user.isPresent()) { + Future future = executor.submit(() -> + controller.processRequest(request, response, user.get())); + future.get(); + } else { + response.setStatus(401); + } + } + + private Optional authenticateUser(HttpServletRequest request) { + return AUTHENTICATED_USERS.stream() + .filter(user -> checkUserPassword(user, request)) + .findFirst(); + } + + private boolean checkUserPassword(User user, HttpServletRequest request) { + return user.name().equals(request.getParameter("user_name")) + && user.password().equals(request.getParameter("user_pw")); + } + +} diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/classic/Service.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/classic/Service.java new file mode 100644 index 0000000000..011f793001 --- /dev/null +++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/classic/Service.java @@ -0,0 +1,18 @@ +package com.baeldung.scopedvalues.classic; + +import com.baeldung.scopedvalues.data.Data; +import com.baeldung.scopedvalues.data.User; +import jakarta.servlet.http.HttpServletRequest; + +import java.util.Optional; + +public class Service { + + private final Repository repository = new Repository(); + + public Optional getData(HttpServletRequest request, User loggedInUser) { + String id = request.getParameter("data_id"); + return repository.getData(id, loggedInUser); + } + +} diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/data/Data.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/data/Data.java new file mode 100644 index 0000000000..70be41c1ac --- /dev/null +++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/data/Data.java @@ -0,0 +1,3 @@ +package com.baeldung.scopedvalues.data; + +public record Data(String id, String title, String description) {} diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/data/User.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/data/User.java new file mode 100644 index 0000000000..22e0a4243f --- /dev/null +++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/data/User.java @@ -0,0 +1,3 @@ +package com.baeldung.scopedvalues.data; + +public record User(String id, String name, String password, boolean isAdmin) {} diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/Controller.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/Controller.java new file mode 100644 index 0000000000..239ee88f19 --- /dev/null +++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/Controller.java @@ -0,0 +1,37 @@ +package com.baeldung.scopedvalues.scoped; + +import com.baeldung.scopedvalues.data.Data; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jdk.incubator.concurrent.ScopedValue; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Optional; + +public class Controller { + + private final Service internalService = new Service(); + + public void processRequest(HttpServletRequest request, HttpServletResponse response) { + Optional data = internalService.getData(request); + + ScopedValue.where(Server.LOGGED_IN_USER, null) + .run(internalService::extractData); + + if (data.isPresent()) { + try { + PrintWriter out = response.getWriter(); + response.setContentType("application/json"); + out.print(data.get()); + out.flush(); + response.setStatus(200); + } catch (IOException e) { + response.setStatus(500); + } + } else { + response.setStatus(400); + } + } + +} diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/Repository.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/Repository.java new file mode 100644 index 0000000000..a40191eb3c --- /dev/null +++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/Repository.java @@ -0,0 +1,17 @@ +package com.baeldung.scopedvalues.scoped; + +import com.baeldung.scopedvalues.data.Data; +import com.baeldung.scopedvalues.data.User; + +import java.util.Optional; + +public class Repository { + + public Optional getData(String id) { + User loggedInUser = Server.LOGGED_IN_USER.get(); + return loggedInUser.isAdmin() + ? Optional.of(new Data(id, "Title 1", "Description 1")) + : Optional.empty(); + } + +} diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/Server.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/Server.java new file mode 100644 index 0000000000..559e4efd56 --- /dev/null +++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/Server.java @@ -0,0 +1,41 @@ +package com.baeldung.scopedvalues.scoped; + +import com.baeldung.scopedvalues.data.User; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jdk.incubator.concurrent.ScopedValue; + +import java.util.List; +import java.util.Optional; + +public class Server { + + private static final List AUTHENTICATED_USERS = List.of( + new User("1", "admin", "123456", true), + new User("2", "user", "123456", false) + ); + public final static ScopedValue LOGGED_IN_USER = ScopedValue.newInstance(); + private final Controller controller = new Controller(); + + public void serve(HttpServletRequest request, HttpServletResponse response) { + Optional user = authenticateUser(request); + if (user.isPresent()) { + ScopedValue.where(LOGGED_IN_USER, user.get()) + .run(() -> controller.processRequest(request, response)); + } else { + response.setStatus(401); + } + } + + private Optional authenticateUser(HttpServletRequest request) { + return AUTHENTICATED_USERS.stream() + .filter(user -> checkUserPassword(user, request)) + .findFirst(); + } + + private boolean checkUserPassword(User user, HttpServletRequest request) { + return user.name().equals(request.getParameter("user_name")) + && user.password().equals(request.getParameter("user_pw")); + } + +} diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/Service.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/Service.java new file mode 100644 index 0000000000..e35d98cae5 --- /dev/null +++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/Service.java @@ -0,0 +1,23 @@ +package com.baeldung.scopedvalues.scoped; + +import com.baeldung.scopedvalues.data.Data; +import com.baeldung.scopedvalues.data.User; +import jakarta.servlet.http.HttpServletRequest; + +import java.util.Optional; + +public class Service { + + private final Repository repository = new Repository(); + + public Optional getData(HttpServletRequest request) { + String id = request.getParameter("data_id"); + return repository.getData(id); + } + + public void extractData() { + User loggedInUser = Server.LOGGED_IN_USER.get(); + assert loggedInUser == null; + } + +} diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/inheriting/Controller.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/inheriting/Controller.java new file mode 100644 index 0000000000..e4742c0998 --- /dev/null +++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/inheriting/Controller.java @@ -0,0 +1,44 @@ +package com.baeldung.scopedvalues.scoped.inheriting; + +import com.baeldung.scopedvalues.data.Data; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jdk.incubator.concurrent.StructuredTaskScope; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Optional; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +public class Controller { + + private final InternalService internalService = new InternalService(); + private final ExternalService externalService = new ExternalService(); + + public void processRequest(HttpServletRequest request, HttpServletResponse response) { + try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { + Future> internalData = scope.fork(() -> internalService.getData(request)); + Future externalData = scope.fork(externalService::getData); + try { + scope.join(); + scope.throwIfFailed(); + + Optional data = internalData.resultNow(); + if (data.isPresent()) { + PrintWriter out = response.getWriter(); + response.setContentType("application/json"); + out.println(data.get()); + out.print(externalData.resultNow()); + out.flush(); + response.setStatus(200); + } else { + response.setStatus(400); + } + } catch (InterruptedException | ExecutionException | IOException e) { + response.setStatus(500); + } + } + } + +} diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/inheriting/ExternalService.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/inheriting/ExternalService.java new file mode 100644 index 0000000000..88fa4dfb74 --- /dev/null +++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/inheriting/ExternalService.java @@ -0,0 +1,9 @@ +package com.baeldung.scopedvalues.scoped.inheriting; + +public class ExternalService { + + public String getData() { + return "External data"; + } + +} diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/inheriting/InternalService.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/inheriting/InternalService.java new file mode 100644 index 0000000000..ace46b254c --- /dev/null +++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/inheriting/InternalService.java @@ -0,0 +1,17 @@ +package com.baeldung.scopedvalues.scoped.inheriting; + +import com.baeldung.scopedvalues.data.Data; +import jakarta.servlet.http.HttpServletRequest; + +import java.util.Optional; + +public class InternalService { + + private final Repository repository = new Repository(); + + public Optional getData(HttpServletRequest request) { + String id = request.getParameter("data_id"); + return repository.getData(id); + } + +} diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/inheriting/Repository.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/inheriting/Repository.java new file mode 100644 index 0000000000..22d18b2fac --- /dev/null +++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/inheriting/Repository.java @@ -0,0 +1,17 @@ +package com.baeldung.scopedvalues.scoped.inheriting; + +import com.baeldung.scopedvalues.data.Data; +import com.baeldung.scopedvalues.data.User; + +import java.util.Optional; + +public class Repository { + + public Optional getData(String id) { + User loggedInUser = Server.LOGGED_IN_USER.get(); + return loggedInUser.isAdmin() + ? Optional.of(new Data(id, "Title 1", "Description 1")) + : Optional.empty(); + } + +} diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/inheriting/Server.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/inheriting/Server.java new file mode 100644 index 0000000000..5f04a1eedd --- /dev/null +++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/scopedvalues/scoped/inheriting/Server.java @@ -0,0 +1,41 @@ +package com.baeldung.scopedvalues.scoped.inheriting; + +import com.baeldung.scopedvalues.data.User; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jdk.incubator.concurrent.ScopedValue; + +import java.util.List; +import java.util.Optional; + +public class Server { + + private static final List AUTHENTICATED_USERS = List.of( + new User("1", "admin", "123456", true), + new User("2", "user", "123456", false) + ); + public final static ScopedValue LOGGED_IN_USER = ScopedValue.newInstance(); + private final Controller controller = new Controller(); + + public void serve(HttpServletRequest request, HttpServletResponse response) { + Optional user = authenticateUser(request); + if (user.isPresent()) { + ScopedValue.where(LOGGED_IN_USER, user.get()) + .run(() -> controller.processRequest(request, response)); + } else { + response.setStatus(401); + } + } + + private Optional authenticateUser(HttpServletRequest request) { + return AUTHENTICATED_USERS.stream() + .filter(user -> checkUserPassword(user, request)) + .findFirst(); + } + + private boolean checkUserPassword(User user, HttpServletRequest request) { + return user.name().equals(request.getParameter("user_name")) + && user.password().equals(request.getParameter("user_pw")); + } + +} diff --git a/core-java-modules/core-java-20/src/test/java/com/baeldung/scopedvalues/classic/ServerUnitTest.java b/core-java-modules/core-java-20/src/test/java/com/baeldung/scopedvalues/classic/ServerUnitTest.java new file mode 100644 index 0000000000..e0b9366c22 --- /dev/null +++ b/core-java-modules/core-java-20/src/test/java/com/baeldung/scopedvalues/classic/ServerUnitTest.java @@ -0,0 +1,52 @@ +package com.baeldung.scopedvalues.classic; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.concurrent.ExecutionException; + +import static org.mockito.Mockito.*; +import static org.assertj.core.api.Assertions.*; +@ExtendWith(MockitoExtension.class) +public class ServerUnitTest { + + @Mock + private HttpServletRequest request; + + @Mock + private HttpServletResponse response; + + private final StringWriter writer = new StringWriter(); + + private final Server server = new Server(); + + @Test + void givenMockedRequestWithAdminCredentials_whenServeMethodIsCalled_thenDataIsReturned() throws InterruptedException, IOException, ExecutionException { + when(request.getParameter("user_name")).thenReturn("admin"); + when(request.getParameter("user_pw")).thenReturn("123456"); + when(request.getParameter("data_id")).thenReturn("1"); + when(response.getWriter()).thenReturn(new PrintWriter(writer)); + + server.serve(request, response); + + assertThat(writer.toString()).isEqualTo("Data[id=1, title=Title 1, description=Description 1]"); + } + + @Test + void givenMockedRequestWithUserCredentials_whenServeMethodIsCalled_thenNoDataIsReturned() throws InterruptedException, ExecutionException { + when(request.getParameter("user_name")).thenReturn("user"); + when(request.getParameter("user_pw")).thenReturn("123456"); + + server.serve(request, response); + + assertThat(writer.toString()).isEqualTo(""); + } + +} diff --git a/core-java-modules/core-java-20/src/test/java/com/baeldung/scopedvalues/scoped/ServerUnitTest.java b/core-java-modules/core-java-20/src/test/java/com/baeldung/scopedvalues/scoped/ServerUnitTest.java new file mode 100644 index 0000000000..034e6683e3 --- /dev/null +++ b/core-java-modules/core-java-20/src/test/java/com/baeldung/scopedvalues/scoped/ServerUnitTest.java @@ -0,0 +1,52 @@ +package com.baeldung.scopedvalues.scoped; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +public class ServerUnitTest { + + @Mock + private HttpServletRequest request; + + @Mock + private HttpServletResponse response; + + private final StringWriter writer = new StringWriter(); + + private final Server server = new Server(); + + @Test + void givenMockedRequestWithAdminCredentials_whenServeMethodIsCalled_thenDataIsReturned() throws IOException { + when(request.getParameter("user_name")).thenReturn("admin"); + when(request.getParameter("user_pw")).thenReturn("123456"); + when(request.getParameter("data_id")).thenReturn("1"); + when(response.getWriter()).thenReturn(new PrintWriter(writer)); + + server.serve(request, response); + + assertThat(writer.toString()).isEqualTo("Data[id=1, title=Title 1, description=Description 1]"); + } + + @Test + void givenMockedRequestWithUserCredentials_whenServeMethodIsCalled_thenNoDataIsReturned() throws IOException { + when(request.getParameter("user_name")).thenReturn("user"); + when(request.getParameter("user_pw")).thenReturn("123456"); + + server.serve(request, response); + + assertThat(writer.toString()).isEqualTo(""); + } + +} diff --git a/core-java-modules/core-java-20/src/test/java/com/baeldung/scopedvalues/scoped/inheriting/ServerUnitTest.java b/core-java-modules/core-java-20/src/test/java/com/baeldung/scopedvalues/scoped/inheriting/ServerUnitTest.java new file mode 100644 index 0000000000..230b017c18 --- /dev/null +++ b/core-java-modules/core-java-20/src/test/java/com/baeldung/scopedvalues/scoped/inheriting/ServerUnitTest.java @@ -0,0 +1,52 @@ +package com.baeldung.scopedvalues.scoped.inheriting; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +public class ServerUnitTest { + + @Mock + private HttpServletRequest request; + + @Mock + private HttpServletResponse response; + + private final StringWriter writer = new StringWriter(); + + private final Server server = new Server(); + + @Test + void givenMockedRequestWithAdminCredentials_whenServeMethodIsCalled_thenDataIsReturned() throws IOException { + when(request.getParameter("user_name")).thenReturn("admin"); + when(request.getParameter("user_pw")).thenReturn("123456"); + when(request.getParameter("data_id")).thenReturn("1"); + when(response.getWriter()).thenReturn(new PrintWriter(writer)); + + server.serve(request, response); + + assertThat(writer.toString()).isEqualTo("Data[id=1, title=Title 1, description=Description 1]\nExternal data"); + } + + @Test + void givenMockedRequestWithUserCredentials_whenServeMethodIsCalled_thenNoDataIsReturned() throws IOException { + when(request.getParameter("user_name")).thenReturn("user"); + when(request.getParameter("user_pw")).thenReturn("123456"); + + server.serve(request, response); + + assertThat(writer.toString()).isEqualTo(""); + } + +} From 23ec3d24d295563cb5095281eb52de1f5a768bd8 Mon Sep 17 00:00:00 2001 From: Arya <108480101+Dazzle-10@users.noreply.github.com> Date: Thu, 4 May 2023 00:52:17 +0300 Subject: [PATCH 063/141] Added the code for "The difference between BufferedReader and FileReader". (#13942) --- .../BufferedReaderUnitTest.java | 31 +++++++++++++++++++ .../FileReaderUnitTest.java | 30 ++++++++++++++++++ .../src/test/resources/sampleText1.txt | 3 ++ .../src/test/resources/sampleText2.txt | 1 + 4 files changed, 65 insertions(+) create mode 100644 core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/BufferedReaderUnitTest.java create mode 100644 core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/FileReaderUnitTest.java create mode 100644 core-java-modules/core-java-io-apis-2/src/test/resources/sampleText1.txt create mode 100644 core-java-modules/core-java-io-apis-2/src/test/resources/sampleText2.txt diff --git a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/BufferedReaderUnitTest.java b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/BufferedReaderUnitTest.java new file mode 100644 index 0000000000..a2aeca56ad --- /dev/null +++ b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/BufferedReaderUnitTest.java @@ -0,0 +1,31 @@ +package com.baeldung.bufferedreadervsfilereader; + +import org.junit.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; + +public class BufferedReaderUnitTest { + + @Test + public void whenReadingAFile_thenReadsLineByLine() { + StringBuilder result = new StringBuilder(); + + try (BufferedReader br = new BufferedReader(new FileReader("src/test/resources/sampleText1.txt"))) { + String line; + + while((line = br.readLine()) != null) { + result.append(line); + result.append('\n'); + } + } catch (IOException e) { + e.printStackTrace(); + } + + assertEquals("first line\nsecond line\nthird line\n", result.toString()); + } + +} diff --git a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/FileReaderUnitTest.java b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/FileReaderUnitTest.java new file mode 100644 index 0000000000..f046f313d4 --- /dev/null +++ b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/FileReaderUnitTest.java @@ -0,0 +1,30 @@ +package com.baeldung.bufferedreadervsfilereader; + +import org.junit.jupiter.api.Test; + +import java.io.FileReader; +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class FileReaderUnitTest { + + @Test + public void whenReadingAFile_thenReadsCharByChar() { + StringBuilder result = new StringBuilder(); + + try (FileReader fr = new FileReader("src/test/resources/sampleText2.txt")) { + int i = fr.read(); + + while(i != -1) { + result.append((char)i); + + i = fr.read(); + } + } catch (IOException e) { + e.printStackTrace(); + } + + assertEquals("qwerty", result.toString()); + } +} diff --git a/core-java-modules/core-java-io-apis-2/src/test/resources/sampleText1.txt b/core-java-modules/core-java-io-apis-2/src/test/resources/sampleText1.txt new file mode 100644 index 0000000000..20aeba2bad --- /dev/null +++ b/core-java-modules/core-java-io-apis-2/src/test/resources/sampleText1.txt @@ -0,0 +1,3 @@ +first line +second line +third line diff --git a/core-java-modules/core-java-io-apis-2/src/test/resources/sampleText2.txt b/core-java-modules/core-java-io-apis-2/src/test/resources/sampleText2.txt new file mode 100644 index 0000000000..f2289097d4 --- /dev/null +++ b/core-java-modules/core-java-io-apis-2/src/test/resources/sampleText2.txt @@ -0,0 +1 @@ +qwerty \ No newline at end of file From d313b76fc71a9eb2ad25bc1d2fbf0a80167f9c2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ana=20Peterli=C4=87?= Date: Thu, 4 May 2023 03:55:07 +0200 Subject: [PATCH 064/141] BAEL-5814 - Is CompletableFuture Non-blocking (#13917) * BAEL-5814 - Is CompletableFuture Non-blocking * Fix the formatting --- .../completablefuture/NonBlockingExample.java | 17 ++++++++++ .../completablefuture/BlockingUnitTest.java | 31 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/NonBlockingExample.java create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/BlockingUnitTest.java diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/NonBlockingExample.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/NonBlockingExample.java new file mode 100644 index 0000000000..b97f7d0dee --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/NonBlockingExample.java @@ -0,0 +1,17 @@ +package com.baeldung.concurrent.completablefuture; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.CompletableFuture; + +public class NonBlockingExample { + + private static final Logger logger = LoggerFactory.getLogger(NonBlockingExample.class); + + public static void main(String[] args) { + CompletableFuture.supplyAsync(() -> "Baeldung") + .thenApply(String::length) + .thenAccept(s -> logger.info(String.valueOf(s))); + } +} diff --git a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/BlockingUnitTest.java b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/BlockingUnitTest.java new file mode 100644 index 0000000000..75d8d73c2f --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/BlockingUnitTest.java @@ -0,0 +1,31 @@ +package com.baeldung.concurrent.completablefuture; + +import org.junit.jupiter.api.Test; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class BlockingUnitTest { + + @Test + void givenCompletableFuture_whenGet_thenReturnResult() + throws ExecutionException, InterruptedException { + CompletableFuture completableFuture = CompletableFuture + .supplyAsync(() -> "Baeldung") + .thenApply(String::toUpperCase); + + assertEquals("BAELDUNG", completableFuture.get()); + } + + @Test + void givenCompletableFuture_whenJoin_thenReturnResult() { + CompletableFuture completableFuture = CompletableFuture + .supplyAsync(() -> "Blocking") + .thenApply(s -> s + " Operation") + .thenApply(String::toLowerCase); + + assertEquals("blocking operation", completableFuture.join()); + } +} From 8d0158aa5bd8501319d954b137f01ec67c5baa5d Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Thu, 4 May 2023 08:09:02 +0200 Subject: [PATCH 065/141] BAEL-6326: Spring Boot H2 JdbcSQLSyntaxErrorException expected identifier (#13843) --- .../h2/exceptions/SpringBootH2Exceptions.java | 15 ++++++++ .../baeldung/h2/exceptions/models/User.java | 38 +++++++++++++++++++ .../h2/exceptions/repos/UserRepository.java | 11 ++++++ .../src/main/resources/app-h2.properties | 1 + .../src/main/resources/user-data.sql | 8 ++++ ...SpringBootH2ExceptionsIntegrationTest.java | 30 +++++++++++++++ 6 files changed, 103 insertions(+) create mode 100644 persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2/exceptions/SpringBootH2Exceptions.java create mode 100644 persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2/exceptions/models/User.java create mode 100644 persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2/exceptions/repos/UserRepository.java create mode 100644 persistence-modules/spring-boot-persistence-h2/src/main/resources/app-h2.properties create mode 100644 persistence-modules/spring-boot-persistence-h2/src/main/resources/user-data.sql create mode 100644 persistence-modules/spring-boot-persistence-h2/src/test/java/com/baeldung/h2/exceptions/SpringBootH2ExceptionsIntegrationTest.java diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2/exceptions/SpringBootH2Exceptions.java b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2/exceptions/SpringBootH2Exceptions.java new file mode 100644 index 0000000000..c7684423a2 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2/exceptions/SpringBootH2Exceptions.java @@ -0,0 +1,15 @@ +package com.baeldung.h2.exceptions; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.PropertySource; + +@SpringBootApplication +@PropertySource("classpath:app-h2.properties") +public class SpringBootH2Exceptions { + + public static void main(String... args) { + SpringApplication.run(SpringBootH2Exceptions.class, args); + } + +} diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2/exceptions/models/User.java b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2/exceptions/models/User.java new file mode 100644 index 0000000000..e54e725fd0 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2/exceptions/models/User.java @@ -0,0 +1,38 @@ +package com.baeldung.h2.exceptions.models; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class User { + + @Id + private int id; + private String login; + private String password; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getLogin() { + return login; + } + + public void setLogin(String login) { + this.login = login; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + +} diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2/exceptions/repos/UserRepository.java b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2/exceptions/repos/UserRepository.java new file mode 100644 index 0000000000..d014fb16c6 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2/exceptions/repos/UserRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.h2.exceptions.repos; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.baeldung.h2.exceptions.models.User; + +@Repository +public interface UserRepository extends JpaRepository { + +} diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/resources/app-h2.properties b/persistence-modules/spring-boot-persistence-h2/src/main/resources/app-h2.properties new file mode 100644 index 0000000000..bb88e7fef4 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-h2/src/main/resources/app-h2.properties @@ -0,0 +1 @@ +spring.sql.init.data-locations=user-data.sql diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/resources/user-data.sql b/persistence-modules/spring-boot-persistence-h2/src/main/resources/user-data.sql new file mode 100644 index 0000000000..cea758c74e --- /dev/null +++ b/persistence-modules/spring-boot-persistence-h2/src/main/resources/user-data.sql @@ -0,0 +1,8 @@ +/* These commented lines will cause Spring Boot to fail at startup + * + * INSERT INTO user VALUES (1, 'admin', 'p@ssw@rd'); + * INSERT INTO user VALUES (2, 'user', 'userpasswd'); + * +*/ +INSERT INTO "user" VALUES (1, 'admin', 'p@ssw@rd'); +INSERT INTO "user" VALUES (2, 'user', 'userpasswd'); \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-h2/src/test/java/com/baeldung/h2/exceptions/SpringBootH2ExceptionsIntegrationTest.java b/persistence-modules/spring-boot-persistence-h2/src/test/java/com/baeldung/h2/exceptions/SpringBootH2ExceptionsIntegrationTest.java new file mode 100644 index 0000000000..94cf08fb76 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-h2/src/test/java/com/baeldung/h2/exceptions/SpringBootH2ExceptionsIntegrationTest.java @@ -0,0 +1,30 @@ +package com.baeldung.h2.exceptions; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.h2.exceptions.models.User; +import com.baeldung.h2.exceptions.repos.UserRepository; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = SpringBootH2Exceptions.class) +public class SpringBootH2ExceptionsIntegrationTest { + + @Autowired + private UserRepository userRepository; + + @Test + public void givenValidInitData_whenCallingFindAll_thenReturnData() { + List users = userRepository.findAll(); + + assertThat(users).hasSize(2); + } + +} From 2e41874a5c9aca865e0cb7cf00fb84b748527833 Mon Sep 17 00:00:00 2001 From: 3hsan <56245694+ehsansasanian@users.noreply.github.com> Date: Fri, 5 May 2023 10:47:57 +0200 Subject: [PATCH 066/141] JAVA-16946: comment spring-jooq module from persistence-modules. (#13951) --- persistence-modules/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 46ac9b50f1..ad757d9073 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -107,7 +107,7 @@ spring-jdbc - spring-jooq + spring-mybatis spring-persistence-simple From 7e404b3dfbe48f7246037b7230247485d264444b Mon Sep 17 00:00:00 2001 From: Kasra Madadipouya Date: Fri, 5 May 2023 11:58:11 +0200 Subject: [PATCH 067/141] JAVA-20555 use Java Base64 instead of deprecated Spring Base64Utils (#13941) --- .../security/oauth2/UaaTokenEndpointClient.java | 4 ++-- .../web/ManualOauthRequestController.java | 6 ++++-- .../authresolver/AuthResolverIntegrationTest.java | 11 ++++++----- .../authresolver/AuthResolverIntegrationTest.java | 11 ++++++----- .../petstore/client/invoker/auth/HttpBasicAuth.java | 5 +++-- .../petstore/client/invoker/auth/HttpBasicAuth.java | 6 +++--- 6 files changed, 24 insertions(+), 19 deletions(-) diff --git a/jhipster-modules/jhipster-uaa/gateway/src/main/java/com/baeldung/jhipster/gateway/security/oauth2/UaaTokenEndpointClient.java b/jhipster-modules/jhipster-uaa/gateway/src/main/java/com/baeldung/jhipster/gateway/security/oauth2/UaaTokenEndpointClient.java index 01c8febdb2..296e8cf67a 100644 --- a/jhipster-modules/jhipster-uaa/gateway/src/main/java/com/baeldung/jhipster/gateway/security/oauth2/UaaTokenEndpointClient.java +++ b/jhipster-modules/jhipster-uaa/gateway/src/main/java/com/baeldung/jhipster/gateway/security/oauth2/UaaTokenEndpointClient.java @@ -5,11 +5,11 @@ import io.github.jhipster.config.JHipsterProperties; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Component; -import org.springframework.util.Base64Utils; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import java.nio.charset.StandardCharsets; +import java.util.Base64; /** * Client talking to UAA's token endpoint to do different OAuth2 grants. @@ -34,7 +34,7 @@ public class UaaTokenEndpointClient extends OAuth2TokenEndpointClientAdapter imp String clientId = getClientId(); String clientSecret = getClientSecret(); String authorization = clientId + ":" + clientSecret; - return "Basic " + Base64Utils.encodeToString(authorization.getBytes(StandardCharsets.UTF_8)); + return "Basic " + Base64.getEncoder().encodeToString(authorization.getBytes(StandardCharsets.UTF_8)); } } diff --git a/spring-reactive-modules/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/web/ManualOauthRequestController.java b/spring-reactive-modules/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/web/ManualOauthRequestController.java index d54d811032..c449a5991e 100644 --- a/spring-reactive-modules/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/web/ManualOauthRequestController.java +++ b/spring-reactive-modules/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/web/ManualOauthRequestController.java @@ -1,12 +1,13 @@ package com.baeldung.webclient.manualrequest.web; +import java.util.Base64; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpHeaders; import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; -import org.springframework.util.Base64Utils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.reactive.function.BodyInserters; @@ -41,7 +42,8 @@ public class ManualOauthRequestController { logger.info("Creating web client..."); Mono resource = client.post() .uri(tokenUri) - .header(HttpHeaders.AUTHORIZATION, "Basic " + Base64Utils.encodeToString((clientId + ":" + clientSecret).getBytes())) + .header(HttpHeaders.AUTHORIZATION, "Basic " + Base64.getEncoder() + .encodeToString((clientId + ":" + clientSecret).getBytes())) .body(BodyInserters.fromFormData(OAuth2ParameterNames.GRANT_TYPE, GrantType.CLIENT_CREDENTIALS.getValue())) .retrieve() .bodyToMono(JsonNode.class) diff --git a/spring-reactive-modules/spring-5-reactive-security/src/test/java/com/baeldung/reactive/authresolver/AuthResolverIntegrationTest.java b/spring-reactive-modules/spring-5-reactive-security/src/test/java/com/baeldung/reactive/authresolver/AuthResolverIntegrationTest.java index 691243b3ea..9e0855d086 100644 --- a/spring-reactive-modules/spring-5-reactive-security/src/test/java/com/baeldung/reactive/authresolver/AuthResolverIntegrationTest.java +++ b/spring-reactive-modules/spring-5-reactive-security/src/test/java/com/baeldung/reactive/authresolver/AuthResolverIntegrationTest.java @@ -1,5 +1,7 @@ package com.baeldung.reactive.authresolver; +import java.util.Base64; + import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runner.RunWith; @@ -8,7 +10,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; -import org.springframework.util.Base64Utils; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = AuthResolverApplication.class) @@ -22,7 +23,7 @@ public class AuthResolverIntegrationTest { testClient .get() .uri("/customer/welcome") - .header("Authorization", "Basic " + Base64Utils.encodeToString("customer1:pass1".getBytes())) + .header("Authorization", "Basic " + Base64.getEncoder().encodeToString("customer1:pass1".getBytes())) .exchange() .expectStatus() .isOk(); @@ -33,7 +34,7 @@ public class AuthResolverIntegrationTest { testClient .get() .uri("/customer/welcome") - .header("Authorization", "Basic " + Base64Utils.encodeToString("employee1:pass1".getBytes())) + .header("Authorization", "Basic " + Base64.getEncoder().encodeToString("employee1:pass1".getBytes())) .exchange() .expectStatus() .isUnauthorized(); @@ -44,7 +45,7 @@ public class AuthResolverIntegrationTest { testClient .get() .uri("/employee/welcome") - .header("Authorization", "Basic " + Base64Utils.encodeToString("employee1:pass1".getBytes())) + .header("Authorization", "Basic " + Base64.getEncoder().encodeToString("employee1:pass1".getBytes())) .exchange() .expectStatus() .isOk(); @@ -55,7 +56,7 @@ public class AuthResolverIntegrationTest { testClient .get() .uri("/employee/welcome") - .header("Authorization", "Basic " + Base64Utils.encodeToString("customer1:pass1".getBytes())) + .header("Authorization", "Basic " + Base64.getEncoder().encodeToString("customer1:pass1".getBytes())) .exchange() .expectStatus() .isUnauthorized(); diff --git a/spring-security-modules/spring-security-core-2/src/test/java/com/baeldung/authresolver/AuthResolverIntegrationTest.java b/spring-security-modules/spring-security-core-2/src/test/java/com/baeldung/authresolver/AuthResolverIntegrationTest.java index c87f8c1a3a..a0bc793a11 100644 --- a/spring-security-modules/spring-security-core-2/src/test/java/com/baeldung/authresolver/AuthResolverIntegrationTest.java +++ b/spring-security-modules/spring-security-core-2/src/test/java/com/baeldung/authresolver/AuthResolverIntegrationTest.java @@ -11,13 +11,14 @@ import org.springframework.security.web.FilterChainProxy; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.util.Base64Utils; import org.springframework.web.context.WebApplicationContext; import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import java.util.Base64; + @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = AuthResolverApplication.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) @@ -44,7 +45,7 @@ public class AuthResolverIntegrationTest { this.mockMvc .perform(get("/customer/welcome") .header( - "Authorization", String.format("Basic %s", Base64Utils.encodeToString("customer1:pass1".getBytes())) + "Authorization", String.format("Basic %s", Base64.getEncoder().encodeToString("customer1:pass1".getBytes())) ) ) .andExpect(status().is2xxSuccessful()); @@ -55,7 +56,7 @@ public class AuthResolverIntegrationTest { this.mockMvc .perform(get("/customer/welcome") .header( - "Authorization", "Basic " + Base64Utils.encodeToString("employee1:pass1".getBytes())) + "Authorization", "Basic " + Base64.getEncoder().encodeToString("employee1:pass1".getBytes())) ) .andExpect(status().isUnauthorized()); } @@ -65,7 +66,7 @@ public class AuthResolverIntegrationTest { this.mockMvc .perform(get("/employee/welcome") .header( - "Authorization", "Basic " + Base64Utils.encodeToString("employee1:pass1".getBytes())) + "Authorization", "Basic " + Base64.getEncoder().encodeToString("employee1:pass1".getBytes())) ) .andExpect(status().is2xxSuccessful()); } @@ -75,7 +76,7 @@ public class AuthResolverIntegrationTest { this.mockMvc .perform(get("/employee/welcome") .header( - "Authorization", "Basic " + Base64Utils.encodeToString("customer1:pass1".getBytes())) + "Authorization", "Basic " + Base64.getEncoder().encodeToString("customer1:pass1".getBytes())) ) .andExpect(status().isUnauthorized()); } diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/HttpBasicAuth.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/HttpBasicAuth.java index 4c1dad6e7c..fea7b0532b 100644 --- a/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/HttpBasicAuth.java +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/HttpBasicAuth.java @@ -1,9 +1,9 @@ package com.baeldung.petstore.client.invoker.auth; import java.nio.charset.StandardCharsets; +import java.util.Base64; import org.springframework.http.HttpHeaders; -import org.springframework.util.Base64Utils; import org.springframework.util.MultiValueMap; @javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2020-03-15T06:14:01.568992-05:00[America/Chicago]") @@ -33,6 +33,7 @@ public class HttpBasicAuth implements Authentication { return; } String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); - headerParams.add(HttpHeaders.AUTHORIZATION, "Basic " + Base64Utils.encodeToString(str.getBytes(StandardCharsets.UTF_8))); + headerParams.add(HttpHeaders.AUTHORIZATION, "Basic " + Base64.getEncoder() + .encodeToString(str.getBytes(StandardCharsets.UTF_8))); } } diff --git a/spring-swagger-codegen/spring-swagger-codegen-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/HttpBasicAuth.java b/spring-swagger-codegen/spring-swagger-codegen-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/HttpBasicAuth.java index 16c88a4bc6..23c1dbc4c2 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/HttpBasicAuth.java +++ b/spring-swagger-codegen/spring-swagger-codegen-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/HttpBasicAuth.java @@ -1,10 +1,9 @@ package com.baeldung.petstore.client.invoker.auth; -import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; +import java.util.Base64; import org.springframework.http.HttpHeaders; -import org.springframework.util.Base64Utils; import org.springframework.util.MultiValueMap; @javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaClientCodegen", date = "2017-08-29T12:04:37.072+02:00") @@ -34,6 +33,7 @@ public class HttpBasicAuth implements Authentication { return; } String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); - headerParams.add(HttpHeaders.AUTHORIZATION, "Basic " + Base64Utils.encodeToString(str.getBytes(StandardCharsets.UTF_8))); + headerParams.add(HttpHeaders.AUTHORIZATION, "Basic " + Base64.getEncoder() + .encodeToString(str.getBytes(StandardCharsets.UTF_8))); } } From f37f777d9373e3f81ded165bbf5d8767282d22da Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 5 May 2023 21:41:29 +0800 Subject: [PATCH 068/141] Update README.md [skip ci] --- core-java-modules/core-java-perf/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-perf/README.md b/core-java-modules/core-java-perf/README.md index 2f0331f281..c400f1d196 100644 --- a/core-java-modules/core-java-perf/README.md +++ b/core-java-modules/core-java-perf/README.md @@ -14,3 +14,4 @@ This module contains articles about performance of Java applications - [JMX Ports](https://www.baeldung.com/jmx-ports) - [Calling JMX MBean Method From a Shell Script](https://www.baeldung.com/jmx-mbean-shell-access) - [External Debugging With JMXTerm](https://www.baeldung.com/java-jmxterm-external-debugging) +- [Create and Detect Memory Leaks in Java](https://www.baeldung.com/java-create-detect-memory-leaks) From ab1964f166b176025a1898c2c7aee4988fdcb05e Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 5 May 2023 21:48:48 +0800 Subject: [PATCH 069/141] Update README.md [skip ci] --- spring-boot-modules/spring-boot-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-3/README.md b/spring-boot-modules/spring-boot-3/README.md index be95ce2830..e99eb79127 100644 --- a/spring-boot-modules/spring-boot-3/README.md +++ b/spring-boot-modules/spring-boot-3/README.md @@ -6,3 +6,4 @@ - [Migrate Application From Spring Boot 2 to Spring Boot 3](https://www.baeldung.com/spring-boot-3-migration) - [Using Java Records with JPA](https://www.baeldung.com/spring-jpa-java-records) - [HTTP Interface in Spring 6](https://www.baeldung.com/spring-6-http-interface) +- [Working with Virtual Threads in Spring 6](https://www.baeldung.com/spring-6-virtual-threads) From 69e5f59d4b6f60a6ab26ca784728545612988834 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 5 May 2023 23:24:09 +0800 Subject: [PATCH 070/141] Update README.md [skip ci] --- core-java-modules/core-java-string-operations-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-operations-5/README.md b/core-java-modules/core-java-string-operations-5/README.md index 94fb7e855e..bbd63d1138 100644 --- a/core-java-modules/core-java-string-operations-5/README.md +++ b/core-java-modules/core-java-string-operations-5/README.md @@ -8,3 +8,4 @@ - [Convert String to String Array](https://www.baeldung.com/java-convert-string-to-string-array) - [String Interpolation in Java](https://www.baeldung.com/java-string-interpolation) - [Guide to Splitting a String by Whitespace in Java](https://www.baeldung.com/java-splitting-a-string-by-whitespace) +- [Check if the First Letter of a String Is a Number](https://www.baeldung.com/java-check-if-string-starts-with-number) From cc061011c75b130132e268307c114aa2836866a4 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 5 May 2023 23:28:38 +0800 Subject: [PATCH 071/141] Update README.md [skip ci] --- core-java-modules/core-java-char/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-char/README.md b/core-java-modules/core-java-char/README.md index 5f33aa6914..e4af3121c5 100644 --- a/core-java-modules/core-java-char/README.md +++ b/core-java-modules/core-java-char/README.md @@ -4,3 +4,4 @@ This module contains articles about Java Character Class ### Relevant Articles: - [Character#isAlphabetic vs. Character#isLetter](https://www.baeldung.com/java-character-isletter-isalphabetic) +- [Difference Between Java’s “char” and “String”](https://www.baeldung.com/java-char-vs-string) From 7720c03dbf9c5ead745a2ec7ca044993c7a5ed10 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 5 May 2023 23:37:21 +0800 Subject: [PATCH 072/141] Update README.md [skip ci] --- spring-boot-modules/spring-boot-libraries-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-libraries-2/README.md b/spring-boot-modules/spring-boot-libraries-2/README.md index fbba6ad62c..5c6b93469d 100644 --- a/spring-boot-modules/spring-boot-libraries-2/README.md +++ b/spring-boot-modules/spring-boot-libraries-2/README.md @@ -10,4 +10,5 @@ This module contains articles about various Spring Boot libraries - [Scanning Java Annotations At Runtime](https://www.baeldung.com/java-scan-annotations-runtime) - [Guide to Resilience4j With Spring Boot](https://www.baeldung.com/spring-boot-resilience4j) - [Using OpenAI ChatGPT APIs in Spring Boot](https://www.baeldung.com/spring-boot-chatgpt-api-openai) +- [Introduction to Spring Modulith](https://www.baeldung.com/spring-modulith) - More articles: [[prev -->]](/spring-boot-modules/spring-boot-libraries) From 93348fff6060a4d25fc1db6e417eb7163fd25089 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 5 May 2023 23:42:22 +0800 Subject: [PATCH 073/141] Update README.md [skip ci] --- persistence-modules/hibernate-mapping-2/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/persistence-modules/hibernate-mapping-2/README.md b/persistence-modules/hibernate-mapping-2/README.md index 7a811e17cf..4fba6691cf 100644 --- a/persistence-modules/hibernate-mapping-2/README.md +++ b/persistence-modules/hibernate-mapping-2/README.md @@ -4,4 +4,5 @@ This module contains articles about Hibernate Mappings. ### Relevant articles -- [Hibernate Many to Many Annotation Tutorial](https://www.baeldung.com/hibernate-many-to-many) \ No newline at end of file +- [Hibernate Many to Many Annotation Tutorial](https://www.baeldung.com/hibernate-many-to-many) +- [Boolean Converters in Hibernate 6](https://www.baeldung.com/java-hibernate-6-boolean-converters) From e47d956d5e641087a8e87abd66e32edfd1f28427 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 5 May 2023 23:48:25 +0800 Subject: [PATCH 074/141] Update README.md [skip ci] --- testing-modules/selenium-junit-testng/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/testing-modules/selenium-junit-testng/README.md b/testing-modules/selenium-junit-testng/README.md index 4d9834c6f5..e262fb326f 100644 --- a/testing-modules/selenium-junit-testng/README.md +++ b/testing-modules/selenium-junit-testng/README.md @@ -10,6 +10,7 @@ - [Handle Browser Tabs With Selenium](https://www.baeldung.com/java-handle-browser-tabs-selenium) - [Implicit Wait vs Explicit Wait in Selenium Webdriver](https://www.baeldung.com/selenium-implicit-explicit-wait) - [StaleElementReferenceException in Selenium](https://www.baeldung.com/selenium-staleelementreferenceexception) +- [Retrieve the Value of an HTML Input in Selenium WebDriver](https://www.baeldung.com/java-selenium-html-input-value) #### Notes: - to run the live tests for the article *Fixing Selenium WebDriver Executable Path Error*, follow the manual setup described From 2a750529ff6fbfbdb2f395ad839b7dca87f75b0a Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 5 May 2023 23:51:11 +0800 Subject: [PATCH 075/141] Update README.md [skip ci] --- algorithms-modules/algorithms-miscellaneous-7/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/algorithms-modules/algorithms-miscellaneous-7/README.md b/algorithms-modules/algorithms-miscellaneous-7/README.md index 53c218a40c..ab07d655f9 100644 --- a/algorithms-modules/algorithms-miscellaneous-7/README.md +++ b/algorithms-modules/algorithms-miscellaneous-7/README.md @@ -2,4 +2,5 @@ - [Algorithm to Identify and Validate a Credit Card Number](https://www.baeldung.com/java-validate-cc-number) - [Find the N Most Frequent Elements in a Java Array](https://www.baeldung.com/java-n-most-frequent-elements-array) +- [Getting Pixel Array From Image in Java](https://www.baeldung.com/java-getting-pixel-array-from-image) - More articles: [[<-- prev]](/algorithms-miscellaneous-6) From 73ab237379e701a4ccc5be90d9518d21fa7204e6 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 5 May 2023 23:58:06 +0800 Subject: [PATCH 076/141] Update README.md [skip ci] --- persistence-modules/spring-data-jpa-repo-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-data-jpa-repo-3/README.md b/persistence-modules/spring-data-jpa-repo-3/README.md index dc33900736..d3782eb1e6 100644 --- a/persistence-modules/spring-data-jpa-repo-3/README.md +++ b/persistence-modules/spring-data-jpa-repo-3/README.md @@ -4,4 +4,5 @@ This module contains articles about Spring Data JPA. ### Relevant Articles: - [New CRUD Repository Interfaces in Spring Data 3](https://www.baeldung.com/spring-data-3-crud-repository-interfaces) +- [How to Persist a List of String in JPA?](https://www.baeldung.com/java-jpa-persist-string-list) - More articles: [[<-- prev]](../spring-data-jpa-repo-2) From bb7a389e0140162b7fb1048a3f1016d50ebead28 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 6 May 2023 00:09:33 +0800 Subject: [PATCH 077/141] Update README.md [skip ci] --- core-java-modules/core-java-arrays-operations-basic/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-arrays-operations-basic/README.md b/core-java-modules/core-java-arrays-operations-basic/README.md index 2e1268e00c..eed64c0cae 100644 --- a/core-java-modules/core-java-arrays-operations-basic/README.md +++ b/core-java-modules/core-java-arrays-operations-basic/README.md @@ -11,3 +11,4 @@ This module contains articles about Java array fundamentals. They assume no prev - [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element) - [Extending an Array’s Length](https://www.baeldung.com/java-array-add-element-at-the-end) - [Initializing a Boolean Array in Java](https://www.baeldung.com/java-initializing-boolean-array) +- [Find the Index of an Element in a Java Array](https://www.baeldung.com/java-array-find-index) From 35d5f583ac8f41316a274eafd4d932ad3e9b173a Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 6 May 2023 00:15:22 +0800 Subject: [PATCH 078/141] Update README.md [skip ci] --- core-java-modules/core-java-string-operations-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-operations-5/README.md b/core-java-modules/core-java-string-operations-5/README.md index bbd63d1138..70a4f5607e 100644 --- a/core-java-modules/core-java-string-operations-5/README.md +++ b/core-java-modules/core-java-string-operations-5/README.md @@ -9,3 +9,4 @@ - [String Interpolation in Java](https://www.baeldung.com/java-string-interpolation) - [Guide to Splitting a String by Whitespace in Java](https://www.baeldung.com/java-splitting-a-string-by-whitespace) - [Check if the First Letter of a String Is a Number](https://www.baeldung.com/java-check-if-string-starts-with-number) +- [Print “” Quotes Around a String in Java](https://www.baeldung.com/java-string-print-quotes) From 7d26ae4a5ed1f6e10d095df606f99de422effd24 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 6 May 2023 00:19:31 +0800 Subject: [PATCH 079/141] Update README.md [skip ci] --- core-java-modules/core-java-20/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-20/README.md b/core-java-modules/core-java-20/README.md index 7e20469e44..aba4e9e240 100644 --- a/core-java-modules/core-java-20/README.md +++ b/core-java-modules/core-java-20/README.md @@ -1,2 +1,2 @@ ## Relevant Articles -- TBD \ No newline at end of file +- [Scoped Values in Java 20](https://www.baeldung.com/java-20-scoped-values) From daf01922dea076d757d3c499bfa97c95850d9949 Mon Sep 17 00:00:00 2001 From: "thibault.faure" Date: Mon, 1 May 2023 13:01:42 +0200 Subject: [PATCH 080/141] BAEL-6438 Code for the Find the longest word in a given string article --- .../longestword/LongestWordFinder.java | 36 +++++++++++ .../LongestWordFinderUnitTest.java | 62 +++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-5/src/main/java/com/baeldung/longestword/LongestWordFinder.java create mode 100644 core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/longestword/LongestWordFinderUnitTest.java diff --git a/core-java-modules/core-java-string-operations-5/src/main/java/com/baeldung/longestword/LongestWordFinder.java b/core-java-modules/core-java-string-operations-5/src/main/java/com/baeldung/longestword/LongestWordFinder.java new file mode 100644 index 0000000000..770984ac29 --- /dev/null +++ b/core-java-modules/core-java-string-operations-5/src/main/java/com/baeldung/longestword/LongestWordFinder.java @@ -0,0 +1,36 @@ +package com.baeldung.longestword; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +public class LongestWordFinder { + + public Optional findLongestWord(String sentence) { + return Optional.ofNullable(sentence) + .filter(string -> !string.trim() + .isEmpty()) + .map(string -> string.split("\\s")) + .map(Arrays::asList) + .map(list -> Collections.max(list, Comparator.comparingInt(String::length))); + } + + public List findLongestWords(String sentence) { + if (sentence == null || sentence.trim() + .isEmpty()) { + return Collections.emptyList(); + } + String[] words = sentence.split("\\s"); + int maxWordLength = Arrays.stream(words) + .mapToInt(String::length) + .max() + .orElseThrow(); + return Arrays.stream(words) + .filter(word -> word.length() == maxWordLength) + .collect(Collectors.toList()); + } + +} diff --git a/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/longestword/LongestWordFinderUnitTest.java b/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/longestword/LongestWordFinderUnitTest.java new file mode 100644 index 0000000000..9d5f82d493 --- /dev/null +++ b/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/longestword/LongestWordFinderUnitTest.java @@ -0,0 +1,62 @@ +package com.baeldung.longestword; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +class LongestWordFinderUnitTest { + + LongestWordFinder longestWordFinder = new LongestWordFinder(); + + @Test + void givenNull_whenFindLongestWord_thenEmpty() { + assertThat(longestWordFinder.findLongestWord(null)).isEmpty(); + } + + @Test + void givenEmptyString_whenFindLongestWord_thenEmpty() { + assertThat(longestWordFinder.findLongestWord("")).isEmpty(); + } + + @Test + void givenStringWithOnlySpaces_whenFindLongestWord_thenEmpty() { + assertThat(longestWordFinder.findLongestWord(" ")).isEmpty(); + } + + @Test + void givenAPhraseWithALongestWord_whenFindLongestWord_thenLongestWordOfThePhrase() { + assertThat(longestWordFinder.findLongestWord("This is a phrase with words")).hasValue("phrase"); + } + + @Test + void givenAPhraseWithVariousWordsOfMaxLength_whenFindLongestWord_thenAnyOfTheLongestsWordsOfThePhrase() { + assertThat(longestWordFinder.findLongestWord("Baeldung is another word of size eight in this sentence") + .get()).isIn("Baeldung", "sentence"); + } + + @Test + void givenNull_whenFindLongestWords_thenEmpty() { + assertThat(longestWordFinder.findLongestWords(null)).isEmpty(); + } + + @Test + void givenEmptyString_whenFindLongestWords_thenEmpty() { + assertThat(longestWordFinder.findLongestWords("")).isEmpty(); + } + + @Test + void givenStringWithOnlySpaces_whenFindLongestWords_thenEmpty() { + assertThat(longestWordFinder.findLongestWords(" ")).isEmpty(); + } + + @Test + void givenAPhraseWithALongestWord_whenFindLongestWords_thenLongestWordOfThePhrase() { + assertThat(longestWordFinder.findLongestWords("This is a phrase with words")).containsExactly("phrase"); + } + + @Test + void givenAPhraseWithVariousWordsOfMaxLength_whenFindLongestWords_thenAllLongestsWords() { + assertThat(longestWordFinder.findLongestWords("Baeldung is another word of size eight in this sentence")).containsExactly("Baeldung", "sentence"); + } + +} From 3ab60dc3070a173a0827c2d8cf174bf9e3e4491f Mon Sep 17 00:00:00 2001 From: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Date: Fri, 5 May 2023 22:25:50 +0200 Subject: [PATCH 081/141] BAEL-6332: Calling Non-Static Method In Static Method In Java (#13940) --- .../java/com/baeldung/staticmodifier/Car.java | 4 ++++ .../CallNonStaticMethodUnitTest.java | 21 +++++++++++++++++++ .../baeldung/staticmodifier/CarUnitTest.java | 7 +++++++ 3 files changed, 32 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmethod/CallNonStaticMethodUnitTest.java diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticmodifier/Car.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticmodifier/Car.java index 950f008dcd..1158851fbd 100644 --- a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticmodifier/Car.java +++ b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/staticmodifier/Car.java @@ -42,6 +42,10 @@ public class Car { this.engine = engine; } + public static String getCarsInformation(Car car) { + return car.getName() + "-" + car.getEngine(); + } + public static void setNumberOfCars(int numberOfCars) { Car.numberOfCars = numberOfCars; } diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmethod/CallNonStaticMethodUnitTest.java b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmethod/CallNonStaticMethodUnitTest.java new file mode 100644 index 0000000000..1171cb2e7a --- /dev/null +++ b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmethod/CallNonStaticMethodUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.staticmethod; + +import static org.junit.Assert.assertEquals; + +import org.junit.AfterClass; +import org.junit.Test; + +import com.baeldung.staticmodifier.Car; + +public class CallNonStaticMethodUnitTest { + @AfterClass + public static void setUpCarInstance() { + Car.setNumberOfCars(0); + } + @Test + public void whenCallingNonStaticMethodInStaticMethodWithInstanceClass_thenSuccess() { + Car car = new Car("Jaguar", "V8"); + assertEquals("Jaguar-V8", Car.getCarsInformation(car)); + } + +} diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmodifier/CarUnitTest.java b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmodifier/CarUnitTest.java index f55955caa8..68bbe8f0a2 100644 --- a/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmodifier/CarUnitTest.java +++ b/core-java-modules/core-java-lang-oop-modifiers/src/test/java/com/baeldung/staticmodifier/CarUnitTest.java @@ -2,9 +2,16 @@ package com.baeldung.staticmodifier; import static org.junit.Assert.*; +import org.junit.AfterClass; import org.junit.Test; public class CarUnitTest { + + @AfterClass + public static void setUpCarInstance() { + Car.setNumberOfCars(0); + } + @Test public void whenNumberOfCarObjectsInitialized_thenStaticCounterIncreases() { new Car("Jaguar", "V8"); From dea82bf189c8a34b0f5614f05d34ec789ee490f3 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sat, 6 May 2023 03:11:54 +0200 Subject: [PATCH 082/141] [BAEL-6485_RM-Punctuation] Remove Punctuation (#13946) --- .../RemovePunctuationUnitTest.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/delpunctuation/RemovePunctuationUnitTest.java diff --git a/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/delpunctuation/RemovePunctuationUnitTest.java b/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/delpunctuation/RemovePunctuationUnitTest.java new file mode 100644 index 0000000000..751ae0f4bc --- /dev/null +++ b/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/delpunctuation/RemovePunctuationUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.delpunctuation; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +import org.junit.jupiter.api.Test; + +public class RemovePunctuationUnitTest { + private static final String INPUT = "Its 1 W o r d (!@#$%^&*{}[];':\")<>,."; + private static final String EXPECTED = "Its 1 W o r d "; + + private static final String UNICODE_INPUT = "3 March März 三月 březen маршировать (!@#$%^&*{}[];':\")<>,."; + private static final String UNICODE_EXPECTED = "3 March März 三月 březen маршировать "; + + @Test + void whenUsingCharClassRange_thenGetExceptedResult() { + String result = INPUT.replaceAll("[^\\sa-zA-Z0-9]", ""); + assertEquals(EXPECTED, result); + } + + @Test + void whenUsingPunctuationCharClass_thenGetExceptedResult() { + String result = INPUT.replaceAll("\\p{Punct}", ""); + assertEquals(EXPECTED, result); + } + + @Test + void whenInputContainsUnicodeChars_thenGetExceptedResult() { + String result1 = UNICODE_INPUT.replaceAll("[^\\sa-zA-Z0-9]", ""); + assertNotEquals(UNICODE_EXPECTED, result1); + + String actualResult1 = "3 March Mrz bezen "; + assertEquals(actualResult1, result1); + + + String result2 = UNICODE_INPUT.replaceAll("\\p{Punct}", ""); + assertEquals(UNICODE_EXPECTED, result2); + + String result3 = UNICODE_INPUT.replaceAll("[^\\s\\p{L}0-9]", ""); + assertEquals(UNICODE_EXPECTED, result3); + } + +} \ No newline at end of file From 4a9e72664c9a8d94f7eb944b887ee62c36f57b4a Mon Sep 17 00:00:00 2001 From: Avin Buricha Date: Sat, 6 May 2023 08:53:31 +0530 Subject: [PATCH 083/141] BAEL-6410 (#13919) * BAEL-6410 | Article code * Adding consumer code for article --- .../kafka/headers/KafkaMessageHeaders.java | 88 +++++++++++++++ .../headers/KafkaMessageHeadersLiveTest.java | 104 ++++++++++++++++++ 2 files changed, 192 insertions(+) create mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/headers/KafkaMessageHeaders.java create mode 100644 apache-kafka-2/src/test/java/com/baeldung/kafka/headers/KafkaMessageHeadersLiveTest.java diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/headers/KafkaMessageHeaders.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/headers/KafkaMessageHeaders.java new file mode 100644 index 0000000000..2c8c14bfc5 --- /dev/null +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/headers/KafkaMessageHeaders.java @@ -0,0 +1,88 @@ +package com.baeldung.kafka.headers; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Properties; + +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.header.Header; +import org.apache.kafka.common.header.Headers; +import org.apache.kafka.common.header.internals.RecordHeader; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.apache.kafka.common.serialization.StringSerializer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class KafkaMessageHeaders { + + private static Logger logger = LoggerFactory.getLogger(KafkaMessageHeaders.class); + + private static String TOPIC = "baeldung"; + private static String MESSAGE_KEY = "message"; + private static String MESSAGE_VALUE = "Hello World"; + private static String HEADER_KEY = "website"; + private static String HEADER_VALUE = "baeldung.com"; + + private static KafkaProducer producer; + private static KafkaConsumer consumer; + + public static void main(String[] args) { + setup(); + + publishMessageWithCustomHeaders(); + + consumeMessageWithCustomHeaders(); + } + + private static void consumeMessageWithCustomHeaders() { + consumer.subscribe(Arrays.asList(TOPIC)); + + ConsumerRecords records = consumer.poll(Duration.ofMinutes(1)); + for (ConsumerRecord record : records) { + logger.info(record.key()); + logger.info(record.value()); + + Headers headers = record.headers(); + for (Header header : headers) { + logger.info(header.key()); + logger.info(new String(header.value())); + } + } + } + + private static void publishMessageWithCustomHeaders() { + List

headers = new ArrayList<>(); + headers.add(new RecordHeader(HEADER_KEY, HEADER_VALUE.getBytes())); + + ProducerRecord record1 = new ProducerRecord<>(TOPIC, null, MESSAGE_KEY, MESSAGE_VALUE, headers); + producer.send(record1); + + ProducerRecord record2 = new ProducerRecord<>(TOPIC, null, System.currentTimeMillis(), MESSAGE_KEY, MESSAGE_VALUE, headers); + producer.send(record2); + } + + private static void setup() { + Properties producerProperties = new Properties(); + producerProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); + producerProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + producerProperties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + + Properties consumerProperties = new Properties(); + consumerProperties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); + consumerProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + consumerProperties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + consumerProperties.put(ConsumerConfig.GROUP_ID_CONFIG, "ConsumerGroup1"); + + producer = new KafkaProducer<>(producerProperties); + consumer = new KafkaConsumer<>(consumerProperties); + } + +} diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/headers/KafkaMessageHeadersLiveTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/headers/KafkaMessageHeadersLiveTest.java new file mode 100644 index 0000000000..42cc572e07 --- /dev/null +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/headers/KafkaMessageHeadersLiveTest.java @@ -0,0 +1,104 @@ +package com.baeldung.kafka.headers; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Properties; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.clients.producer.RecordMetadata; +import org.apache.kafka.common.header.Header; +import org.apache.kafka.common.header.Headers; +import org.apache.kafka.common.header.internals.RecordHeader; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.apache.kafka.common.serialization.StringSerializer; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.KafkaContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; + +// This live test needs a Docker Daemon running so that a kafka container can be created + +@Testcontainers +public class KafkaMessageHeadersLiveTest { + + private static String TOPIC = "baeldung"; + private static String MESSAGE_KEY = "message"; + private static String MESSAGE_VALUE = "Hello World"; + private static String HEADER_KEY = "website"; + private static String HEADER_VALUE = "baeldung.com"; + + private static KafkaProducer producer; + private static KafkaConsumer consumer; + + @Container + private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); + + @BeforeAll + static void setup() { + KAFKA_CONTAINER.addExposedPort(9092); + + Properties producerProperties = new Properties(); + producerProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); + producerProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + producerProperties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + + Properties consumerProperties = new Properties(); + consumerProperties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); + consumerProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + consumerProperties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + consumerProperties.put(ConsumerConfig.GROUP_ID_CONFIG, "ConsumerGroup1"); + + producer = new KafkaProducer<>(producerProperties); + consumer = new KafkaConsumer<>(consumerProperties); + } + + @AfterAll + static void destroy() { + KAFKA_CONTAINER.stop(); + } + + @Test + void givenAMessageWithCustomHeaders_whenPublishedToKafkaAndConsumed_thenCheckForCustomHeaders() throws ExecutionException, InterruptedException { + List
headers = new ArrayList<>(); + headers.add(new RecordHeader(HEADER_KEY, HEADER_VALUE.getBytes())); + + ProducerRecord record1 = new ProducerRecord<>(TOPIC, null, MESSAGE_KEY, MESSAGE_VALUE, headers); + Future future = producer.send(record1); + + RecordMetadata metadata = future.get(); + + assertNotNull(metadata); + + consumer.subscribe(Arrays.asList(TOPIC)); + + ConsumerRecords records = consumer.poll(Duration.ofMinutes(1)); + for (ConsumerRecord record : records) { + assertEquals(MESSAGE_KEY, record.key()); + assertEquals(MESSAGE_VALUE, record.value()); + + Headers consumedHeaders = record.headers(); + assertNotNull(consumedHeaders); + + for (Header header : consumedHeaders) { + assertEquals(HEADER_KEY, header.key()); + assertEquals(HEADER_VALUE, new String(header.value())); + } + } + } +} From 7123ae8ad7f348ed47c750defbd7c1bd2de1e98d Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Sat, 6 May 2023 04:59:46 -0300 Subject: [PATCH 084/141] BAEL-6046 MongoDB - Field Level Encryption (#13859) --- .../spring-boot-persistence-mongodb-3/pom.xml | 28 +++++- .../boot/csfle/config/EncryptionConfig.java | 28 +++++- .../boot/csfle/config/MongoClientConfig.java | 88 ++++++++++++++----- .../boot/csfle/service/CitizenService.java | 33 ++++--- .../boot/csfle/web/CitizenController.java | 3 +- .../boot/csfle/CitizenServiceLiveTest.java | 10 ++- .../src/test/resources/embedded.properties | 6 +- 7 files changed, 150 insertions(+), 46 deletions(-) diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/pom.xml b/persistence-modules/spring-boot-persistence-mongodb-3/pom.xml index b9a47aa703..484e0c0f7e 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/pom.xml +++ b/persistence-modules/spring-boot-persistence-mongodb-3/pom.xml @@ -16,6 +16,21 @@ + + org.mongodb + mongodb-driver-sync + ${mongodb-driver.version} + + + org.mongodb + mongodb-driver-core + ${mongodb-driver.version} + + + org.mongodb + bson + ${mongodb-driver.version} + org.springframework.boot spring-boot-starter-web @@ -23,6 +38,16 @@ org.springframework.boot spring-boot-starter-data-mongodb + + + org.mongodb + mongodb-driver-sync + + + org.mongodb + mongodb-driver-core + + org.mongodb @@ -37,7 +62,8 @@ - 1.6.1 + 1.7.3 + 4.9.1 diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/EncryptionConfig.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/EncryptionConfig.java index 0ff97eb6c1..1a74340057 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/EncryptionConfig.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/EncryptionConfig.java @@ -1,5 +1,7 @@ package com.baeldung.boot.csfle.config; +import java.io.File; + import org.bson.BsonBinary; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; @@ -17,7 +19,13 @@ public class EncryptionConfig { private String keyVaultAlias; @Value("${com.baeldung.csfle.auto-decryption:false}") - private Boolean autoDecryption; + private boolean autoDecryption; + + @Value("${com.baeldung.csfle.auto-encryption:false}") + private boolean autoEncryption; + + @Value("${com.baeldung.csfle.auto-encryption-lib:#{null}}") + private File autoEncryptionLib; private BsonBinary dataKeyId; @@ -41,7 +49,23 @@ public class EncryptionConfig { return masterKeyPath; } - public Boolean getAutoDecryption() { + public boolean isAutoDecryption() { return autoDecryption; } + + public boolean isAutoEncryption() { + return autoEncryption; + } + + public File getAutoEncryptionLib() { + return autoEncryptionLib; + } + + public String dataKeyIdUuid() { + if (dataKeyId == null) + throw new IllegalStateException("data key not initialized"); + + return dataKeyId.asUuid() + .toString(); + } } diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/MongoClientConfig.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/MongoClientConfig.java index 0dff1ec86d..19d0af08b2 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/MongoClientConfig.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/MongoClientConfig.java @@ -1,14 +1,15 @@ package com.baeldung.boot.csfle.config; +import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Arrays; +import java.util.HashMap; import java.util.Map; import org.bson.BsonBinary; import org.bson.BsonDocument; import org.bson.Document; -import org.bson.conversions.Bson; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -51,14 +52,10 @@ public class MongoClientConfig extends AbstractMongoClientConfiguration { @Bean @Override public MongoClient mongoClient() { - MongoClient client; try { - client = MongoClients.create(clientSettings()); - ClientEncryption encryption = clientEncryption(); - encryptionConfig.setDataKeyId(createOrRetrieveDataKey(client, encryption)); - - return client; + encryptionConfig.setDataKeyId(createOrRetrieveDataKey(encryption)); + return MongoClients.create(clientSettings()); } catch (IOException e) { throw new IllegalStateException("unable to create client", e); } @@ -77,19 +74,10 @@ public class MongoClientConfig extends AbstractMongoClientConfiguration { return ClientEncryptions.create(encryptionSettings); } - private BsonBinary createOrRetrieveDataKey(MongoClient client, ClientEncryption encryption) { - MongoNamespace namespace = new MongoNamespace(encryptionConfig.getKeyVaultNamespace()); - MongoCollection keyVault = client.getDatabase(namespace.getDatabaseName()) - .getCollection(namespace.getCollectionName()); - - Bson query = Filters.in("keyAltNames", encryptionConfig.getKeyVaultAlias()); - BsonDocument key = keyVault.withDocumentClass(BsonDocument.class) - .find(query) - .first(); - + private BsonBinary createOrRetrieveDataKey(ClientEncryption encryption) { + BsonDocument key = encryption.getKeyByAltName(encryptionConfig.getKeyVaultAlias()); if (key == null) { - keyVault.createIndex(Indexes.ascending("keyAltNames"), new IndexOptions().unique(true) - .partialFilterExpression(Filters.exists("keyAltNames"))); + createKeyUniqueIndex(); DataKeyOptions options = new DataKeyOptions(); options.keyAltNames(Arrays.asList(encryptionConfig.getKeyVaultAlias())); @@ -99,16 +87,68 @@ public class MongoClientConfig extends AbstractMongoClientConfiguration { } } + private void createKeyUniqueIndex() { + try (MongoClient client = MongoClients.create(MongoClientSettings.builder() + .applyConnectionString(new ConnectionString(uri)) + .build())) { + MongoNamespace namespace = new MongoNamespace(encryptionConfig.getKeyVaultNamespace()); + MongoCollection keyVault = client.getDatabase(namespace.getDatabaseName()) + .getCollection(namespace.getCollectionName()); + + keyVault.createIndex(Indexes.ascending("keyAltNames"), new IndexOptions().unique(true) + .partialFilterExpression(Filters.exists("keyAltNames"))); + } + } + private MongoClientSettings clientSettings() throws FileNotFoundException, IOException { Builder settings = MongoClientSettings.builder() .applyConnectionString(new ConnectionString(uri)); - if (encryptionConfig.getAutoDecryption()) { - settings.autoEncryptionSettings(AutoEncryptionSettings.builder() + if (encryptionConfig.isAutoDecryption()) { + AutoEncryptionSettings.Builder builder = AutoEncryptionSettings.builder() .keyVaultNamespace(encryptionConfig.getKeyVaultNamespace()) - .kmsProviders(LocalKmsUtils.providersMap(encryptionConfig.getMasterKeyPath())) - .bypassAutoEncryption(true) - .build()); + .kmsProviders(LocalKmsUtils.providersMap(encryptionConfig.getMasterKeyPath())); + + if (encryptionConfig.isAutoEncryption() && encryptionConfig.getDataKeyId() != null) { + File autoEncryptionLib = encryptionConfig.getAutoEncryptionLib(); + if (!autoEncryptionLib.isFile()) { + throw new IllegalArgumentException("encryption lib must be an existing file"); + } + + Map map = new HashMap<>(); + map.put("cryptSharedLibRequired", true); + map.put("cryptSharedLibPath", autoEncryptionLib.toString()); + builder.extraOptions(map); + + String keyUuid = encryptionConfig.dataKeyIdUuid(); + HashMap schemaMap = new HashMap<>(); + schemaMap.put(getDatabaseName() + ".citizens", + BsonDocument.parse("{" + + " bsonType: \"object\"," + + " encryptMetadata: {" + + " keyId: [UUID(\"" + keyUuid + "\")]" + + " }," + + " properties: {" + + " email: {" + + " encrypt: {" + + " bsonType: \"string\"," + + " algorithm: \"AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic\"" + + " }" + + " }," + + " birthYear: {" + + " encrypt: {" + + " bsonType: \"int\"," + + " algorithm: \"AEAD_AES_256_CBC_HMAC_SHA_512-Random\"" + + " }" + + " }" + + " }" + + "}")); + builder.schemaMap(schemaMap); + } else { + builder.bypassAutoEncryption(true); + } + + settings.autoEncryptionSettings(builder.build()); } return settings.build(); diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java index 6b3c463d0d..c93b00f3f8 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java @@ -35,16 +35,20 @@ public class CitizenService { @Autowired private ClientEncryption clientEncryption; - public EncryptedCitizen save(Citizen citizen) { - EncryptedCitizen encryptedCitizen = new EncryptedCitizen(citizen); - encryptedCitizen.setEmail(encrypt(citizen.getEmail(), DETERMINISTIC_ALGORITHM)); - encryptedCitizen.setBirthYear(encrypt(citizen.getBirthYear(), RANDOM_ALGORITHM)); + public Object save(Citizen citizen) { + if (encryptionConfig.isAutoEncryption()) { + return mongo.save(citizen); + } else { + EncryptedCitizen encryptedCitizen = new EncryptedCitizen(citizen); + encryptedCitizen.setEmail(encrypt(citizen.getEmail(), DETERMINISTIC_ALGORITHM)); + encryptedCitizen.setBirthYear(encrypt(citizen.getBirthYear(), RANDOM_ALGORITHM)); - return mongo.save(encryptedCitizen); + return mongo.save(encryptedCitizen); + } } public List findAll() { - if (!encryptionConfig.getAutoDecryption()) { + if (!encryptionConfig.isAutoDecryption()) { List allEncrypted = mongo.findAll(EncryptedCitizen.class); return allEncrypted.stream() @@ -56,13 +60,20 @@ public class CitizenService { } public Citizen findByEmail(String email) { - Query byEmail = new Query(Criteria.where("email") - .is(encrypt(email, DETERMINISTIC_ALGORITHM))); - if (!encryptionConfig.getAutoDecryption()) { + Criteria emailCriteria = Criteria.where("email"); + if (encryptionConfig.isAutoEncryption()) { + emailCriteria.is(email); + } else { + emailCriteria + .is(encrypt(email, DETERMINISTIC_ALGORITHM)); + } + + Query byEmail = new Query(emailCriteria); + if (encryptionConfig.isAutoDecryption()) { + return mongo.findOne(byEmail, Citizen.class); + } else { EncryptedCitizen encryptedCitizen = mongo.findOne(byEmail, EncryptedCitizen.class); return decrypt(encryptedCitizen); - } else { - return mongo.findOne(byEmail, Citizen.class); } } diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/web/CitizenController.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/web/CitizenController.java index d17435fb5e..7a2b2605cd 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/web/CitizenController.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/web/CitizenController.java @@ -11,7 +11,6 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.baeldung.boot.csfle.data.Citizen; -import com.baeldung.boot.csfle.data.EncryptedCitizen; import com.baeldung.boot.csfle.service.CitizenService; @RestController @@ -32,7 +31,7 @@ public class CitizenController { } @PostMapping - public EncryptedCitizen post(@RequestBody Citizen citizen) { + public Object post(@RequestBody Citizen citizen) { return service.save(citizen); } } diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/csfle/CitizenServiceLiveTest.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/csfle/CitizenServiceLiveTest.java index 471cb2883a..d57da43751 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/csfle/CitizenServiceLiveTest.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/csfle/CitizenServiceLiveTest.java @@ -38,10 +38,14 @@ public class CitizenServiceLiveTest { citizen.setName("Foo"); citizen.setEmail("foo@citizen.com"); - Binary encryptedEmail = service.encrypt(citizen.getEmail(), CitizenService.DETERMINISTIC_ALGORITHM); + Object saved = service.save(citizen); + if (saved instanceof EncryptedCitizen) { + Binary encryptedEmail = service.encrypt(citizen.getEmail(), CitizenService.DETERMINISTIC_ALGORITHM); - EncryptedCitizen saved = service.save(citizen); - assertEquals(encryptedEmail, saved.getEmail()); + assertEquals(encryptedEmail, ((EncryptedCitizen) saved).getEmail()); + } else { + assertEquals(citizen.getEmail(), ((Citizen) saved).getEmail()); + } } @Test diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/test/resources/embedded.properties b/persistence-modules/spring-boot-persistence-mongodb-3/src/test/resources/embedded.properties index 5325354e55..cd1c1d43c7 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/test/resources/embedded.properties +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/test/resources/embedded.properties @@ -1,10 +1,10 @@ spring.mongodb.embedded.version=4.4.9 -spring.data.mongodb.uri=changeit -spring.data.mongodb.database=changeit +#spring.data.mongodb.uri=changeit +#spring.data.mongodb.database=changeit com.baeldung.csfle.kms-provider=local com.baeldung.csfle.key-vault.namespace=encryption._keyVault com.baeldung.csfle.key-vault.alias=master.key -com.baeldung.csfle.master-key-path=/tmp/master.key +#com.baeldung.csfle.master-key-path=/tmp/master.key com.baeldung.csfle.auto-decryption=false From ce79066afc6b20c1d2d9dbd09dc8cc34e096f300 Mon Sep 17 00:00:00 2001 From: Bhaskar Ghosh Dastidar Date: Sat, 6 May 2023 21:58:20 +0530 Subject: [PATCH 085/141] [BAEL-6253] record equals hashcode (#13958) * [BAEL-6253] records equals and hashcode * [BAEL-6253] records equals and hashcode * [BAEL-6253] records equals and hashcode test case --------- Co-authored-by: Bhaskar --- core-java-modules/core-java-records/pom.xml | 32 +++++++++++++++++++ .../baeldung/equalshashcoderecords/Movie.java | 26 +++++++++++++++ .../equalshashcoderecords/Person.java | 5 +++ .../CustomRecordEqualsHashCode.java | 30 +++++++++++++++++ core-java-modules/pom.xml | 1 + 5 files changed, 94 insertions(+) create mode 100644 core-java-modules/core-java-records/pom.xml create mode 100644 core-java-modules/core-java-records/src/main/java/com/baeldung/equalshashcoderecords/Movie.java create mode 100644 core-java-modules/core-java-records/src/main/java/com/baeldung/equalshashcoderecords/Person.java create mode 100644 core-java-modules/core-java-records/src/test/java/com/baeldung/equalshashcoderecords/CustomRecordEqualsHashCode.java diff --git a/core-java-modules/core-java-records/pom.xml b/core-java-modules/core-java-records/pom.xml new file mode 100644 index 0000000000..ed9a36fc14 --- /dev/null +++ b/core-java-modules/core-java-records/pom.xml @@ -0,0 +1,32 @@ + + + + core-java-modules + com.baeldung.core-java-modules + 0.0.1-SNAPSHOT + + 4.0.0 + + core-java-records + + + + org.apache.maven.plugins + maven-compiler-plugin + + 16 + 16 + + + + + + + 19 + 19 + UTF-8 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-records/src/main/java/com/baeldung/equalshashcoderecords/Movie.java b/core-java-modules/core-java-records/src/main/java/com/baeldung/equalshashcoderecords/Movie.java new file mode 100644 index 0000000000..e94638e8b5 --- /dev/null +++ b/core-java-modules/core-java-records/src/main/java/com/baeldung/equalshashcoderecords/Movie.java @@ -0,0 +1,26 @@ +package com.baeldung.equalshashcoderecords; + +import java.util.Objects; + +record Movie(String name, Integer yearOfRelease, String distributor) { + +@Override +public boolean equals(Object other) { + if (this == other) { + return true; + } + if (other == null) { + return false; + } + Movie movie = (Movie) other; + if (movie.name.equals(this.name) && movie.yearOfRelease.equals(this.yearOfRelease)) { + return true; + } + return false; +} + + @Override + public int hashCode() { + return Objects.hash(name, yearOfRelease); + } +} diff --git a/core-java-modules/core-java-records/src/main/java/com/baeldung/equalshashcoderecords/Person.java b/core-java-modules/core-java-records/src/main/java/com/baeldung/equalshashcoderecords/Person.java new file mode 100644 index 0000000000..7bfd8ae741 --- /dev/null +++ b/core-java-modules/core-java-records/src/main/java/com/baeldung/equalshashcoderecords/Person.java @@ -0,0 +1,5 @@ +package com.baeldung.equalshashcoderecords; + +public record Person(String firstName, String lastName, String SSN, String dateOfBirth) { +}; + diff --git a/core-java-modules/core-java-records/src/test/java/com/baeldung/equalshashcoderecords/CustomRecordEqualsHashCode.java b/core-java-modules/core-java-records/src/test/java/com/baeldung/equalshashcoderecords/CustomRecordEqualsHashCode.java new file mode 100644 index 0000000000..074886304f --- /dev/null +++ b/core-java-modules/core-java-records/src/test/java/com/baeldung/equalshashcoderecords/CustomRecordEqualsHashCode.java @@ -0,0 +1,30 @@ +package com.baeldung.equalshashcoderecords; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +import org.junit.Test; + +public class CustomRecordEqualsHashCode { + @Test + public void givenTwoRecords_whenDefaultEquals_thenCompareEquality() { + Person robert = new Person("Robert", "Frost", "HDHDB223", "2000-01-02"); + Person mike = new Person("Mike", "Adams", "ABJDJ2883", "2001-01-02"); + assertNotEquals(robert, mike); + } + + @Test + public void givenTwoRecords_hashCodesShouldBeSame() { + Person robert = new Person("Robert", "Frost", "HDHDB223", "2000-01-02"); + Person robertCopy = new Person("Robert", "Frost", "HDHDB223", "2000-01-02"); + assertEquals(robert.hashCode(), robertCopy.hashCode()); + } + + @Test + public void givenTwoRecords_whenCustomImplementation_thenCompareEquality() { + Movie movie1 = new Movie("The Batman", 2022, "WB"); + Movie movie2 = new Movie("The Batman", 2022, "Dreamworks"); + assertEquals(movie1, movie2); + assertEquals(movie1.hashCode(), movie2.hashCode()); + } +} diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 6f3aec8c3a..91f0dbfc28 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -141,6 +141,7 @@ core-java-uuid pre-jpms core-java-collections-maps-6 + core-java-records From 65cf74f42f5cbc2cb44c3865ec0ff251394f8436 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sun, 7 May 2023 17:05:37 +0200 Subject: [PATCH 086/141] [compByteArrays] Comparing Two Byte Arrays in Java (#13935) --- .../compare/CompareByteArraysUnitTest.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/compare/CompareByteArraysUnitTest.java diff --git a/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/compare/CompareByteArraysUnitTest.java b/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/compare/CompareByteArraysUnitTest.java new file mode 100644 index 0000000000..4274acf83d --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/compare/CompareByteArraysUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.array.compare; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Arrays; + +import org.junit.jupiter.api.Test; + +public class CompareByteArraysUnitTest { + private final static String INPUT = "I am a magic string."; + private final static byte[] ARRAY1 = INPUT.getBytes(); + private final static byte[] ARRAY2 = INPUT.getBytes(); + + @Test + void whenUsingEqualsSign_thenTwoArraysAreNotEqual() { + assertFalse(ARRAY1 == ARRAY2); + } + + @Test + void whenUsingEquals_thenTwoArraysAreNotEqual() { + assertFalse(ARRAY1.equals(ARRAY2)); + } + + @Test + void whenUsingArrayEquals_thenTwoArraysAreEqual() { + assertTrue(Arrays.equals(ARRAY1, ARRAY2)); + } + + @Test + void whenComparingStringArrays_thenGetExpectedResult() { + String[] strArray1 = new String[] { "Java", "is", "great" }; + String[] strArray2 = new String[] { "Java", "is", "great" }; + + assertFalse(strArray1 == strArray2); + assertFalse(strArray1.equals(strArray2)); + assertTrue(Arrays.equals(strArray1, strArray2)); + } +} \ No newline at end of file From 3aa158b8728e4fb8f3c7b2b6d594ef60c70135af Mon Sep 17 00:00:00 2001 From: Zahid Khan Date: Sun, 7 May 2023 22:48:49 +0530 Subject: [PATCH 087/141] Remove Comments and update prefix. --- .../error/configuration/MainConfiguration.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/error/configuration/MainConfiguration.java b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/error/configuration/MainConfiguration.java index cd7b513cd2..0b347ed54b 100644 --- a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/error/configuration/MainConfiguration.java +++ b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/error/configuration/MainConfiguration.java @@ -3,16 +3,8 @@ package com.baeldung.error.configuration; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; -/** - *

This class is for Configuration.

- *

- * Project Name: New folder - * - * @author Zahid Khan - * @version 4/1/2023 - */ @Configuration -@ConfigurationProperties(prefix = "profile.application-properties") +@ConfigurationProperties(prefix = "profileProperties") public class MainConfiguration { private String name; From 7f15d46d00e6c2fb7c15b79a06b2da8505e46be9 Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Mon, 8 May 2023 03:38:08 +0000 Subject: [PATCH 088/141] Uploading File using Selenium WebDriver in Java (#13947) * Uploading File using Selenium WebDriver in Java * Uploading File using Selenium WebDriver in Java * Uploading File using Selenium WebDriver in Java * Uploading File using Selenium WebDriver in Java --- testing-modules/pom.xml | 1 + .../selenium-webdriver/1688web.png | Bin 0 -> 14203 bytes testing-modules/selenium-webdriver/README.md | 1 + testing-modules/selenium-webdriver/pom.xml | 59 ++++++++++++++++++ .../FileUploadWebDriverUnitTest.java | 53 ++++++++++++++++ 5 files changed, 114 insertions(+) create mode 100644 testing-modules/selenium-webdriver/1688web.png create mode 100644 testing-modules/selenium-webdriver/README.md create mode 100644 testing-modules/selenium-webdriver/pom.xml create mode 100644 testing-modules/selenium-webdriver/src/test/java/com/baeldung/selenium/webdriver/fileupload/FileUploadWebDriverUnitTest.java diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml index 80e0c3bc29..8fb7a93a02 100644 --- a/testing-modules/pom.xml +++ b/testing-modules/pom.xml @@ -40,6 +40,7 @@ rest-assured rest-testing selenium-junit-testng + selenium-webdriver spring-mockito spring-testing-2 spring-testing diff --git a/testing-modules/selenium-webdriver/1688web.png b/testing-modules/selenium-webdriver/1688web.png new file mode 100644 index 0000000000000000000000000000000000000000..92ae7921fb89ac89c4ac399f07d60006bf89ad94 GIT binary patch literal 14203 zcmeIZ1yEdHqwRTs5D1U}2~N<2prLV>U?E5#xVviycS+FT1Pc~|2lpmO1Hs)JcWT1yEFGrO-;>IJ*t3B)#=^)^f`6*TEDgU@fm9O23)}kQ|xqJ8f z9ggs=G{5v0YUu)}4yE&r9?ulaaKrBc+SPAQ;sM~z5c-WOzlK#t%GZNF=9h6SRu=u2 z1ZSaJMXxv_SLui>LI{3u08g{TCgtIf!_%54~kwyU4<1#lJJM<;Nw+2p8ISY@YIG9O};5O)L!(bi;yee(e4Yj(^|ILgeSmGV0Ed_x z+5SkB!`g9~&KoxtP*VmhSs_~%mgMtu-WEIUd*h^`A-Y@uu$97|yGQ550RRr}#;9F* z)IW%LYOiL+f}^E8f&l;pT3?$CK6!$$w4f$)9(e$~0TVgZg>hJS{~r8mUho*$>#hV( zh*1z+fw$H(EWP`+y161QJ(O7sDJ?+vhhcs(Bdjn1R4|HF81A5IoODPDMO}HE63&=+ znh{N>PN5)S>Y^PwT1yPJ;B*-3SxX9DihB5Lk1Z6<_1;m4%Vy4i*t#?quWPU+rJEcu z?7k+iyIRgXJvc>QYVGq)M5Q*Y4igk4>;SNdwI0b&=5$q2VxXW}GseaCPfl_v0L;zh zTN$~jvjv6ByG|dtl+MSXl_Bxi0I=|D3(ie!mTkQwS2wYB_wpe0>kcFVV(s0X31vmt{Ei;bzo_C zEMOY9HO>>-r>vGVz`A@YOkL$^(0RRDG+%6dF_1-!mRa`eSfER^PlYT1M z2LQ(F#^K?ep7qvE(#a{P@9AwNziDvnsNIhqj(n_D`Uxf6ur%baDKB;SzOcd`?iVxG z-0#*`MBz^=s8kdHCM~gs?V13Qx{lG)k%MjNFxbM=vT}UhKxgiZ-U^4e+Xz&h^V~!^ z1q*T@GN%|z?(NY>!iP4_TUUdxiw_-N#oC|%74^ic4)1cAw7E6bY6Il8- z>*Y%Gy{-&{YuO;-J4UaMS|=oima-+~DfI`C)7WYqzN`Fdo#O`-?ztYL74YL-P^Xb6I*I?nq05xi!zy7i84^m1 zeFMEgI?mh4uu)RIJ-m%m@Iuq3dG$_^EffH_K<&56w4xlBd^LUOTLPIWbN$^KYA!9kqg28TnXTB#tM15{!~W|7+XIwNo|vDp<0?w)LqE5I0=A`G!xgP36@UX z*h`!UX0orWH1-u*1P=e=+iPkeHqg~$e}HowM=tT;!HBD9(qJF(#tHjyA(;YNQWN&Y z6ux`u-0%iJ8v^pkvZ3W3VBq$j7->kj4eQI^AOu|HS24CAXS^9rFOQYvEHwERb6E-A zKl8s6zzh4_MF#lOY|=69nG~Yi7($X2zS~i6@sm1=SV1&+zf?(2W)$fjUx|XRQz}9_ zV!kTKkO2VAN6);~aaQ7CdkDd{<#_fix;P3jr5mBXXRtb2kd#1;@qwa3H?iTnR?_@L zx0)U0;552NkyFKDc=Dq%8f{v^a=&dVI67QrB=JldmcG~0 zy8hW1DSKFPZ3zv9QJjj`c~&$S%C9yCIu7hCR{IR8;R5xAsI?4db7p;l9V2l1e7*kh z+`Jcic_@IT{X(82-Td`g+{@q+dIgTFngBspyyl6NT^MJ^c_C1BznJk70tWscF!XO>mkpd$3EYy zkGM`1hahyG{pvKQwFu;0dBT|P-u_4|5ioNa_EZ`9ZArva1%14s%SUPIrK2xVa%;+L zfYIQ`Px&oq;%>rIpQrIKGA5j%L!Nfh@b>WIeyO1z<7B94clBBAC>{DkR;icmmb_SS zT|!`^_0_sIR6K23&eROe-~5frlhu$s7DVpx<7_{zp8?9}oh)}~Uha&&RX=#RCCWCG z>D|^M1fQPqGXQ`@tShIojU;EoYL=a7{-M5oFb5@f*rm9MA;|nR%*v0mEZuyCh2@s+U*N2<2mEtw{Bo zs+X&&yzRF%edhQu@aLjqjE%gPW*C5?C*lDw)o>T>E%a)&ZgM&NbJgl>`n?467x{b! zH=7~|Jy|PBobdoat=CrO1^A(dTBNVSLxf(G*emXbipY(B(<7!1-H0cnTTiSl)y3dj zOQnWF`ZDdXj8&3M$Z5oI(ProA9Im2bE_2~)hOpyx`I#F`J9#Upv^q6s;N!Vbtevu5 zNUC4B(iu!{XaY)oW&1-TWWGFmO=WtMbx94JNpsUj%$$XyFlM%h)+BJo;-so83;h3{nr5Aw*86>U-6*j{5uiK`c~%CW1l^*6{zl z)hnF;?5#+4o2Ze8TDBUVqthS<&mJ~_kT1YXVf)8=`E|~vG*opy5UlENxF>sw5oABn z8yQlXFhK$l@q`%g7;v)9oCGr*|FifRV zouyxN^t|6hG@snMr7qm~HE*ZURUze_t?tHE6Wc_K_SJv^p-9t-fD0&86f?P+_*v-v zdR+8&zPBH1AGQr~C;SewTBR7D?jQRJzP{UcUuY~4{mJ|g09K=J2MnOM>AcX! z<1eaq6c)ynH@j&@Vi!C6`uAJ;N6Eeen3)=5)AgVeUSWgld`Tw1#3pP&_Z~~i>Znao zak`$Q+4Ew=V)5d5hsy8bCUt%&{wn0_OPyxKhn(Mf2_2+fAWQG^V_fAOTnV>%gySu* z;s)*c9nYcgnNr130SZ#HO)cKuHh^dSj(?19M=0GS)*bYE?cXig4R%0#jvFUey^oHy z<-A6{CgIVb;O4$#p?!x@UcJSuo8`8%xXs6_p+V6g4l17$_)=w`?jrFfvq5$>E|ssR zXKQ9KOkyY>X0%wlu*bh!eS5cCBI@F^dhUC9NI!!fF5)Bv`k}|-6r0fO8J_M?e>XcM z2QzrwBsJxK5CFbmxo*B!yt|iGZr(@gXjlylMELDiwuN zr#3`v+Er5EL8W>G7%tz)H@p(m%#PjRpiB2I~!}oS3yc$q1a< zRz5LAI?DXTqY#U})SliRe1_KYkL6=t^S&Q;+;@Sa&~;22XMNtKzC_UT#haTQKkwVF z^TDZrW#Wm(F}s1*sW-2a2qtza-xqW^7v=!Ny0#-j!#wqMmxB{u<_kFSaO*4qV3^xP zc3y776aZEZ+8;#Gym|B5*8a3M0Ea642nPi~^>hJqE^bj+jSRlw+RAza_%E<*I40aJ zFMM=OK}@8R66DJx{TJi35akln80_(ey8I7 zF)yW`(*9h~(TF~qB=3^1O+2Dj)s2a#c^2!TKMk>KB_aCmCvF<95~A9;X-|yZyLETV ziC@jEV`}qudxQ)I%B&aFMC!6?1#UK{4;^n$x={Q2fh3B?M6y?bAQ=NanBu%`EHv^6Gnwi2_xc z>PgOU6b1`}%s|I{0FASh{mH%WWszdj={#s&bnH`Me4Kmi>rxh&1?{=<%NHy?yPsQT z_?g{Vjcn{4W* zV(9=XyZ9!lkK+GP=qI9>Ui%?{$4soF%QZ2kb}ZaGPGBiu^rE%#t5(@nQdD$sL!>yO zgiRW)uOP@J^7w=(TI(ht?ar)8M;`(7Pkqs*@b0rzD>A1-vt0Y?)o<@ixmR3zmgpW7 z`HLo}=u$N*l2aK>JXH^>(RCD<1uS2hscCY24Jl&N%$AsRvp0%N;{2kE4TQp=B+(K~ zY9obpw9OQzqvEu)iu5%FK%eOr0SxP3LUzt4NbGLPb!wpmG^Ac3xCz zojE?nv|$&HwZbXeKAz+hw?v)e^E~aCyx-cT;?%D3#CS6~Ghm*LHazl}gPRuGmAgkD zU5g#mE*Ju8s8robZ{s1T6E+i+Z9_MvoOt`*<+L>NCjsCu+{#`}MEI+XtG)ApRk|Ij@SaF)^JKRoc9HU>MFzw5RtF0*wXj$ zt~TG7SX7I&`4BAzOo4oE;QGt$(di35$1B%&(ZYnEH?TK4OmWMPkSOot$yfruB5N& zk%M&-_OOdMw-a2v4ftt(M9JPC?}&wG!LrS;P^W_e^y%8t_0mBKfxN!;E}oDCf6Pw5kE;qaa-ztM1F3Y5n<^ zgOsd`l_s5VjQZG#$MtFP<3V?^2Zy}(7a700v%VkEr6|UE#Mqa9c4$JjBZq{^9 ztw)Xk48PB;ZYSAg+AdNTwy~V17gH-hd=34Ue1H^!!mAf`ph@4$9vGpD)r`caRgur> z(UNoOW8;AqGTbU~gW2C6Q+K~)8a@nPu783TBJ4pH-yZ`ESZq(iN0@S-6@AHVa2ur` zs;I`&sl&I>)Azk;bIF0u6q5*2vacAgRJu989k;a{*{??RhrtbSW_yEt-BYT|exd3& zgA2XA-LZlf=uSrb)F(ukz}d>)yCT{kV;5=Yhf@9BC~~CQ%S4(tUb{sn7@B`+Vaw|< zVYlfc1qbJ=9xGx_mjZZbgB1Xzq}DRRUIG4|KeUB!_w&sLO(w7O?5fsNiihv;#^QTB z&;&?KRY?s`_JfjfF`^Q$!GeVFU%dNK;O6Gn?uro%=~dtH#ZC6fj)0qJ3&yO&;W2iUl|s#W|Mf(+uv?RaT_@W zLUjL0xRGF8>qBZvriN2NoSMj#nu?jT+X(rB^{?@ab` z;wsOM>gHtK-d?l-bXTxY@7OT=iT&hCIyo3ByVxS234MX zrP+UB;vt-X^c!fzzcV#VT{ieS-)ofuEn#!6%Ln%64Q|VjuD8HayK&rlU^qC0ihi*N z($WmsVe0s*e2+E+N#dlIyiE+yHJNEset@}k)FbBxZM{}fpMR!)ToV50G1sqWvM|ek z+X?3cM|I%|6KmlJU;_S3W{{j%-hjr!IR^(%UM03V{(v*qF6uar2GcckGK$TP|Cg-I z@y0+B1zNrKU^$-gBY%W3m`yOj|5cjrQq=0NuEZNxuif8%63I3Xr|hLVCt$dqG)dcQefBHnFxtSQ zyjhF+H1FYqSJZ(Db1gz#ci}#NEkwO@Wlc#3wp3C0gz~Ck1Mb+w8w*WKYH_l0evFM*C1{lVX!HUnYBj&_8|G!KX~fr!s}YEsFoaEifW$eCG>?+A-(I)MlpSK zscJqA;g8F4@iw-H`ilH0td5M5f}r0ssPy~Y@$_WL-1QhL`SD&T8YIpC$~oIf(;kK1 zhX%Qcy>@Z@v0k|%jY)G-Pa3|5%`jT^Y#U!3h-jOf$KDsr9cPkU38&O!wKx;5wF}7S z4NmaF*B}yg=*)^*NpBzo%KJOivviGZmI^jasO}x?StnKP&RN!Jk;XHhEIdwnNSQFe z;l$zv%8Ve|5I06e{QLaT-J$_}yf19PBT+F@ z@kUy=b}L{eSK(zOp7<6wPu_fzLP@a)suK|aObo>x1^jlKKSZ3@qJubZswD84iM0+3 zysq=}st;N>Ha05#HoWmOoV5;%FbZL9r)a6iQ#E54Vx3HPA{<>KM_K|=NQXSE717m` zZDBRK@ucb(?L(A^4gHlhy#@j)hFUvzmS- z?C>A!cibIc#qjbPa^pOr>j00}azN0b&N8=U%E$yPNnuN8Ki{6<%sr~Yw#_Fuq2+{8p4G%xjs z9dP`EWBliEVRF%ZHF8X4x{aKC@!Z=cv75^0Xg{Cc0+sxJXJ7(@>fYR$qfgg;9ol?1 zxJf0O;q3~s92n7Eo7X%*eDJsP{UCh#(Q^iVn^Ai|dcJ7qd3=9cXmWJXa+2F~lJc5yMfGY+M`qc$DYm#4l)X?o0YM6(kxXu9Ih&Z z@}q7lD5Q*W>hA%7_T?{+o=f=qYfsH>gE2@&h}KC_ zfd?ns3+7EDf}>gKpDc%^o&f+*k*{>|b)s={AI~H0!P@K^qs9g=Xks;dIB z54PgUp|kHl-~1eRfb4uSD8+`cy@Ip+)zL$MHl;AFiA>Q1{I{(TUw>mQOCI9hs9lD$kXXHeR+J!9r+9yU$b0Uz&BhAx3Q2i@BR3# zbJ;Gh{J3~zq+mA<9T8v9;#<{c^s$cy61wYe(#DcA?ADkHb(O18yNlK)n3wG2K_LR*|QN2o@DV>GX|W*ki)2MG{O_BgSXZA$xMKlhOux05TaZ!o-NRWhR`7 zt>M#j9nIBsWEO!67`uQvS7T(=s;x`A!5GQaG2LflUO6-#-^ncUU)#~8#6~7qj!((G zssdWrh>jgm09m+Xfq?`2a{2tgwx8v->o)(fC)-GYZJtYpXuXicdl%TzLew}1f=FJr zAwqnty%Thit81=e1}=MK%B_V83^QGGXOw?E*@-XFQ9w{Wwtb?t!1VH^MsZ?EKsv5q z3O{4BhSMRe(e~TDerUk?Cv;47?z2bD# z=*LgrLTZ#$^q@8`n9u>k=#MxhQs{eZk1N<4!&RB{pYx5519A^J#1NW9|97)zDxoi?+M>YV;zK(~IF4Jb@*l*ZxA zO+#%b4HpP=+fxTxIEZz=IDRQ%@`pQKRty-?E#V&6%CYVbb6)*k*jfzN9;DE)^{u73 zN*^X+C*J-43I=fa-x%QkX$+8-HgT7R%>Bu{CcjbLz5rVM?z&E?z^(gtcJ54GnkQ5* zAy+04k?*tj}>P zp|8s_Cwwat$^!oE2mRtUem24&@`a1H-BR(!$Z|yao%^?J6u>!G_r)Fc*vz7A5&_9C zf>^xld4?P(HQ*a|YP`)UmV-GcHsLXlg7Tg}f-0r5I%$wM;?6AdiR?Ui)dlYEaxTNr z=b3RFXo_6=TrB6_J0vDXf+VS#fp;bN1G`b-klVCQuR79R_i=^|?8r~hZ!qS(+krJ@ zbxIPJa<5gT@4-=-ZVkaqxm7Uy9l>&aAea`h`z{P6f|nAv?wyTj)psz-;DPp>bWcNp zYR^fSdKKS1`|mD}+g=pC1-Z>9xR)XE*8~>w9|_~?CVEcjxBc9&Q($cl6jG7~+_4_! zB)e<-W`QzR#C^J^j9b+08|Co#QoQlT94h?!;ZsMAk+hOU8xZUeH_llocC9cEDnL(^ z%0jQ}EqKFssQ^L0tI^Y7OpL#xa)&_EP-wPmpRbXPQ6|#9d6T55U%x}R5M8D9l^B>Fe&vq^D#jrj!P<7~PPz zG?CpAu0&0yv0X}3*Yq>1oxjnEs4Ua>gzTY@SfD`#c7rMCGI~YaP|7?TBCwGW<*Tv3 zCwap#$KW75IiSUo=xe~H2#GIE=lOnua@dzoVZ z4bpkF;mj-46H8{8boZaV;1uX`om#ADL4$A3E8>?1Z~2JHprI=G*ror98+< zf@$eE=_#Lm)SA6#j?8fA%JK~+L1q-jHmxh0E3-;()vld#hyO+cAdXgxMPFPXd)WT^ zvp#1PE)n$J*NKgK@%{$pf-KKzUar@KR;CEE zn%=BxQ0{^!WT6FWpB`amKEw6@)xHl4^el~&wo?n}Dh!iA8Y$D2!rHi@4Y0$&*t$0q z4WQnnJD4L&m&pJA{?%9bZReO%76*!YTn-PiMf85s+XU0$Kz-8o{P%CQcG0>)fh&&j7g7l8UgqO>I{#51p0{((kcK|g<3a(3 zQ#*7^k9Ow-kOn=XXhA_FwKP+hhi){{*<44`#XJ=pli49Dwp<5E`N zY^4cr8aKQA(e015!t)rZ*?rJ&%*FR8tQxiT4p~JId z3&aCf4_wY$uN4?;uwpN=q?7uReTM92m*A0o+GWh)8GI&6(uafdSb*k+F|!hD1vi^b z`&5@-T52D++N`i#U0K5BPE+G&h7`(+86_k~e*?BDF{ah>tc(4_1Ad16=Cl2%xX6F6wsXOyEEU$xt3#YlXszFMubNz7^vUy5N9X2d6o&DRz6(=6f)%PyjMh5 z>ZPc5g~6}ND82XkRDMnmXDwQx14U!aB#;Dbj%sZ5bb~Vv=`XuTGVbHSP8%3g_iu?t z&?m$+9Qm0SUyMUwj%q#&($tYc-7`l=r+5-n`X+UtEm*0kCLXWr<8}O$(D?2<+RL!oOp#}i2NQ?zRb1c6MBf|#^$;0JnhfA%3DiUd z-d4r*uNYGNsdME0v(Dl6f9yhl)81~aPc2g25kwlYU3`8ahMD;#;BWjSh0S88X{wEU zADng@Ec~k60o3_D1&JPs_Mjk7IH#Ea*?`morMao5+9mIe*ZI6p4fORf`_oUw>Q)Kw zr+)RH`WO{|szFStjTdj)Aeo31i3#&Qc`li#%wh#pU5P2s)HkE;?$ko=^Z?mMjCeWZp z(_1Slk(-l~K#9jiA>S2?+M2*Xgy0#kQ9k0_0(@JrL*9Je7cDx{fAl0sTq0>7fzV^q zMxsx#D`Ovs%&n%OTP0-O)3d|6XI--tzB_Y4ae{uXK-*u_}3VNG^;8;Co^G zp^xq<(&Gg^E@lyoPv1<9y=4r{Vr8#Q%0EuC^BDB}0aeQQsyl$}m^T_t9upvUv+nUo zgPRp%zXJ@v1A4zB`uii$y<;aOPILK2y1fli=R@ndoO1mnJK5KHDs<@n8^+95npD)(Eomm&>biw5-wm1uJ(`T|Qt0-I04< z(vwj+5pg^=@%F zgZ0G~>c?d>Q8^SmHtmk|^e|)ppzz`cc{Zb~TG0UjN=Hrm!fNP z#}$7TroB?|Zl}bP7}uvA*~h!+@H)E-R8x5(m@fBf?FpWjW<))60T$p-YxY$c6x0E2 zTrqj-fey4D{(w|{w z$tRlN9vssVGC#z1yh^&X_ozW*Goj!95`s#ObowC=c>m2d=*`sCNm@`VXFs2$&B~u{ z2XK9@WMU!hX;UL99?9GhtS#^COO`A}2imvwBf4l33N2x}v5QYQtY~5p`RDH>j)b@e z6?A4~xn7VnkNm7ik~c^3H)7d9;+Xi+FUrj;#;ryTsj&OuGsL*l#;IYJ%C!8Bh@Z1Z zaLRV!I+UWoWnzyJ+3l)oKmqPg4en2O4DPS~d{2v-S6iPx@h`1O9e9iJBb(gRTGBIG zZeEcR*PP(#{`02YUS+X803ZpQ`(8YHa6$@ygTqe;D$C@)DGd6K2 zE>KsPmKgq&tozvFm%Pg;+OoBF);B7;t-Vuv~b8ZfbKP@3y z2%OLm05HilA2oCvLZn}ix2^8p7WLJc=G|*631s(Cv^L%i%%0ChxI$w}hynkNpkD^E zYoIhjgRIb`oZ@QIrXA4;z7 ze(h4E<8za1p9q!!hAvmcZ4k#ys_(B5%%%R5`>9M+xL*F5Zas&ONB?6&p0eQJRPmoC zt$4LclrV615f`27-D>X$V9g;2p9 z=M{YV2U@7{17bVxr7*I!ruxrZ8Jw2gV-Sc(I5lT+CEgT&I!%T|$iRBXWBQ=p!y?9Ox{!Dr0&{l;+~6Q&ctr zD+_659K*&#_iice>*Q1KwvWM+D#tGB6IHrzo1HACjM`zKy(;|D&)H^3?*}qJC}=>o){G|aRzP + + 4.0.0 + selenium-webdriver + 0.0.1-SNAPSHOT + selenium-webdriver + + + com.baeldung + testing-modules + 1.0.0-SNAPSHOT + + + + + org.seleniumhq.selenium + selenium-java + ${selenium-java.version} + + + commons-logging + commons-logging + + + + + org.testng + testng + ${testng.version} + + + io.github.bonigarcia + webdrivermanager + ${webdrivermanager.version} + + + + + + + src/main/resources + true + + + src/test/resources + true + + + + + + 6.10 + 4.8.3 + 5.3.2 + + + \ No newline at end of file diff --git a/testing-modules/selenium-webdriver/src/test/java/com/baeldung/selenium/webdriver/fileupload/FileUploadWebDriverUnitTest.java b/testing-modules/selenium-webdriver/src/test/java/com/baeldung/selenium/webdriver/fileupload/FileUploadWebDriverUnitTest.java new file mode 100644 index 0000000000..18853ede56 --- /dev/null +++ b/testing-modules/selenium-webdriver/src/test/java/com/baeldung/selenium/webdriver/fileupload/FileUploadWebDriverUnitTest.java @@ -0,0 +1,53 @@ +package com.baeldung.selenium.webdriver.fileupload; + +import org.junit.Assert; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.openqa.selenium.By; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import org.openqa.selenium.firefox.FirefoxDriver; + +import io.github.bonigarcia.wdm.WebDriverManager; + +public class FileUploadWebDriverUnitTest { + + private WebDriver driver; + + private static final String URL = "http://www.csm-testcenter.org/test?do=show&subdo=common&test=file_upload"; + private static final String INPUT_NAME = "file_upload"; + + @BeforeEach + public void setUp() { + WebDriverManager.firefoxdriver() + .setup(); + driver = new FirefoxDriver(); + } + + @AfterEach + public void tearDown() { + driver.quit(); + } + + @Test + public void givenFileUploadPage_whenInputFilePath_thenFileUploadEndsWithFilename() { + driver.get(URL); + + String filePath = System.getProperty("user.dir") + "/1688web.png"; + WebElement inputElement = driver.findElement(By.name(INPUT_NAME)); + WebElement submitButton = driver.findElement(By.name("http_submit")); + + inputElement.sendKeys(filePath); + + String actualFilePath = inputElement.getAttribute("value"); + String fileName = filePath.substring(filePath.lastIndexOf("/") + 1); + + submitButton.click(); + + Assert.assertTrue(actualFilePath.endsWith(fileName)); + } + +} \ No newline at end of file From a673cea33de8dcff0f6628b4a0b201d365fccde0 Mon Sep 17 00:00:00 2001 From: Raj Kishor <30443297+rajkishorraj@users.noreply.github.com> Date: Mon, 8 May 2023 09:33:17 +0530 Subject: [PATCH 089/141] [rajkishorraj185@gmail.com] Lombok equalsandhashcode annotation (#13717) * example code for equalsandhashcode annotation * moving codes to lombok-2 --------- Co-authored-by: raj kishor --- .../lombok/equalsandhashcode/Employee.java | 14 +++++ .../equalsandhashcode/EmployeeDelomboked.java | 57 +++++++++++++++++++ .../commonissue/Employee.java | 20 +++++++ .../commonissue/EmployeeV2.java | 17 ++++++ .../commonissue/Manager.java | 16 ++++++ .../commonissue/ManagerV2.java | 16 ++++++ .../exclude/classlevel/Employee.java | 15 +++++ .../classlevel/EmployeeDelomboked.java | 37 ++++++++++++ .../exclude/fieldlevel/Employee.java | 18 ++++++ .../fieldlevel/EmployeeDelomboked.java | 31 ++++++++++ .../include/classlevel/Employee.java | 15 +++++ .../include/fieldlevel/Employee.java | 18 ++++++ .../include/methodlevel/Employee.java | 20 +++++++ .../methodlevel/EmployeeDelomboked.java | 40 +++++++++++++ .../inheritance/Employee.java | 16 ++++++ .../inheritance/Manager.java | 20 +++++++ .../inheritance/ManagerDelomboked.java | 37 ++++++++++++ .../inheritance/ManagerV2.java | 19 +++++++ .../EqualsAndHashCodeUnitTest.java | 20 +++++++ .../EqualsAndHashCodeUnitTest.java | 34 +++++++++++ .../classlevel/EqualsAndHashCodeUnitTest.java | 17 ++++++ .../fieldLevel/EqualsAndHashCodeUnitTest.java | 18 ++++++ .../classlevel/EqualsAndHashCodeUnitTest.java | 21 +++++++ .../fieldlevel/EqualsAndHashCodeUnitTest.java | 21 +++++++ .../EqualsAndHashCodeUnitTest.java | 22 +++++++ .../EqualsAndHashCodeUnitTest.java | 29 ++++++++++ 26 files changed, 608 insertions(+) create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/Employee.java create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/EmployeeDelomboked.java create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/commonissue/Employee.java create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/commonissue/EmployeeV2.java create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/commonissue/Manager.java create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/commonissue/ManagerV2.java create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/exclude/classlevel/Employee.java create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/exclude/classlevel/EmployeeDelomboked.java create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/exclude/fieldlevel/Employee.java create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/exclude/fieldlevel/EmployeeDelomboked.java create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/include/classlevel/Employee.java create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/include/fieldlevel/Employee.java create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/include/methodlevel/Employee.java create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/include/methodlevel/EmployeeDelomboked.java create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/inheritance/Employee.java create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/inheritance/Manager.java create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/inheritance/ManagerDelomboked.java create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/inheritance/ManagerV2.java create mode 100644 lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/EqualsAndHashCodeUnitTest.java create mode 100644 lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/commonissue/EqualsAndHashCodeUnitTest.java create mode 100644 lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/exclude/classlevel/EqualsAndHashCodeUnitTest.java create mode 100644 lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/exclude/fieldLevel/EqualsAndHashCodeUnitTest.java create mode 100644 lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/include/classlevel/EqualsAndHashCodeUnitTest.java create mode 100644 lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/include/fieldlevel/EqualsAndHashCodeUnitTest.java create mode 100644 lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/include/methodlevel/EqualsAndHashCodeUnitTest.java create mode 100644 lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/inheritance/EqualsAndHashCodeUnitTest.java diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/Employee.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/Employee.java new file mode 100644 index 0000000000..6f0ac60cca --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/Employee.java @@ -0,0 +1,14 @@ +package com.baeldung.lombok.equalsandhashcode; + +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@Getter +@EqualsAndHashCode +@AllArgsConstructor +public class Employee { + private String name; + private int id; + private int age; +} diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/EmployeeDelomboked.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/EmployeeDelomboked.java new file mode 100644 index 0000000000..afae2d4c17 --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/EmployeeDelomboked.java @@ -0,0 +1,57 @@ +package com.baeldung.lombok.equalsandhashcode; + +import lombok.Getter; + +@Getter +public class EmployeeDelomboked { + + private String name; + private int id; + private int age; + + public EmployeeDelomboked() { + } + + public boolean equals(Object o) { + if (o == this) { + return true; + } else if (!(o instanceof Employee)) { + return false; + } else { + Employee other = (Employee) o; + if (!other.canEqual(this)) { + return false; + } else if (this.getId() != other.getId()) { + return false; + } else if (this.getAge() != other.getAge()) { + return false; + } else { + Object this$name = this.getName(); + Object other$name = other.getName(); + if (this$name == null) { + if (other$name == null) { + return true; + } + } else if (this$name.equals(other$name)) { + return true; + } + + return false; + } + } + } + + protected boolean canEqual(Object other) { + return other instanceof Employee; + } + + public int hashCode() { + final int PRIME = 59; + int result = 1; + result = result * PRIME + this.getId(); + result = result * PRIME + this.getAge(); + Object $name = this.getName(); + result = result * PRIME + ($name == null ? 43 : $name.hashCode()); + return result; + } +} diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/commonissue/Employee.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/commonissue/Employee.java new file mode 100644 index 0000000000..91090a4a8c --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/commonissue/Employee.java @@ -0,0 +1,20 @@ +package com.baeldung.lombok.equalsandhashcode.commonissue; + +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@EqualsAndHashCode +@AllArgsConstructor +@NoArgsConstructor +public class Employee { + private String name; + private int id; + private int age; + private Manager manager; +} + diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/commonissue/EmployeeV2.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/commonissue/EmployeeV2.java new file mode 100644 index 0000000000..02bbbacaed --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/commonissue/EmployeeV2.java @@ -0,0 +1,17 @@ +package com.baeldung.lombok.equalsandhashcode.commonissue; + +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@EqualsAndHashCode(exclude = "manager") +@AllArgsConstructor +public class EmployeeV2 { + private String name; + private int id; + private int age; + private ManagerV2 manager; +} diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/commonissue/Manager.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/commonissue/Manager.java new file mode 100644 index 0000000000..aa6221d54a --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/commonissue/Manager.java @@ -0,0 +1,16 @@ +package com.baeldung.lombok.equalsandhashcode.commonissue; + +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@EqualsAndHashCode +@AllArgsConstructor +public class Manager { + private String name; + private Employee assistantManager; +} + diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/commonissue/ManagerV2.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/commonissue/ManagerV2.java new file mode 100644 index 0000000000..67068341f3 --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/commonissue/ManagerV2.java @@ -0,0 +1,16 @@ +package com.baeldung.lombok.equalsandhashcode.commonissue; + +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@EqualsAndHashCode +@AllArgsConstructor +public class ManagerV2 { + private String name; + private EmployeeV2 assistantManager; +} + diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/exclude/classlevel/Employee.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/exclude/classlevel/Employee.java new file mode 100644 index 0000000000..64c95d0e7b --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/exclude/classlevel/Employee.java @@ -0,0 +1,15 @@ +package com.baeldung.lombok.equalsandhashcode.exclude.classlevel; + +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@Getter +@EqualsAndHashCode(exclude = {"id", "age"}) +@AllArgsConstructor +public class Employee { + private String name; + private int id; + private int age; +} + diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/exclude/classlevel/EmployeeDelomboked.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/exclude/classlevel/EmployeeDelomboked.java new file mode 100644 index 0000000000..edf70689e1 --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/exclude/classlevel/EmployeeDelomboked.java @@ -0,0 +1,37 @@ +package com.baeldung.lombok.equalsandhashcode.exclude.classlevel; + + +import lombok.Getter; + +@Getter +public class EmployeeDelomboked { + private String name; + private int id; + private int age; + + @Override + public boolean equals(final Object o) { + if (o == this) return true; + if (!(o instanceof Employee)) return false; + final Employee other = (Employee) o; + if (!other.canEqual((Object) this)) return false; + final Object this$name = this.getName(); + final Object other$name = other.getName(); + if (this$name == null ? other$name != null : !this$name.equals(other$name)) return false; + return true; + } + + protected boolean canEqual(final Object other) { + return other instanceof Employee; + } + + @Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final Object $name = this.getName(); + result = result * PRIME + ($name == null ? 43 : $name.hashCode()); + return result; + } +} + diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/exclude/fieldlevel/Employee.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/exclude/fieldlevel/Employee.java new file mode 100644 index 0000000000..a03d1fc43a --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/exclude/fieldlevel/Employee.java @@ -0,0 +1,18 @@ +package com.baeldung.lombok.equalsandhashcode.exclude.fieldlevel; + +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@Getter +@EqualsAndHashCode +@AllArgsConstructor +public class Employee { + private String name; + @EqualsAndHashCode.Exclude + private int id; + @EqualsAndHashCode.Exclude + private int age; +} + + diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/exclude/fieldlevel/EmployeeDelomboked.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/exclude/fieldlevel/EmployeeDelomboked.java new file mode 100644 index 0000000000..f30ab6f709 --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/exclude/fieldlevel/EmployeeDelomboked.java @@ -0,0 +1,31 @@ +package com.baeldung.lombok.equalsandhashcode.exclude.fieldlevel; + + +import lombok.Getter; + +@Getter +public class EmployeeDelomboked { + private String name; + private int id; + private int age; + + public boolean equals(final Object o) { + if (o == this) return true; + if (!(o instanceof com.baeldung.lombok.equalsandhashcode.exclude.fieldlevel.Employee)) return false; + final com.baeldung.lombok.equalsandhashcode.exclude.fieldlevel.Employee other = (com.baeldung.lombok.equalsandhashcode.exclude.fieldlevel.Employee) o; + if (!other.canEqual((Object) this)) return false; + final Object this$name = this.getName(); + final Object other$name = other.getName(); + if (this$name == null ? other$name != null : !this$name.equals(other$name)) return false; + return true; + } + + public int hashCode() { + final int PRIME = 59; + int result = 1; + final Object $name = this.getName(); + result = result * PRIME + ($name == null ? 43 : $name.hashCode()); + return result; + } +} + diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/include/classlevel/Employee.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/include/classlevel/Employee.java new file mode 100644 index 0000000000..e353c27dfd --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/include/classlevel/Employee.java @@ -0,0 +1,15 @@ +package com.baeldung.lombok.equalsandhashcode.include.classlevel; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(of = {"name", "id"}) +@AllArgsConstructor +public class Employee { + private String name; + private int id; + private int age; +} + diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/include/fieldlevel/Employee.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/include/fieldlevel/Employee.java new file mode 100644 index 0000000000..c1d4ab5b0f --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/include/fieldlevel/Employee.java @@ -0,0 +1,18 @@ +package com.baeldung.lombok.equalsandhashcode.include.fieldlevel; + +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@Getter +@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@AllArgsConstructor +public class Employee { + @EqualsAndHashCode.Include + private String name; + @EqualsAndHashCode.Include + private int id; + private int age; +} + + diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/include/methodlevel/Employee.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/include/methodlevel/Employee.java new file mode 100644 index 0000000000..3de8cc2c69 --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/include/methodlevel/Employee.java @@ -0,0 +1,20 @@ +package com.baeldung.lombok.equalsandhashcode.include.methodlevel; + +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@Getter +@EqualsAndHashCode +@AllArgsConstructor +public class Employee { + private String name; + private int id; + private int age; + + @EqualsAndHashCode.Include + public boolean hasOddId() { + return id % 2 != 0; + } +} + diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/include/methodlevel/EmployeeDelomboked.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/include/methodlevel/EmployeeDelomboked.java new file mode 100644 index 0000000000..f25b996fe1 --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/include/methodlevel/EmployeeDelomboked.java @@ -0,0 +1,40 @@ +package com.baeldung.lombok.equalsandhashcode.include.methodlevel; + +import lombok.Getter; + +@Getter +public class EmployeeDelomboked { + private String name; + private int id; + private int age; + + public boolean hasOddId() { + return id % 2 != 0; + } + + public boolean equals(final Object o) { + if (o == this) return true; + if (!(o instanceof Employee)) return false; + final Employee other = (Employee) o; + if (!other.canEqual((Object) this)) return false; + if (this.getId() != other.getId()) return false; + if (this.getAge() != other.getAge()) return false; + if (this.hasOddId() != other.hasOddId()) return false; + final Object this$name = this.getName(); + final Object other$name = other.getName(); + if (this$name == null ? other$name != null : !this$name.equals(other$name)) return false; + return true; + } + + public int hashCode() { + final int PRIME = 59; + int result = 1; + result = result * PRIME + this.getId(); + result = result * PRIME + this.getAge(); + result = result * PRIME + (this.hasOddId() ? 79 : 97); + final Object $name = this.getName(); + result = result * PRIME + ($name == null ? 43 : $name.hashCode()); + return result; + } +} + diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/inheritance/Employee.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/inheritance/Employee.java new file mode 100644 index 0000000000..de63755cfc --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/inheritance/Employee.java @@ -0,0 +1,16 @@ +package com.baeldung.lombok.equalsandhashcode.inheritance; + +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@EqualsAndHashCode +@AllArgsConstructor +public class Employee { + private String name; + private int id; + private int age; +} diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/inheritance/Manager.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/inheritance/Manager.java new file mode 100644 index 0000000000..e943940c32 --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/inheritance/Manager.java @@ -0,0 +1,20 @@ +package com.baeldung.lombok.equalsandhashcode.inheritance; + +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@EqualsAndHashCode(callSuper = true) +public class Manager extends Employee { + private String departmentName; + private int uid; + + public Manager(String departmentName, int uid, String name, int id, int age) { + super(name, id, age); + this.departmentName = departmentName; + this.uid = uid; + } +} diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/inheritance/ManagerDelomboked.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/inheritance/ManagerDelomboked.java new file mode 100644 index 0000000000..e14b4a1f10 --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/inheritance/ManagerDelomboked.java @@ -0,0 +1,37 @@ +package com.baeldung.lombok.equalsandhashcode.inheritance; + +import lombok.Getter; + +@Getter +public class ManagerDelomboked extends Employee { + private String departmentName; + private int uid; + + public ManagerDelomboked(String departmentName, int uid, String name, int id, int age) { + super(name, id, age); + this.departmentName = departmentName; + this.uid = uid; + } + + public boolean equals(final Object o) { + if (o == this) return true; + if (!(o instanceof com.baeldung.lombok.equalsandhashcode.inheritance.Manager)) return false; + final com.baeldung.lombok.equalsandhashcode.inheritance.Manager other = (com.baeldung.lombok.equalsandhashcode.inheritance.Manager) o; + if (!other.canEqual((Object) this)) return false; + if (!super.equals(o)) return false; + if (this.getUid() != other.getUid()) return false; + final Object this$departmentName = this.getDepartmentName(); + final Object other$departmentName = other.getDepartmentName(); + if (this$departmentName == null ? other$departmentName != null : !this$departmentName.equals(other$departmentName)) return false; + return true; + } + + public int hashCode() { + final int PRIME = 59; + int result = super.hashCode(); + result = result * PRIME + this.getUid(); + final Object $departmentName = this.getDepartmentName(); + result = result * PRIME + ($departmentName == null ? 43 : $departmentName.hashCode()); + return result; + } +} diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/inheritance/ManagerV2.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/inheritance/ManagerV2.java new file mode 100644 index 0000000000..b5bdfd0891 --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/equalsandhashcode/inheritance/ManagerV2.java @@ -0,0 +1,19 @@ +package com.baeldung.lombok.equalsandhashcode.inheritance; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@EqualsAndHashCode(callSuper = false) +public class ManagerV2 extends Employee { + private String departmentName; + private int uid; + + public ManagerV2(String departmentName, int uid, String name, int id, int age) { + super(name, id, age); + this.departmentName = departmentName; + this.uid = uid; + } +} diff --git a/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/EqualsAndHashCodeUnitTest.java b/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/EqualsAndHashCodeUnitTest.java new file mode 100644 index 0000000000..614e94ea59 --- /dev/null +++ b/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/EqualsAndHashCodeUnitTest.java @@ -0,0 +1,20 @@ +package com.baeldung.lombok.equalsandhashcode; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; + +public class EqualsAndHashCodeUnitTest { + + @Test + public void whenUsingEqualsAndHashCodeOnClassLevel_thenTwoObjectsAreEqualAndHaveSameHashCodeIfAllFieldsAreSame() { + Employee employee = new Employee("Nimi", 15, 22); + Employee employeeTwo = new Employee("Nimi", 15, 22); + Employee employeeThree = new Employee("Mannat", 15, 22); + assertEquals(employee, employeeTwo); + assertNotEquals(employee, employeeThree); + assertEquals(employee.hashCode(), employeeTwo.hashCode()); + assertNotEquals(employee.hashCode(), employeeThree.hashCode()); + } +} diff --git a/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/commonissue/EqualsAndHashCodeUnitTest.java b/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/commonissue/EqualsAndHashCodeUnitTest.java new file mode 100644 index 0000000000..207e4e0636 --- /dev/null +++ b/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/commonissue/EqualsAndHashCodeUnitTest.java @@ -0,0 +1,34 @@ +package com.baeldung.lombok.equalsandhashcode.commonissue; + +import org.junit.Test; + +public class EqualsAndHashCodeUnitTest { + + @Test(expected = StackOverflowError.class) + public void whenUsingEqualsAndHashInObjectWithCircularDependency_thenCallingEqualsAndHasCodeWillThrowStackOverFlowError() { + Manager manager = new Manager("Mannat", null); + + Employee employee = new Employee("Nimi", 15, 22, manager); + + manager.setAssistantManager(employee); + + employee.setManager(manager); + + int hash = employee.hashCode(); + + } + + @Test + public void whenUsingEqualsAndHashInObjectAndExcludingCircularDependencyField_thenNoStackOverFlowError() { + ManagerV2 manager = new ManagerV2("Mannat", null); + + EmployeeV2 employee = new EmployeeV2("Nimi", 15, 22, manager); + + manager.setAssistantManager(employee); + + employee.setManager(manager); + + int hash = employee.hashCode(); + + } +} diff --git a/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/exclude/classlevel/EqualsAndHashCodeUnitTest.java b/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/exclude/classlevel/EqualsAndHashCodeUnitTest.java new file mode 100644 index 0000000000..be086ff7df --- /dev/null +++ b/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/exclude/classlevel/EqualsAndHashCodeUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.lombok.equalsandhashcode.exclude.classlevel; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class EqualsAndHashCodeUnitTest { + + @Test + public void whenUsingEqualsAndHashCodeOnClassLevelAndExcludingFields_thenTwoObjectsAreEqualAndHaveSameHashCodeEvenIfExcludedFieldsAreNotSame() { + Employee employee = new Employee("Nimi", 15, 22); + Employee employeeTwo = new Employee("Nimi", 17, 21); + + assertEquals(employee, employeeTwo); + assertEquals(employee.hashCode(), employeeTwo.hashCode()); + } +} diff --git a/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/exclude/fieldLevel/EqualsAndHashCodeUnitTest.java b/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/exclude/fieldLevel/EqualsAndHashCodeUnitTest.java new file mode 100644 index 0000000000..832b188509 --- /dev/null +++ b/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/exclude/fieldLevel/EqualsAndHashCodeUnitTest.java @@ -0,0 +1,18 @@ +package com.baeldung.lombok.equalsandhashcode.exclude.fieldLevel; + +import com.baeldung.lombok.equalsandhashcode.exclude.fieldlevel.Employee; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class EqualsAndHashCodeUnitTest { + + @Test + public void whenUsingEqualsAndHashCodeWithExcludingFields_thenTwoObjectsAreEqualAndHaveSameHashCodeEvenIfExcludedFieldsAreNotSame() { + Employee employee = new Employee("Nimi", 15, 22); + Employee employeeTwo = new Employee("Nimi", 17, 21); + + assertEquals(employee, employeeTwo); + assertEquals(employee.hashCode(), employeeTwo.hashCode()); + } +} diff --git a/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/include/classlevel/EqualsAndHashCodeUnitTest.java b/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/include/classlevel/EqualsAndHashCodeUnitTest.java new file mode 100644 index 0000000000..1641966fd2 --- /dev/null +++ b/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/include/classlevel/EqualsAndHashCodeUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.lombok.equalsandhashcode.include.classlevel; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class EqualsAndHashCodeUnitTest { + + @Test + public void whenUsingEqualsAndHashCodeOnClassLevelAndIncludeFields_thenTwoObjectsAreEqualAndHaveSameHashCodeIfIncludedFieldsAreSame() { + Employee employee = new Employee("Nimi", 15, 22); + Employee employeeTwo = new Employee("Nimi", 15, 22); + Employee employeeThree = new Employee("Nimi", 15, 23); + + assertEquals(employee, employeeTwo); + assertEquals(employee, employeeThree); + + assertEquals(employee.hashCode(), employeeTwo.hashCode()); + assertEquals(employee.hashCode(), employeeThree.hashCode()); + } +} diff --git a/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/include/fieldlevel/EqualsAndHashCodeUnitTest.java b/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/include/fieldlevel/EqualsAndHashCodeUnitTest.java new file mode 100644 index 0000000000..dcf6123d2a --- /dev/null +++ b/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/include/fieldlevel/EqualsAndHashCodeUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.lombok.equalsandhashcode.include.fieldlevel; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class EqualsAndHashCodeUnitTest { + + @Test + public void whenUsingEqualsAndHashCodeOnFieldLevel_thenTwoObjectsAreEqualAndHaveSameHashCodeIfIncludedFieldsAreSame() { + Employee employee = new Employee("Nimi", 15, 22); + Employee employeeTwo = new Employee("Nimi", 15, 22); + Employee employeeThree = new Employee("Nimi", 15, 23); + + assertEquals(employee, employeeTwo); + assertEquals(employee, employeeThree); + + assertEquals(employee.hashCode(), employeeTwo.hashCode()); + assertEquals(employee.hashCode(), employeeThree.hashCode()); + } +} diff --git a/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/include/methodlevel/EqualsAndHashCodeUnitTest.java b/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/include/methodlevel/EqualsAndHashCodeUnitTest.java new file mode 100644 index 0000000000..79d673b4a4 --- /dev/null +++ b/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/include/methodlevel/EqualsAndHashCodeUnitTest.java @@ -0,0 +1,22 @@ +package com.baeldung.lombok.equalsandhashcode.include.methodlevel; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; + +public class EqualsAndHashCodeUnitTest { + + @Test + public void whenUsingEqualsAndHashCodeOnMethodLevel_thenTwoObjectsAreEqualAndHaveSameHashCodeIfMethodsReturnSameValue() { + Employee employee = new Employee("Nimi", 15, 22); + Employee employeeTwo = new Employee("Nimi", 15, 22); + Employee employeeThree = new Employee("Nimi", 15, 23); + + assertEquals(employee, employeeTwo); + assertNotEquals(employee, employeeThree); + + assertEquals(employee.hashCode(), employeeTwo.hashCode()); + assertNotEquals(employee.hashCode(), employeeThree.hashCode()); + } +} diff --git a/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/inheritance/EqualsAndHashCodeUnitTest.java b/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/inheritance/EqualsAndHashCodeUnitTest.java new file mode 100644 index 0000000000..abf71fe83f --- /dev/null +++ b/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/equalsandhashcode/inheritance/EqualsAndHashCodeUnitTest.java @@ -0,0 +1,29 @@ +package com.baeldung.lombok.equalsandhashcode.inheritance; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; + +public class EqualsAndHashCodeUnitTest { + + @Test + public void whenUsingEqualsAndHashCodeAndCallSuperIsTrue_thenTwoObjectsAreEqualAndHaveSameHashCodeIfAllFieldsIncludingParentsFieldsAreSame() { + Manager manager = new Manager("Opto", 444, "Nimi", 15, 22); + Manager managerTwo = new Manager("Opto", 444, "Nimi", 15, 22); + Manager managerThree = new Manager("Opto", 444, "Nimi", 15, 23); + + assertEquals(manager, managerTwo); + assertNotEquals(managerTwo, managerThree); + + } + + @Test + public void whenUsingEqualsAndHashCodeAndCallSuperIsFalse_thenTwoObjectsAreEqualAndHaveSameHashCodeEvenIfAllParentsFieldsAreNotSame() { + ManagerV2 manager = new ManagerV2("Opto", 444, "Nimi", 15, 22); + ManagerV2 managerTwo = new ManagerV2("Opto", 444, "Nimi", 15, 22); + ManagerV2 managerThree = new ManagerV2("Opto", 444, "Nimi", 14, 21); + assertEquals(manager, managerTwo); + assertEquals(managerTwo, managerThree); + } +} From eb9815b6d6e8f038a352dbe98528bfb0cc0c6645 Mon Sep 17 00:00:00 2001 From: Zahid Khan Date: Mon, 8 May 2023 11:51:30 +0530 Subject: [PATCH 090/141] Match prefix same as draft. --- .../com/baeldung/error/configuration/MainConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/error/configuration/MainConfiguration.java b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/error/configuration/MainConfiguration.java index 0b347ed54b..3c5fbc3006 100644 --- a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/error/configuration/MainConfiguration.java +++ b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/error/configuration/MainConfiguration.java @@ -4,7 +4,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @Configuration -@ConfigurationProperties(prefix = "profileProperties") +@ConfigurationProperties(prefix = "profile.profileProperties") public class MainConfiguration { private String name; From bc19c39c52fda8a1dee160b29115160dc99efefe Mon Sep 17 00:00:00 2001 From: 3hsan <56245694+ehsansasanian@users.noreply.github.com> Date: Mon, 8 May 2023 14:53:44 +0200 Subject: [PATCH 091/141] JAVA-19152: fix intermittently failing RequestProcessorUnitTest (#13957) --- .../com/baeldung/concurrent/RequestProcessorUnitTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/RequestProcessorUnitTest.java b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/RequestProcessorUnitTest.java index c437b08b34..eb1f6fada0 100644 --- a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/RequestProcessorUnitTest.java +++ b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/RequestProcessorUnitTest.java @@ -20,7 +20,8 @@ public class RequestProcessorUnitTest { void whenWaitingWithThreadSleep_thenStatusIsDone() throws InterruptedException { String requestId = requestProcessor.processRequest(); - Thread.sleep(2000); + //The sleep value should be greater than the maximum time the request takes to complete + Thread.sleep(2010); assertEquals("DONE", requestProcessor.getStatus(requestId)); } @@ -31,7 +32,8 @@ public class RequestProcessorUnitTest { String requestId = requestProcessor.processRequest(); Awaitility.await() - .atMost(2, TimeUnit.SECONDS) + //The timeout value should be greater than the maximum time the request takes to complete + .atMost(2010, TimeUnit.MILLISECONDS) .pollDelay(500, TimeUnit.MILLISECONDS) .until(() -> requestProcessor.getStatus(requestId), not(equalTo("PROCESSING"))); From 7ed2075cd1588ed47c4b0bb4187ca18fcb4fb2ec Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Mon, 8 May 2023 16:16:46 +0300 Subject: [PATCH 092/141] [JAVA-19362] Upgraded itextpdf to 5.5.13.3 (#13961) --- pdf-2/pom.xml | 6 ++++-- pdf/pom.xml | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pdf-2/pom.xml b/pdf-2/pom.xml index 653b55a206..ccbb5c9693 100644 --- a/pdf-2/pom.xml +++ b/pdf-2/pom.xml @@ -28,12 +28,12 @@ com.itextpdf itextpdf - 5.5.13.3 + ${itextpdf.version} org.apache.pdfbox pdfbox - 3.0.0-RC1 + ${pdfbox.version} @@ -48,8 +48,10 @@ + 5.5.13.3 7.2.3 3.0.1 + 3.0.0-RC1 \ No newline at end of file diff --git a/pdf/pom.xml b/pdf/pom.xml index 4bfc7cb621..cead1b2ded 100644 --- a/pdf/pom.xml +++ b/pdf/pom.xml @@ -106,7 +106,7 @@ 2.0.25 2.0.1 - 5.5.10 + 5.5.13.3 5.5.10 3.15 1.8 From e16bd13cc805b7e92f7944cc30c7d7a59517939a Mon Sep 17 00:00:00 2001 From: 3hsan <56245694+ehsansasanian@users.noreply.github.com> Date: Mon, 8 May 2023 16:13:49 +0200 Subject: [PATCH 093/141] JAVA-16946: disable unit test for core-java-lang-oop-modifiers module for maintenance (#13968) --- core-java-modules/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 91f0dbfc28..66456d2045 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -97,7 +97,7 @@ core-java-lang-oop-constructors core-java-lang-oop-patterns core-java-lang-oop-generics - core-java-lang-oop-modifiers + core-java-lang-oop-types core-java-lang-oop-types-2 core-java-lang-oop-inheritance From 579ba7726f33c0e85510fe62f589644d1fe471e6 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Mon, 8 May 2023 17:29:52 +0200 Subject: [PATCH 094/141] BAEL-6444 | Added P6Spy logging in spring boot observation module. (#13965) * BAEL-6444 | Added P6Spy logging in spring boot observation module. * BAEL-6444 | Added Find with name query and custom log format now working * BAEL-6444 | Formatting * BAEL-6444 | Renaming junit files * BAEL-6444 | Added start class * BAEL-6444 | Actualized code with Article * BAEL-6444 | Actualized code with Article * BAEL-6444 | redded commit() * BAEL-6444 | BDD naming strategy --- .../spring-boot-3-observation/pom.xml | 23 ++++++++ .../p6spy/SampleP6SpyApplication.java | 29 ++++++++++ .../p6spy/controllers/JDBCController.java | 54 +++++++++++++++++++ .../p6spy/controllers/StudentController.java | 29 ++++++++++ .../baeldung/p6spy/repository/Student.java | 53 ++++++++++++++++++ .../p6spy/repository/StudentRepository.java | 11 ++++ .../src/main/resources/spy.properties | 36 +++++++++++++ .../p6spy/JDBCControllerIntegrationTest.java | 53 ++++++++++++++++++ ...SampleP6SpyApplicationIntegrationTest.java | 49 +++++++++++++++++ .../src/test/resources/spy.properties | 3 ++ 10 files changed, 340 insertions(+) create mode 100644 spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/SampleP6SpyApplication.java create mode 100644 spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/controllers/JDBCController.java create mode 100644 spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/controllers/StudentController.java create mode 100644 spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/repository/Student.java create mode 100644 spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/repository/StudentRepository.java create mode 100644 spring-boot-modules/spring-boot-3-observation/src/main/resources/spy.properties create mode 100644 spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/p6spy/JDBCControllerIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/p6spy/SampleP6SpyApplicationIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3-observation/src/test/resources/spy.properties diff --git a/spring-boot-modules/spring-boot-3-observation/pom.xml b/spring-boot-modules/spring-boot-3-observation/pom.xml index ed613ee98e..ddd81e3ca4 100644 --- a/spring-boot-modules/spring-boot-3-observation/pom.xml +++ b/spring-boot-modules/spring-boot-3-observation/pom.xml @@ -54,6 +54,25 @@ org.springframework.boot spring-boot-starter-aop + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.github.gavlyukovskiy + p6spy-spring-boot-starter + 1.9.0 + + + com.h2database + h2 + runtime + org.springframework.boot spring-boot-devtools @@ -63,4 +82,8 @@ + + com.baeldung.samples.SimpleObservationApplication + + diff --git a/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/SampleP6SpyApplication.java b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/SampleP6SpyApplication.java new file mode 100644 index 0000000000..2be1255d72 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/SampleP6SpyApplication.java @@ -0,0 +1,29 @@ +/* + * Copyright 2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.baeldung.p6spy; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SampleP6SpyApplication { + + public static void main(String[] args) { + SpringApplication.run(SampleP6SpyApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/controllers/JDBCController.java b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/controllers/JDBCController.java new file mode 100644 index 0000000000..d09e839165 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/controllers/JDBCController.java @@ -0,0 +1,54 @@ +package com.baeldung.p6spy.controllers; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("jdbc") +public class JDBCController { + + @Autowired + private DataSource dataSource; + + @RequestMapping("/commit") + public List> select() { + List> results = new ArrayList<>(); + try { + Connection connection = dataSource.getConnection(); + Statement statement = connection.createStatement(); + statement.executeQuery("SELECT * FROM student"); + connection.commit(); + } catch (Exception e) { + throw new IllegalStateException(e); + } + return results; + } + + @RequestMapping("/rollback") + public List> rollback() { + List> results = new ArrayList<>(); + try (Connection connection = dataSource.getConnection()) { + connection.rollback(); + } catch (Exception e) { + throw new IllegalStateException(e); + } + return results; + } + + @RequestMapping("/query-error") + public void error() { + try (Connection connection = dataSource.getConnection(); + Statement statement = connection.createStatement()) { + statement.execute("SELECT UNDEFINED()"); + } catch (Exception ignored) { + } + } +} diff --git a/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/controllers/StudentController.java b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/controllers/StudentController.java new file mode 100644 index 0000000000..d60fd8b52e --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/controllers/StudentController.java @@ -0,0 +1,29 @@ +package com.baeldung.p6spy.controllers; + +import com.baeldung.p6spy.repository.Student; +import com.baeldung.p6spy.repository.StudentRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("student") +public class StudentController { + + @Autowired + private StudentRepository repository; + + @RequestMapping("/save") + public Long save() { + return repository.save(new Student("Pablo", "Picasso")).getId(); + } + + @RequestMapping("/find/{name}") + public List getAll(@PathVariable String name) { + return repository.findAllByFirstName(name); + } + +} diff --git a/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/repository/Student.java b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/repository/Student.java new file mode 100644 index 0000000000..881f9409b8 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/repository/Student.java @@ -0,0 +1,53 @@ +package com.baeldung.p6spy.repository; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; + +@Entity +public class Student { + + @Id + @GeneratedValue + private Long id; + + private String firstName; + private String lastName; + + public Student() { + } + + public Student(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + @Override + public String toString() { + return "Student{" + "id=" + id + ", firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + '}'; + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/repository/StudentRepository.java b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/repository/StudentRepository.java new file mode 100644 index 0000000000..90d2c22877 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/repository/StudentRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.p6spy.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface StudentRepository extends JpaRepository { + List findAllByFirstName(String firstName); +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-observation/src/main/resources/spy.properties b/spring-boot-modules/spring-boot-3-observation/src/main/resources/spy.properties new file mode 100644 index 0000000000..c14d381836 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/main/resources/spy.properties @@ -0,0 +1,36 @@ +# specifies the appender to use for logging +# Please note: reload means forgetting all the previously set +# settings (even those set during runtime - via JMX) +# and starting with the clean table +# (only the properties read from the configuration file) +# (default is com.p6spy.engine.spy.appender.FileLogger) +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +#appender=com.p6spy.engine.spy.appender.StdoutLogger +appender=com.p6spy.engine.spy.appender.FileLogger + +# name of logfile to use, note Windows users should make sure to use forward slashes in their pathname (e:/test/spy.log) +# (used for com.p6spy.engine.spy.appender.FileLogger only) +# (default is spy.log) +logfile=database.log + +# append to the p6spy log file. if this is set to false the +# log file is truncated every time. (file logger only) +# (default is true) +append=true + +# class to use for formatting log messages (default is: com.p6spy.engine.spy.appender.SingleLineFormat) +logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat + +# Custom log message format used ONLY IF logMessageFormat is set to com.p6spy.engine.spy.appender.CustomLineFormat +# default is %(currentTime)|%(executionTime)|%(category)|connection%(connectionId)|%(sqlSingleLine) +# Available placeholders are: +# %(connectionId) the id of the connection +# %(currentTime) the current time expressing in milliseconds +# %(executionTime) the time in milliseconds that the operation took to complete +# %(category) the category of the operation +# %(effectiveSql) the SQL statement as submitted to the driver +# %(effectiveSqlSingleLine) the SQL statement as submitted to the driver, with all new lines removed +# %(sql) the SQL statement with all bind variables replaced with actual values +# %(sqlSingleLine) the SQL statement with all bind variables replaced with actual values, with all new lines removed +customLogMessageFormat=%(currentTime)|%(executionTime)|%(category)|%(sqlSingleLine) + diff --git a/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/p6spy/JDBCControllerIntegrationTest.java b/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/p6spy/JDBCControllerIntegrationTest.java new file mode 100644 index 0000000000..433641fcb0 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/p6spy/JDBCControllerIntegrationTest.java @@ -0,0 +1,53 @@ +/* + * Copyright 2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.baeldung.p6spy; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.web.client.RestTemplate; + +@ExtendWith(SpringExtension.class) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +class JDBCControllerIntegrationTest { + + private final RestTemplate restTemplate = new RestTemplate(); + @Value("http://localhost:${local.server.port}/jdbc") + private String localhost; + + @Test + void testJdbcCommitRESTMethod_isSuccessful() { + Assertions.assertTrue(restTemplate.getForEntity(localhost + "/commit", String.class) + .getStatusCode().is2xxSuccessful()); + } + + @Test + void jdbcRollbackRESTMethod_isSuccessful() { + Assertions.assertTrue(restTemplate.getForEntity(localhost + "/rollback", String.class) + .getStatusCode().is2xxSuccessful()); + } + + @Test + void jdbcQueryErrorRESTMethod_isSuccessful() { + Assertions.assertTrue(restTemplate.getForEntity(localhost + "/query-error", String.class) + .getStatusCode().is2xxSuccessful()); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/p6spy/SampleP6SpyApplicationIntegrationTest.java b/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/p6spy/SampleP6SpyApplicationIntegrationTest.java new file mode 100644 index 0000000000..ba6dd43195 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/p6spy/SampleP6SpyApplicationIntegrationTest.java @@ -0,0 +1,49 @@ +/* + * Copyright 2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.baeldung.p6spy; + +import com.github.gavlyukovskiy.boot.jdbc.decorator.DecoratedDataSource; +import com.github.gavlyukovskiy.boot.jdbc.decorator.p6spy.P6SpyDataSourceDecorator; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import javax.sql.DataSource; + +import static org.assertj.core.api.Assertions.assertThat; + +@ExtendWith(SpringExtension.class) +@SpringBootTest +class SampleP6SpyApplicationIntegrationTest { + + @Autowired + private DataSource dataSource; + + @Test + void whenP6SpyEnabled_datasourceIsDecorated() { + assertThat(dataSource).isInstanceOf(DecoratedDataSource.class); + } + + @Test + void whenP6SpyEnabled_decoratingChainContainsP6Spy() { + DecoratedDataSource decoratedDataSource = (DecoratedDataSource) dataSource; + assertThat(decoratedDataSource.getDecoratingChain().get(0).getDataSourceDecorator()).isInstanceOf(P6SpyDataSourceDecorator.class); + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-observation/src/test/resources/spy.properties b/spring-boot-modules/spring-boot-3-observation/src/test/resources/spy.properties new file mode 100644 index 0000000000..ea4525df98 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/test/resources/spy.properties @@ -0,0 +1,3 @@ +# specifies the appender to use for logging. +# used to avoid the creation of logging file with tests. +appender=com.p6spy.engine.spy.appender.StdoutLogger \ No newline at end of file From 4cc0380249b7ba23e6d83984dac2716145f53e02 Mon Sep 17 00:00:00 2001 From: Eugene Kovko <37694937+eukovko@users.noreply.github.com> Date: Mon, 8 May 2023 23:04:21 +0200 Subject: [PATCH 095/141] BAEL-6501 Update article "The producer-consumer problem example in Java" (#13973) * BAEL-6501 Changed the synchronization block to use the DataQueue * BAEL-6501 Fixed the platform agnostic new lines * BAEL-6501 Moved ID increment to a static method * BAEL-6501 Added a logger --- .../com/baeldung/producerconsumer/Consumer.java | 10 +++++++--- .../com/baeldung/producerconsumer/Producer.java | 16 ++++++++++++---- .../SimpleProducerConsumerDemonstrator.java | 6 ++++-- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/producerconsumer/Consumer.java b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/producerconsumer/Consumer.java index 9bbcbb923c..933a1b5f52 100644 --- a/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/producerconsumer/Consumer.java +++ b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/producerconsumer/Consumer.java @@ -1,6 +1,9 @@ package com.baeldung.producerconsumer; +import java.util.logging.Logger; + public class Consumer implements Runnable { + private static final Logger log = Logger.getLogger(Consumer.class.getCanonicalName()); private final DataQueue dataQueue; public Consumer(DataQueue dataQueue) { @@ -14,7 +17,7 @@ public class Consumer implements Runnable { public void consume() { while (dataQueue.runFlag) { - synchronized (this) { + synchronized (dataQueue) { while (dataQueue.isEmpty() && dataQueue.runFlag) { try { dataQueue.waitOnEmpty(); @@ -31,12 +34,13 @@ public class Consumer implements Runnable { useMessage(message); } } - System.out.println("Consumer Stopped"); + log.info("Consumer Stopped"); } private void useMessage(Message message) { if (message != null) { - System.out.printf("[%s] Consuming Message. Id: %d, Data: %f\n", Thread.currentThread().getName(), message.getId(), message.getData()); + log.info(String.format("[%s] Consuming Message. Id: %d, Data: %f%n", + Thread.currentThread().getName(), message.getId(), message.getData())); //Sleeping on random time to make it realistic ThreadUtil.sleep((long) (message.getData() * 100)); diff --git a/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/producerconsumer/Producer.java b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/producerconsumer/Producer.java index 04ad39f26e..ca89d0c866 100644 --- a/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/producerconsumer/Producer.java +++ b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/producerconsumer/Producer.java @@ -1,6 +1,9 @@ package com.baeldung.producerconsumer; +import java.util.logging.Logger; + public class Producer implements Runnable { + private static final Logger log = Logger.getLogger(Producer.class.getCanonicalName()); private final DataQueue dataQueue; private static int idSequence = 0; @@ -16,7 +19,7 @@ public class Producer implements Runnable { public void produce() { while (dataQueue.runFlag) { - synchronized (this) { + synchronized (dataQueue) { while (dataQueue.isFull() && dataQueue.runFlag) { try { dataQueue.waitOnFull(); @@ -33,12 +36,13 @@ public class Producer implements Runnable { dataQueue.notifyAllForEmpty(); } } - System.out.println("Producer Stopped"); + log.info("Producer Stopped"); } private Message generateMessage() { - Message message = new Message(++idSequence, Math.random()); - System.out.printf("[%s] Generated Message. Id: %d, Data: %f\n", Thread.currentThread().getName(), message.getId(), message.getData()); + Message message = new Message(incrementAndGetId(), Math.random()); + log.info(String.format("[%s] Generated Message. Id: %d, Data: %f%n", + Thread.currentThread().getName(), message.getId(), message.getData())); //Sleeping on random time to make it realistic ThreadUtil.sleep((long) (message.getData() * 100)); @@ -46,6 +50,10 @@ public class Producer implements Runnable { return message; } + private static int incrementAndGetId() { + return ++idSequence; + } + public void stop() { dataQueue.runFlag = false; dataQueue.notifyAllForFull(); diff --git a/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/producerconsumer/SimpleProducerConsumerDemonstrator.java b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/producerconsumer/SimpleProducerConsumerDemonstrator.java index f1f6e1cc9c..500dc9ca07 100644 --- a/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/producerconsumer/SimpleProducerConsumerDemonstrator.java +++ b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/producerconsumer/SimpleProducerConsumerDemonstrator.java @@ -2,10 +2,12 @@ package com.baeldung.producerconsumer; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingDeque; +import java.util.logging.Logger; import static com.baeldung.producerconsumer.ThreadUtil.sleep; public class SimpleProducerConsumerDemonstrator { + private static final Logger log = Logger.getLogger(SimpleProducerConsumerDemonstrator.class.getCanonicalName()); BlockingQueue blockingQueue = new LinkedBlockingDeque<>(5); private void produce() { @@ -17,7 +19,7 @@ public class SimpleProducerConsumerDemonstrator { e.printStackTrace(); break; } - System.out.printf("[%s] Value produced: %f\n", Thread.currentThread().getName(), value); + log.info(String.format("[%s] Value produced: %f%n", Thread.currentThread().getName(), value)); } } @@ -31,7 +33,7 @@ public class SimpleProducerConsumerDemonstrator { break; } // Consume value - System.out.printf("[%s] Value consumed: %f\n", Thread.currentThread().getName(), value); + log.info(String.format("[%s] Value consumed: %f%n", Thread.currentThread().getName(), value)); } } From 53d269ca68a7389290396189a5cee0ce521159a7 Mon Sep 17 00:00:00 2001 From: Bahaa El-Din Helmy Date: Tue, 9 May 2023 00:11:33 +0300 Subject: [PATCH 096/141] Add files via upload (#13978) --- core-java-modules/core-java-io-apis-2/pom.xml | 159 ++++++++++----- .../com/baeldung/multinput/MultiInputs.java | 36 ++++ .../AbsoluteToRelativeUnitTest.java | 185 +++++++++--------- .../BufferedReaderUnitTest.java | 62 +++--- .../FileReaderUnitTest.java | 60 +++--- .../multinput/TestMultipleInputsUnitTest.java | 47 +++++ .../baeldung/path/DesktopPathUnitTest.java | 56 +++--- .../scanner/NextLineVsNextIntUnitTest.java | 168 ++++++++-------- .../scanner/ScanACharacterUnitTest.java | 76 +++---- .../src/test/resources/sampleText1.txt | 6 +- 10 files changed, 502 insertions(+), 353 deletions(-) create mode 100644 core-java-modules/core-java-io-apis-2/src/main/java/com/baeldung/multinput/MultiInputs.java create mode 100644 core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/multinput/TestMultipleInputsUnitTest.java diff --git a/core-java-modules/core-java-io-apis-2/pom.xml b/core-java-modules/core-java-io-apis-2/pom.xml index 5ad5528bad..22c04cdc58 100644 --- a/core-java-modules/core-java-io-apis-2/pom.xml +++ b/core-java-modules/core-java-io-apis-2/pom.xml @@ -1,46 +1,115 @@ - - - 4.0.0 - core-java-io-apis-2 - core-java-io-apis-2 - jar - - - com.baeldung.core-java-modules - core-java-modules - 0.0.1-SNAPSHOT - - - - - - log4j - log4j - ${log4j.version} - - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - - - org.projectlombok - lombok - ${lombok.version} - provided - - - - - core-java-io-apis-2 - - - src/main/resources - true - - - - + + + 4.0.0 + core-java-io-apis-2 + core-java-io-apis-2 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + + log4j + log4j + ${log4j.version} + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + org.junit.jupiter + junit-jupiter-engine + 5.7.2 + test + + + org.junit.jupiter + junit-jupiter + + + org.junit.jupiter + junit-jupiter + + + org.junit.jupiter + junit-jupiter + + + org.junit.jupiter + junit-jupiter + + + + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter-version} + test + + + + org.junit.jupiter + junit-jupiter-params + ${junit-jupiter-version} + test + + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter-version} + test + + + org.junit.jupiter + junit-jupiter + + + org.junit.jupiter + junit-jupiter + + + org.junit.jupiter + junit-jupiter + + + org.testng + testng + 7.1.0 + test + + + org.testng + testng + 7.5 + compile + + + + 5.2.0 + + + core-java-io-apis-2 + + + src/main/resources + true + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-io-apis-2/src/main/java/com/baeldung/multinput/MultiInputs.java b/core-java-modules/core-java-io-apis-2/src/main/java/com/baeldung/multinput/MultiInputs.java new file mode 100644 index 0000000000..df799b2511 --- /dev/null +++ b/core-java-modules/core-java-io-apis-2/src/main/java/com/baeldung/multinput/MultiInputs.java @@ -0,0 +1,36 @@ +package com.baeldung.multinput; + +import java.util.InputMismatchException; +import java.util.Scanner; + +public class MultiInputs { + public void UsingSpaceDelimiter(){ + Scanner scanner = new Scanner(System.in); + System.out.print("Enter two numbers: "); + int num1 = scanner.nextInt(); + int num2 = scanner.nextInt(); + System.out.println("You entered " + num1 + " and " + num2); + + } + public void UsingREDelimiter(){ + Scanner scanner = new Scanner(System.in); + scanner.useDelimiter("[\\s,]+"); + System.out.print("Enter two numbers separated by a space or a comma: "); + int num1 = scanner.nextInt(); + int num2 = scanner.nextInt(); + System.out.println("You entered " + num1 + " and " + num2); + + } + public void UsingCustomDelimiter(){ + Scanner scanner = new Scanner(System.in); + scanner.useDelimiter(";"); + System.out.print("Enter two numbers separated by a semicolon: "); + try { int num1 = scanner.nextInt(); + int num2 = scanner.nextInt(); + System.out.println("You entered " + num1 + " and " + num2); } + catch (InputMismatchException e) + { System.out.println("Invalid input. Please enter two integers separated by a semicolon."); } + + } +} + diff --git a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/absolutetorelative/AbsoluteToRelativeUnitTest.java b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/absolutetorelative/AbsoluteToRelativeUnitTest.java index 0830b0808a..9b3f424a30 100644 --- a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/absolutetorelative/AbsoluteToRelativeUnitTest.java +++ b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/absolutetorelative/AbsoluteToRelativeUnitTest.java @@ -1,93 +1,92 @@ -package com.baeldung.absolutetorelative; - -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.net.URI; -import java.nio.file.Path; -import java.nio.file.Paths; - -public class AbsoluteToRelativeUnitTest { - - // given - until using Paths, no need to create physical files - private final Path pathOne = Paths.get("/baeldung/bar/one.txt"); - private final Path pathTwo = Paths.get("/baeldung/bar/two.txt"); - private final Path pathThree = Paths.get("/baeldung/foo/three.txt"); - - private final URI uriOne = pathOne.toUri(); - private final URI uriTwo = pathTwo.toUri(); - private final URI uriThree = pathThree.toUri(); - - @Test - public void givenAbsolutePaths_whenRelativizePathOneToPathTwo_thenRelativeIsReturned() { - Path result = pathOne.relativize(pathTwo); - - Assertions.assertThat(result) - .isRelative() - .isEqualTo(Paths.get("../two.txt")); - } - - @Test - public void givenAbsolutePaths_whenRelativizePathTwoToPathOne_thenRelativeIsReturned() { - Path result = pathTwo.relativize(pathOne); - - Assertions.assertThat(result) - .isRelative() - .isEqualTo(Paths.get("../one.txt")); - } - - @Test - public void givenAbsolutePaths_whenRelativizePathOneParentToPathTwo_thenRelativeIsReturned() { - Path result = pathOne.getParent().relativize(pathTwo); - - Assertions.assertThat(result) - .isRelative() - .isEqualTo(Paths.get("two.txt")); - } - - @Test - public void givenAbsolutePaths_whenRelativizePathOneToPathThree_thenRelativeIsReturned() { - Path result = pathOne.relativize(pathThree); - - Assertions.assertThat(result) - .isRelative() - .isEqualTo(Paths.get("../../foo/three.txt")); - } - - @Test - public void givenAbsolutePaths_whenRelativizePathThreeToPathOne_thenRelativeIsReturned() { - Path result = pathThree.relativize(pathOne); - - Assertions.assertThat(result) - .isRelative() - .isEqualTo(Paths.get("../../bar/one.txt")); - } - - @Test - public void givenAbsoluteURIs_whenRelativizeUriOneToUriTwo_thenAbsoluteIsReturned() { - URI result = uriOne.relativize(uriTwo); - - Assertions.assertThat(result) - .asString() - .contains("/baeldung/bar/two.txt"); - } - - @Test - public void givenAbsoluteURIs_whenRelativizeUriOneParentToUriTwo_thenRelativeIsReturned() { - URI result = pathOne.getParent().toUri().relativize(uriTwo); - - Assertions.assertThat(result) - .asString() - .contains("two.txt"); - } - - @Test - public void givenAbsoluteURIs_whenRelativizeUriOneParentToUriThree_thenAbsoluteIsReturned() { - URI result = pathOne.getParent().toUri().relativize(uriThree); - - Assertions.assertThat(result) - .asString() - .contains("/baeldung/foo/three.txt"); - } - -} +package com.baeldung.absolutetorelative; + +import java.net.URI; +import java.nio.file.Path; +import java.nio.file.Paths; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class AbsoluteToRelativeUnitTest { + + // given - until using Paths, no need to create physical files + private final Path pathOne = Paths.get("/baeldung/bar/one.txt"); + private final Path pathTwo = Paths.get("/baeldung/bar/two.txt"); + private final Path pathThree = Paths.get("/baeldung/foo/three.txt"); + + private final URI uriOne = pathOne.toUri(); + private final URI uriTwo = pathTwo.toUri(); + private final URI uriThree = pathThree.toUri(); + + @Test + public void givenAbsolutePaths_whenRelativizePathOneToPathTwo_thenRelativeIsReturned() { + Path result = pathOne.relativize(pathTwo); + + org.assertj.core.api.Assertions.assertThat(result) + .isRelative() + .isEqualTo(Paths.get("../two.txt")); + } + + @Test + public void givenAbsolutePaths_whenRelativizePathTwoToPathOne_thenRelativeIsReturned() { + Path result = pathTwo.relativize(pathOne); + + org.assertj.core.api.Assertions.assertThat(result) + .isRelative() + .isEqualTo(Paths.get("../one.txt")); + } + + @Test + public void givenAbsolutePaths_whenRelativizePathOneParentToPathTwo_thenRelativeIsReturned() { + Path result = pathOne.getParent().relativize(pathTwo); + + org.assertj.core.api.Assertions.assertThat(result) + .isRelative() + .isEqualTo(Paths.get("two.txt")); + } + + @Test + public void givenAbsolutePaths_whenRelativizePathOneToPathThree_thenRelativeIsReturned() { + Path result = pathOne.relativize(pathThree); + + org.assertj.core.api.Assertions.assertThat(result) + .isRelative() + .isEqualTo(Paths.get("../../foo/three.txt")); + } + + @Test + public void givenAbsolutePaths_whenRelativizePathThreeToPathOne_thenRelativeIsReturned() { + Path result = pathThree.relativize(pathOne); + + org.assertj.core.api.Assertions.assertThat(result) + .isRelative() + .isEqualTo(Paths.get("../../bar/one.txt")); + } + + @Test + public void givenAbsoluteURIs_whenRelativizeUriOneToUriTwo_thenAbsoluteIsReturned() { + URI result = uriOne.relativize(uriTwo); + + org.assertj.core.api.Assertions.assertThat(result) + .asString() + .contains("/baeldung/bar/two.txt"); + } + + @Test + public void givenAbsoluteURIs_whenRelativizeUriOneParentToUriTwo_thenRelativeIsReturned() { + URI result = pathOne.getParent().toUri().relativize(uriTwo); + + org.assertj.core.api.Assertions.assertThat(result) + .asString() + .contains("two.txt"); + } + + @Test + public void givenAbsoluteURIs_whenRelativizeUriOneParentToUriThree_thenAbsoluteIsReturned() { + URI result = pathOne.getParent().toUri().relativize(uriThree); + + org.assertj.core.api.Assertions.assertThat(result) + .asString() + .contains("/baeldung/foo/three.txt"); + } + +} diff --git a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/BufferedReaderUnitTest.java b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/BufferedReaderUnitTest.java index a2aeca56ad..06b7d38821 100644 --- a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/BufferedReaderUnitTest.java +++ b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/BufferedReaderUnitTest.java @@ -1,31 +1,31 @@ -package com.baeldung.bufferedreadervsfilereader; - -import org.junit.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; - -public class BufferedReaderUnitTest { - - @Test - public void whenReadingAFile_thenReadsLineByLine() { - StringBuilder result = new StringBuilder(); - - try (BufferedReader br = new BufferedReader(new FileReader("src/test/resources/sampleText1.txt"))) { - String line; - - while((line = br.readLine()) != null) { - result.append(line); - result.append('\n'); - } - } catch (IOException e) { - e.printStackTrace(); - } - - assertEquals("first line\nsecond line\nthird line\n", result.toString()); - } - -} +package com.baeldung.bufferedreadervsfilereader; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; + +import org.junit.jupiter.api.Assertions; +import org.testng.annotations.Test; +public class BufferedReaderUnitTest { + + @Test + public void whenReadingAFile_thenReadsLineByLine() { + StringBuilder result = new StringBuilder(); + + try (BufferedReader br = new BufferedReader(new FileReader("src/test/resources/sampleText1.txt"))) { + String line; + + while((line = br.readLine()) != null) { + result.append(line); + result.append('\n'); + } + } catch (IOException e) { + e.printStackTrace(); + } + + assertEquals("first line\nsecond line\nthird line\n", result.toString()); + } + +} diff --git a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/FileReaderUnitTest.java b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/FileReaderUnitTest.java index f046f313d4..5df870e7b5 100644 --- a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/FileReaderUnitTest.java +++ b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/FileReaderUnitTest.java @@ -1,30 +1,30 @@ -package com.baeldung.bufferedreadervsfilereader; - -import org.junit.jupiter.api.Test; - -import java.io.FileReader; -import java.io.IOException; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class FileReaderUnitTest { - - @Test - public void whenReadingAFile_thenReadsCharByChar() { - StringBuilder result = new StringBuilder(); - - try (FileReader fr = new FileReader("src/test/resources/sampleText2.txt")) { - int i = fr.read(); - - while(i != -1) { - result.append((char)i); - - i = fr.read(); - } - } catch (IOException e) { - e.printStackTrace(); - } - - assertEquals("qwerty", result.toString()); - } -} +package com.baeldung.bufferedreadervsfilereader; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.FileReader; +import java.io.IOException; + +import org.junit.jupiter.api.Test; + +public class FileReaderUnitTest { + + @Test + public void whenReadingAFile_thenReadsCharByChar() { + StringBuilder result = new StringBuilder(); + + try (FileReader fr = new FileReader("src/test/resources/sampleText2.txt")) { + int i = fr.read(); + + while(i != -1) { + result.append((char)i); + + i = fr.read(); + } + } catch (IOException e) { + e.printStackTrace(); + } + + assertEquals("qwerty", result.toString()); + } +} diff --git a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/multinput/TestMultipleInputsUnitTest.java b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/multinput/TestMultipleInputsUnitTest.java new file mode 100644 index 0000000000..317d9e817e --- /dev/null +++ b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/multinput/TestMultipleInputsUnitTest.java @@ -0,0 +1,47 @@ +package com.baeldung.multinput; + import java.io.ByteArrayInputStream; + import java.io.InputStream; + import java.util.InputMismatchException; + import org.junit.jupiter.api.Assertions; + import org.testng.annotations.Test; +import com.baeldung.multinput.MultiInputs; +public class TestMultipleInputsUnitTest { + @Test + public void givenMultipleInputs_whenUsingSpaceDelimiter_thenExpectPrintingOutputs() { + String input = "10 20\n"; + InputStream in = new ByteArrayInputStream(input.getBytes()); + System.setIn(in); + MultiInputs mi = new MultiInputs(); + mi.UsingSpaceDelimiter(); + // You can add assertions here to verify the behavior of the method + } + + @Test + public void givenMultipleInputs_whenUsingREDelimiter_thenExpectPrintingOutputs() { + String input = "30, 40\n"; + InputStream in = new ByteArrayInputStream(input.getBytes()); + System.setIn(in); + MultiInputs mi = new MultiInputs(); + mi.UsingREDelimiter(); + // You can add assertions here to verify the behavior of the method + } + + @Test + public void givenMultipleInputs_whenUsingCustomDelimiter_thenExpectPrintingOutputs() { + String input = "50; 60\n"; + InputStream in = new ByteArrayInputStream(input.getBytes()); + System.setIn(in); + MultiInputs mi = new MultiInputs(); + mi.UsingCustomDelimiter(); + // You can add assertions here to verify the behavior of the method + } + + @Test + public void givenInvalidInput_whenUsingSpaceDelimiter_thenExpectInputMismatchException() { + String input = "abc\n"; + InputStream in = new ByteArrayInputStream(input.getBytes()); + System.setIn(in); + MultiInputs mi = new MultiInputs(); + Assertions.assertThrows(InputMismatchException.class, mi::UsingSpaceDelimiter); + } +} diff --git a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/path/DesktopPathUnitTest.java b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/path/DesktopPathUnitTest.java index fe21d0a72f..1b71512c5c 100644 --- a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/path/DesktopPathUnitTest.java +++ b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/path/DesktopPathUnitTest.java @@ -1,29 +1,27 @@ -package com.baeldung.path; - -import org.junit.jupiter.api.Test; - -import java.io.File; - -import static org.junit.Assert.assertEquals; - -import javax.swing.filechooser.FileSystemView; - -public class DesktopPathUnitTest { - // Adapt DESKTOP_PATH variable to your own system path - // private static final String DESKTOP_PATH = "C:\\Users\\HRAF\\Desktop"; - - @Test - public void whenUsingGetUserHomeProperty_thenShouldEqualDesktopPath() { - String desktopPath = System.getProperty("user.home") + File.separator + "Desktop"; - // assertEquals(DESKTOP_PATH, desktopPath); - } - - @Test - public void whenUsingFileSystemViewGetHomeDirectory_thenShouldEqualDesktopPath() { - FileSystemView view = FileSystemView.getFileSystemView(); - File file = view.getHomeDirectory(); - String path = file.getPath(); - // assertEquals(DESKTOP_PATH, path); - } - -} +package com.baeldung.path; + +import java.io.File; + +import javax.swing.filechooser.FileSystemView; + +import org.junit.jupiter.api.Test; + +public class DesktopPathUnitTest { + // Adapt DESKTOP_PATH variable to your own system path + // private static final String DESKTOP_PATH = "C:\\Users\\HRAF\\Desktop"; + + @Test + public void whenUsingGetUserHomeProperty_thenShouldEqualDesktopPath() { + String desktopPath = System.getProperty("user.home") + File.separator + "Desktop"; + // assertEquals(DESKTOP_PATH, desktopPath); + } + + @Test + public void whenUsingFileSystemViewGetHomeDirectory_thenShouldEqualDesktopPath() { + FileSystemView view = FileSystemView.getFileSystemView(); + File file = view.getHomeDirectory(); + String path = file.getPath(); + // assertEquals(DESKTOP_PATH, path); + } + +} diff --git a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/scanner/NextLineVsNextIntUnitTest.java b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/scanner/NextLineVsNextIntUnitTest.java index 8fab7c62e9..3aae0469d0 100644 --- a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/scanner/NextLineVsNextIntUnitTest.java +++ b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/scanner/NextLineVsNextIntUnitTest.java @@ -1,85 +1,85 @@ -package com.baeldung.scanner; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import java.util.InputMismatchException; -import java.util.Scanner; - -import org.junit.jupiter.api.Test; - -public class NextLineVsNextIntUnitTest { - - @Test - void whenInputLineIsNumber_thenNextLineAndNextIntBothWork() { - String input = "42\n"; - - //nextLine() - Scanner sc1 = new Scanner(input); - int num1 = Integer.parseInt(sc1.nextLine()); - assertEquals(42, num1); - - //nextInt() - Scanner sc2 = new Scanner(input); - int num2 = sc2.nextInt(); - assertEquals(42, num2); - - } - - @Test - void whenInputIsNotValidNumber_thenNextLineAndNextIntThrowDifferentException() { - String input = "Nan\n"; - - //nextLine() -> NumberFormatException - Scanner sc1 = new Scanner(input); - assertThrows(NumberFormatException.class, () -> Integer.parseInt(sc1.nextLine())); - - //nextInt() -> InputMismatchException - Scanner sc2 = new Scanner(input); - assertThrows(InputMismatchException.class, sc2::nextInt); - } - - @Test - void whenUsingNextInt_thenTheNextTokenAfterItFailsToParseIsNotConsumed() { - String input = "42 is a magic number\n"; - - //nextInt() to read '42' - Scanner sc2 = new Scanner(input); - int num2 = sc2.nextInt(); - assertEquals(42, num2); - - // call nextInt() again on "is" - assertThrows(InputMismatchException.class, sc2::nextInt); - - String theNextToken = sc2.next(); - assertEquals("is", theNextToken); - - theNextToken = sc2.next(); - assertEquals("a", theNextToken); - } - - @Test - void whenReadingTwoInputLines_thenNextLineAndNextIntBehaveDifferently() { - - String input = new StringBuilder().append("42\n") - .append("It is a magic number.\n") - .toString(); - - //nextLine() - Scanner sc1 = new Scanner(input); - int num1 = Integer.parseInt(sc1.nextLine()); - String nextLineText1 = sc1.nextLine(); - assertEquals(42, num1); - assertEquals("It is a magic number.", nextLineText1); - - //nextInt() - Scanner sc2 = new Scanner(input); - int num2 = sc2.nextInt(); - assertEquals(42, num2); - - // nextInt() leaves the newline character (\n) behind - String nextLineText2 = sc2.nextLine(); - assertEquals("", nextLineText2); - } - +package com.baeldung.scanner; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.InputMismatchException; +import java.util.Scanner; + +import org.junit.jupiter.api.Test; + +public class NextLineVsNextIntUnitTest { + + @Test + void whenInputLineIsNumber_thenNextLineAndNextIntBothWork() { + String input = "42\n"; + + //nextLine() + Scanner sc1 = new Scanner(input); + int num1 = Integer.parseInt(sc1.nextLine()); + assertEquals(42, num1); + + //nextInt() + Scanner sc2 = new Scanner(input); + int num2 = sc2.nextInt(); + assertEquals(42, num2); + + } + + @Test + void whenInputIsNotValidNumber_thenNextLineAndNextIntThrowDifferentException() { + String input = "Nan\n"; + + //nextLine() -> NumberFormatException + Scanner sc1 = new Scanner(input); + assertThrows(NumberFormatException.class, () -> Integer.parseInt(sc1.nextLine())); + + //nextInt() -> InputMismatchException + Scanner sc2 = new Scanner(input); + assertThrows(InputMismatchException.class, sc2::nextInt); + } + + @Test + void whenUsingNextInt_thenTheNextTokenAfterItFailsToParseIsNotConsumed() { + String input = "42 is a magic number\n"; + + //nextInt() to read '42' + Scanner sc2 = new Scanner(input); + int num2 = sc2.nextInt(); + assertEquals(42, num2); + + // call nextInt() again on "is" + assertThrows(InputMismatchException.class, sc2::nextInt); + + String theNextToken = sc2.next(); + assertEquals("is", theNextToken); + + theNextToken = sc2.next(); + assertEquals("a", theNextToken); + } + + @Test + void whenReadingTwoInputLines_thenNextLineAndNextIntBehaveDifferently() { + + String input = new StringBuilder().append("42\n") + .append("It is a magic number.\n") + .toString(); + + //nextLine() + Scanner sc1 = new Scanner(input); + int num1 = Integer.parseInt(sc1.nextLine()); + String nextLineText1 = sc1.nextLine(); + assertEquals(42, num1); + assertEquals("It is a magic number.", nextLineText1); + + //nextInt() + Scanner sc2 = new Scanner(input); + int num2 = sc2.nextInt(); + assertEquals(42, num2); + + // nextInt() leaves the newline character (\n) behind + String nextLineText2 = sc2.nextLine(); + assertEquals("", nextLineText2); + } + } \ No newline at end of file diff --git a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/scanner/ScanACharacterUnitTest.java b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/scanner/ScanACharacterUnitTest.java index 1a70c6e3af..340b58bbf6 100644 --- a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/scanner/ScanACharacterUnitTest.java +++ b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/scanner/ScanACharacterUnitTest.java @@ -1,38 +1,38 @@ -package com.baeldung.scanner; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.util.Scanner; - -import org.junit.jupiter.api.Test; - -public class ScanACharacterUnitTest { - - // given - input scanner source, no need to scan from console - String input = new StringBuilder().append("abc\n") - .append("mno\n") - .append("xyz\n") - .toString(); - - @Test - public void givenInputSource_whenScanCharUsingNext_thenOneCharIsRead() { - Scanner sc = new Scanner(input); - char c = sc.next().charAt(0); - assertEquals('a', c); - } - - @Test - public void givenInputSource_whenScanCharUsingFindInLine_thenOneCharIsRead() { - Scanner sc = new Scanner(input); - char c = sc.findInLine(".").charAt(0); - assertEquals('a', c); - } - - @Test - public void givenInputSource_whenScanCharUsingUseDelimiter_thenOneCharIsRead() { - Scanner sc = new Scanner(input); - char c = sc.useDelimiter("").next().charAt(0); - assertEquals('a', c); - } - -} +package com.baeldung.scanner; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Scanner; + +import org.junit.jupiter.api.Test; + +public class ScanACharacterUnitTest { + + // given - input scanner source, no need to scan from console + String input = new StringBuilder().append("abc\n") + .append("mno\n") + .append("xyz\n") + .toString(); + + @Test + public void givenInputSource_whenScanCharUsingNext_thenOneCharIsRead() { + Scanner sc = new Scanner(input); + char c = sc.next().charAt(0); + assertEquals('a', c); + } + + @Test + public void givenInputSource_whenScanCharUsingFindInLine_thenOneCharIsRead() { + Scanner sc = new Scanner(input); + char c = sc.findInLine(".").charAt(0); + assertEquals('a', c); + } + + @Test + public void givenInputSource_whenScanCharUsingUseDelimiter_thenOneCharIsRead() { + Scanner sc = new Scanner(input); + char c = sc.useDelimiter("").next().charAt(0); + assertEquals('a', c); + } + +} diff --git a/core-java-modules/core-java-io-apis-2/src/test/resources/sampleText1.txt b/core-java-modules/core-java-io-apis-2/src/test/resources/sampleText1.txt index 20aeba2bad..ea0584cfe0 100644 --- a/core-java-modules/core-java-io-apis-2/src/test/resources/sampleText1.txt +++ b/core-java-modules/core-java-io-apis-2/src/test/resources/sampleText1.txt @@ -1,3 +1,3 @@ -first line -second line -third line +first line +second line +third line From 1ff112228c48aa3ddd851d96cb7710e17a6d5354 Mon Sep 17 00:00:00 2001 From: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Date: Tue, 9 May 2023 12:55:49 +0300 Subject: [PATCH 097/141] JAVA-19152 Increased the awaitility timeout for one more poll delay (#13975) --- .../com/baeldung/concurrent/RequestProcessorUnitTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/RequestProcessorUnitTest.java b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/RequestProcessorUnitTest.java index eb1f6fada0..4a400f7beb 100644 --- a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/RequestProcessorUnitTest.java +++ b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/RequestProcessorUnitTest.java @@ -32,8 +32,8 @@ public class RequestProcessorUnitTest { String requestId = requestProcessor.processRequest(); Awaitility.await() - //The timeout value should be greater than the maximum time the request takes to complete - .atMost(2010, TimeUnit.MILLISECONDS) + //The timeout value should exceed the maximum time the request takes to complete, for the time amount of a poll (500 ms) + .atMost(2501, TimeUnit.MILLISECONDS) .pollDelay(500, TimeUnit.MILLISECONDS) .until(() -> requestProcessor.getStatus(requestId), not(equalTo("PROCESSING"))); From a36b4d88b75aee0f5884e13339c7835bd7353c6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Grzegorz=20Musia=C5=82?= Date: Wed, 10 May 2023 13:38:19 +0200 Subject: [PATCH 098/141] BAEL-6250: Example code for Get All Caffeine Cache Keys article (#13806) --- .../allkeys/config/AllKeysConfig.java | 25 +++++++++++ .../allkeys/service/SlowServiceWithCache.java | 11 +++++ .../boot/GetAllCacheKeysIntegrationTest.java | 44 +++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 spring-boot-modules/spring-caching/src/main/java/com/baeldung/allkeys/config/AllKeysConfig.java create mode 100644 spring-boot-modules/spring-caching/src/main/java/com/baeldung/allkeys/service/SlowServiceWithCache.java create mode 100644 spring-boot-modules/spring-caching/src/test/java/com/baeldung/caching/allkeys/boot/GetAllCacheKeysIntegrationTest.java diff --git a/spring-boot-modules/spring-caching/src/main/java/com/baeldung/allkeys/config/AllKeysConfig.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/allkeys/config/AllKeysConfig.java new file mode 100644 index 0000000000..723a782a6a --- /dev/null +++ b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/allkeys/config/AllKeysConfig.java @@ -0,0 +1,25 @@ +package com.baeldung.allkeys.config; + +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.caffeine.CaffeineCacheManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.baeldung.allkeys.service.SlowServiceWithCache; + +@Configuration +@EnableCaching +public class AllKeysConfig { + + @Bean + SlowServiceWithCache slowServiceWithCache() { + return new SlowServiceWithCache(); + } + + @Bean + CacheManager cacheManager() { + return new CaffeineCacheManager(); + } + +} diff --git a/spring-boot-modules/spring-caching/src/main/java/com/baeldung/allkeys/service/SlowServiceWithCache.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/allkeys/service/SlowServiceWithCache.java new file mode 100644 index 0000000000..74223c4231 --- /dev/null +++ b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/allkeys/service/SlowServiceWithCache.java @@ -0,0 +1,11 @@ +package com.baeldung.allkeys.service; + +import org.springframework.cache.annotation.CachePut; + +public class SlowServiceWithCache { + + @CachePut(cacheNames = "slowServiceCache", key = "#name") + public String save(String name, String details) { + return details; + } +} diff --git a/spring-boot-modules/spring-caching/src/test/java/com/baeldung/caching/allkeys/boot/GetAllCacheKeysIntegrationTest.java b/spring-boot-modules/spring-caching/src/test/java/com/baeldung/caching/allkeys/boot/GetAllCacheKeysIntegrationTest.java new file mode 100644 index 0000000000..2104eee8de --- /dev/null +++ b/spring-boot-modules/spring-caching/src/test/java/com/baeldung/caching/allkeys/boot/GetAllCacheKeysIntegrationTest.java @@ -0,0 +1,44 @@ +package com.baeldung.caching.allkeys.boot; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cache.CacheManager; +import org.springframework.cache.caffeine.CaffeineCache; +import org.springframework.cache.caffeine.CaffeineCacheManager; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.allkeys.config.AllKeysConfig; +import com.baeldung.allkeys.service.SlowServiceWithCache; +import com.github.benmanes.caffeine.cache.Cache; + +@RunWith(SpringRunner.class) +@SpringBootTest +@ContextConfiguration(classes = AllKeysConfig.class) +public class GetAllCacheKeysIntegrationTest { + + @Autowired + private SlowServiceWithCache slowServiceWithCache; + @Autowired + private CacheManager cacheManager; + + @Test + public void givenCaffeineCacheCachingSlowCalls_whenCacheManagerProperlyCasted_thenAllKeysAreAccessible() { + slowServiceWithCache.save("first", "some-value-first"); + slowServiceWithCache.save("second", "other-value-second"); + + Cache caffeine = getNativeCaffeineCacheForSlowService(); + + assertThat(caffeine.asMap().keySet()).containsOnly("first", "second"); + } + + private Cache getNativeCaffeineCacheForSlowService() { + CaffeineCacheManager caffeineCacheManager = (CaffeineCacheManager) cacheManager; + CaffeineCache cache = (CaffeineCache) caffeineCacheManager.getCache("slowServiceCache"); + return cache.getNativeCache(); + } +} \ No newline at end of file From c06e1ab413977ca03b370e04b70371f0871a5998 Mon Sep 17 00:00:00 2001 From: Kilian Schneider <48420258+Basler182@users.noreply.github.com> Date: Wed, 10 May 2023 16:39:34 +0200 Subject: [PATCH 099/141] BAEL-6185 reuse string builder performance (#13791) --- .../ReuseStringBuilderPerformance.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuilder/ReuseStringBuilderPerformance.java diff --git a/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuilder/ReuseStringBuilderPerformance.java b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuilder/ReuseStringBuilderPerformance.java new file mode 100644 index 0000000000..b403f859bc --- /dev/null +++ b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuilder/ReuseStringBuilderPerformance.java @@ -0,0 +1,55 @@ +package com.baeldung.stringbuilder; + +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.SingleShotTime) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@Measurement(batchSize = 100000, iterations = 10) +@Warmup(batchSize = 100000, iterations = 10) +@State(Scope.Thread) +public class ReuseStringBuilderPerformance { + + @Benchmark + public void benchmarkStringBuilder() { + for (int i = 0; i < 100; i++) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("baeldung"); + stringBuilder.toString(); + } + } + + @Benchmark + public void benchmarkStringBuilderReuseWithSetLength() { + StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < 100; i++) { + stringBuilder.append("baeldung"); + stringBuilder.toString(); + stringBuilder.setLength(0); + } + } + + @Benchmark() + public void benchmarkStringBuilderReuseWithDelete() { + StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < 100; i++) { + stringBuilder.append("baeldung"); + stringBuilder.toString(); + stringBuilder.delete(0, stringBuilder.length()); + } + } + + public static void main(String[] args) throws Exception { + Options options = new OptionsBuilder() + .include(ReuseStringBuilderPerformance.class.getSimpleName()).threads(1) + .forks(1).shouldFailOnError(true) + .shouldDoGC(true) + .jvmArgs("-server").build(); + new Runner(options).run(); + } + +} From b5fd6ce5c487ed84b7da6797c5b8e5f85f594df5 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Wed, 10 May 2023 17:13:28 +0200 Subject: [PATCH 100/141] BAEL-6444 | Removed copyright commit (#13987) --- .../baeldung/p6spy/SampleP6SpyApplication.java | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/SampleP6SpyApplication.java b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/SampleP6SpyApplication.java index 2be1255d72..000ffea9c9 100644 --- a/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/SampleP6SpyApplication.java +++ b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/p6spy/SampleP6SpyApplication.java @@ -1,19 +1,3 @@ -/* - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package com.baeldung.p6spy; import org.springframework.boot.SpringApplication; From 761eecbcd68898be3942f9d72a4d14475b8255c5 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Wed, 10 May 2023 22:56:59 +0530 Subject: [PATCH 101/141] JAVA-18648 Review the time of the build - Week 9 - 2023 (#13954) --- ...st.java => KeyVaultAutoconfiguredClientIntegrationTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-cloud-modules/spring-cloud-azure/src/test/java/com/baeldung/spring/cloud/azure/keyvault/{KeyVaultAutoconfiguredClientUnitTest.java => KeyVaultAutoconfiguredClientIntegrationTest.java} (93%) diff --git a/spring-cloud-modules/spring-cloud-azure/src/test/java/com/baeldung/spring/cloud/azure/keyvault/KeyVaultAutoconfiguredClientUnitTest.java b/spring-cloud-modules/spring-cloud-azure/src/test/java/com/baeldung/spring/cloud/azure/keyvault/KeyVaultAutoconfiguredClientIntegrationTest.java similarity index 93% rename from spring-cloud-modules/spring-cloud-azure/src/test/java/com/baeldung/spring/cloud/azure/keyvault/KeyVaultAutoconfiguredClientUnitTest.java rename to spring-cloud-modules/spring-cloud-azure/src/test/java/com/baeldung/spring/cloud/azure/keyvault/KeyVaultAutoconfiguredClientIntegrationTest.java index 0e3779e2c2..d480bc33d4 100644 --- a/spring-cloud-modules/spring-cloud-azure/src/test/java/com/baeldung/spring/cloud/azure/keyvault/KeyVaultAutoconfiguredClientUnitTest.java +++ b/spring-cloud-modules/spring-cloud-azure/src/test/java/com/baeldung/spring/cloud/azure/keyvault/KeyVaultAutoconfiguredClientIntegrationTest.java @@ -11,7 +11,7 @@ import org.springframework.boot.test.context.SpringBootTest; import com.baeldung.spring.cloud.azure.keyvault.service.KeyVaultAutoconfiguredClient; @SpringBootTest(classes = Application.class) -public class KeyVaultAutoconfiguredClientUnitTest { +public class KeyVaultAutoconfiguredClientIntegrationTest { @Autowired @Qualifier(value = "KeyVaultAutoconfiguredClient") From 386e3b28161e3848671d30286c2aad576e40ce39 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Wed, 10 May 2023 23:17:17 +0530 Subject: [PATCH 102/141] JAVA-20277 GitHub Issue: Regarding article Introduction to JsonPath (#13939) --- .../introduction/ServiceIntegrationTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/json-modules/json-path/src/test/java/com/baeldung/jsonpath/introduction/ServiceIntegrationTest.java b/json-modules/json-path/src/test/java/com/baeldung/jsonpath/introduction/ServiceIntegrationTest.java index 85e5d3e826..1a84fae3c4 100644 --- a/json-modules/json-path/src/test/java/com/baeldung/jsonpath/introduction/ServiceIntegrationTest.java +++ b/json-modules/json-path/src/test/java/com/baeldung/jsonpath/introduction/ServiceIntegrationTest.java @@ -1,9 +1,11 @@ package com.baeldung.jsonpath.introduction; import com.jayway.jsonpath.Configuration; +import com.jayway.jsonpath.Criteria; import com.jayway.jsonpath.DocumentContext; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.Option; +import com.jayway.jsonpath.Filter; import org.junit.Test; import java.io.InputStream; @@ -98,4 +100,14 @@ public class ServiceIntegrationTest { assertEquals("Spectre", title); } + + @Test + public void givenJsonPathWithFilterPredicate_whenReadingRootNode_thenCorrect() { + Filter expensiveFilter = Filter.filter(Criteria.where("director") + .contains("Sam Mendes")); + List> predicate = JsonPath.parse(jsonString) + .read("$[?]['director']", expensiveFilter); + assertEquals(predicate.size(), 2); + } + } \ No newline at end of file From b3b69272fad58705b48c5e40be99516a79d63531 Mon Sep 17 00:00:00 2001 From: cesarevalenti90 <50798547+cesarevalenti90@users.noreply.github.com> Date: Thu, 11 May 2023 00:09:10 +0200 Subject: [PATCH 103/141] BAEL-6197 - Execute Tests Based on Active Profile with JUnit 5 (#13776) * BAEL-6255 - Run a Spring Boot application in AWS Lambda * BAEL-6255 - Run a Spring Boot application in AWS Lambda * fix on template.yaml * fix on template.yaml * removed log from test * resolved issues reported on PR * BAEL-6277 - A Guide To Spring Cloud Azure First commit * BAEL-6277 - A Guide To Spring Cloud Azure Added to README.md the steps to create the secrets * BAEL-6277 - A Guide To Spring Cloud Azure Added the integration Azure Key Vault Properties * BAEL-6277 - A Guide To Spring Cloud Azure Added the integration Azure Key Vault Properties * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault Added one level package keyvault * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault removed target release version * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault fix compilation of NoSuchElementException * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault fix pom.xml * Revert "BAEL-6277 - A Guide To Spring Cloud Azure Key Vault" This reverts commit 1cca1d0d692646001a6d7de106f3a37fb22839ce. * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault fix pom.xml * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault downgrade version to fix jenkins pipeline error * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault comment run on main class * Revert "reset last commit" This reverts commit c557fad67f1c15bb384f0af5781430a45121a838. * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #First push * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault Revert for new pr * reset last commit * reset last commit * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #Remove redundant test * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #Format fix * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #fix from review * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #fix from review * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #fix test name --------- Co-authored-by: Cesare --- .../ActiveProfileApplication.java | 12 +++++++++ .../DevActiveProfileUnitTest.java | 18 +++++++++++++ .../MultipleActiveProfileUnitTest.java | 27 +++++++++++++++++++ .../ProdActiveProfileUnitTest.java | 23 ++++++++++++++++ .../TestActiveProfileUnitTest.java | 20 ++++++++++++++ .../src/test/resources/application-prod.yaml | 3 +++ .../src/test/resources/application-test.yaml | 3 +++ .../src/test/resources/application.yaml | 6 +++++ 8 files changed, 112 insertions(+) create mode 100644 testing-modules/spring-testing-2/src/main/java/com/baeldung/activeprofile/ActiveProfileApplication.java create mode 100644 testing-modules/spring-testing-2/src/test/java/com/baeldung/activeprofile/DevActiveProfileUnitTest.java create mode 100644 testing-modules/spring-testing-2/src/test/java/com/baeldung/activeprofile/MultipleActiveProfileUnitTest.java create mode 100644 testing-modules/spring-testing-2/src/test/java/com/baeldung/activeprofile/ProdActiveProfileUnitTest.java create mode 100644 testing-modules/spring-testing-2/src/test/java/com/baeldung/activeprofile/TestActiveProfileUnitTest.java create mode 100644 testing-modules/spring-testing-2/src/test/resources/application-prod.yaml create mode 100644 testing-modules/spring-testing-2/src/test/resources/application-test.yaml create mode 100644 testing-modules/spring-testing-2/src/test/resources/application.yaml diff --git a/testing-modules/spring-testing-2/src/main/java/com/baeldung/activeprofile/ActiveProfileApplication.java b/testing-modules/spring-testing-2/src/main/java/com/baeldung/activeprofile/ActiveProfileApplication.java new file mode 100644 index 0000000000..19fdff2a0c --- /dev/null +++ b/testing-modules/spring-testing-2/src/main/java/com/baeldung/activeprofile/ActiveProfileApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.activeprofile; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ActiveProfileApplication { + + public static void main(String[] args) { + SpringApplication.run(ActiveProfileApplication.class); + } +} diff --git a/testing-modules/spring-testing-2/src/test/java/com/baeldung/activeprofile/DevActiveProfileUnitTest.java b/testing-modules/spring-testing-2/src/test/java/com/baeldung/activeprofile/DevActiveProfileUnitTest.java new file mode 100644 index 0000000000..dcefddbc3c --- /dev/null +++ b/testing-modules/spring-testing-2/src/test/java/com/baeldung/activeprofile/DevActiveProfileUnitTest.java @@ -0,0 +1,18 @@ +package com.baeldung.activeprofile; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest(classes = ActiveProfileApplication.class) +public class DevActiveProfileUnitTest { + + @Value("${profile.property.value}") + private String propertyString; + + @Test + void whenDevIsActive_thenValueShouldBeKeptFromApplicationYaml() { + Assertions.assertEquals("This the the application.yaml file", propertyString); + } +} diff --git a/testing-modules/spring-testing-2/src/test/java/com/baeldung/activeprofile/MultipleActiveProfileUnitTest.java b/testing-modules/spring-testing-2/src/test/java/com/baeldung/activeprofile/MultipleActiveProfileUnitTest.java new file mode 100644 index 0000000000..f84d0e36b4 --- /dev/null +++ b/testing-modules/spring-testing-2/src/test/java/com/baeldung/activeprofile/MultipleActiveProfileUnitTest.java @@ -0,0 +1,27 @@ +package com.baeldung.activeprofile; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.core.env.Environment; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit.jupiter.EnabledIf; + +@SpringBootTest(classes = ActiveProfileApplication.class) +@EnabledIf(value = "#{{'test', 'prod'}.contains(environment.getActiveProfiles()[0])}", loadContext = true) +@ActiveProfiles(value = "test") +public class MultipleActiveProfileUnitTest { + @Value("${profile.property.value}") + private String propertyString; + + @Autowired + private Environment env; + + @Test + void whenDevIsActive_thenValueShouldBeKeptFromDedicatedApplicationYaml() { + String currentProfile = env.getActiveProfiles()[0]; + Assertions.assertEquals(String.format("This the the application-%s.yaml file", currentProfile), propertyString); + } +} diff --git a/testing-modules/spring-testing-2/src/test/java/com/baeldung/activeprofile/ProdActiveProfileUnitTest.java b/testing-modules/spring-testing-2/src/test/java/com/baeldung/activeprofile/ProdActiveProfileUnitTest.java new file mode 100644 index 0000000000..8427f23960 --- /dev/null +++ b/testing-modules/spring-testing-2/src/test/java/com/baeldung/activeprofile/ProdActiveProfileUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.activeprofile; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit.jupiter.EnabledIf; + +@SpringBootTest(classes = ActiveProfileApplication.class) +@EnabledIf(value = "#{environment.getActiveProfiles()[0] == 'prod'}", loadContext = true) +@ActiveProfiles(value = "prod") +public class ProdActiveProfileUnitTest { + + @Value("${profile.property.value}") + private String propertyString; + + @Test + void whenProdIsActive_thenValueShouldBeKeptFromApplicationProdYaml() { + Assertions.assertEquals("This the the application-prod.yaml file", propertyString); + } + +} diff --git a/testing-modules/spring-testing-2/src/test/java/com/baeldung/activeprofile/TestActiveProfileUnitTest.java b/testing-modules/spring-testing-2/src/test/java/com/baeldung/activeprofile/TestActiveProfileUnitTest.java new file mode 100644 index 0000000000..f17df37050 --- /dev/null +++ b/testing-modules/spring-testing-2/src/test/java/com/baeldung/activeprofile/TestActiveProfileUnitTest.java @@ -0,0 +1,20 @@ +package com.baeldung.activeprofile; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest(classes = ActiveProfileApplication.class) +@ActiveProfiles(value = "test") +public class TestActiveProfileUnitTest { + + @Value("${profile.property.value}") + private String propertyString; + + @Test + void whenTestIsActive_thenValueShouldBeKeptFromApplicationTestYaml() { + Assertions.assertEquals("This the the application-test.yaml file", propertyString); + } +} diff --git a/testing-modules/spring-testing-2/src/test/resources/application-prod.yaml b/testing-modules/spring-testing-2/src/test/resources/application-prod.yaml new file mode 100644 index 0000000000..98afa0421e --- /dev/null +++ b/testing-modules/spring-testing-2/src/test/resources/application-prod.yaml @@ -0,0 +1,3 @@ +profile: + property: + value: This the the application-prod.yaml file \ No newline at end of file diff --git a/testing-modules/spring-testing-2/src/test/resources/application-test.yaml b/testing-modules/spring-testing-2/src/test/resources/application-test.yaml new file mode 100644 index 0000000000..5f183a8d7e --- /dev/null +++ b/testing-modules/spring-testing-2/src/test/resources/application-test.yaml @@ -0,0 +1,3 @@ +profile: + property: + value: This the the application-test.yaml file \ No newline at end of file diff --git a/testing-modules/spring-testing-2/src/test/resources/application.yaml b/testing-modules/spring-testing-2/src/test/resources/application.yaml new file mode 100644 index 0000000000..cf63649116 --- /dev/null +++ b/testing-modules/spring-testing-2/src/test/resources/application.yaml @@ -0,0 +1,6 @@ +spring: + profiles: + active: dev +profile: + property: + value: This the the application.yaml file \ No newline at end of file From a74f4ec8f54bd8827e7afcecad2db86ea3c614f0 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Thu, 11 May 2023 03:29:50 +0200 Subject: [PATCH 104/141] [scanner-to-array] Saving Java Scanner Input to an Array (#13969) --- .../scanner/ScannerToArrayUnitTest.java | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/scanner/ScannerToArrayUnitTest.java diff --git a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/scanner/ScannerToArrayUnitTest.java b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/scanner/ScannerToArrayUnitTest.java new file mode 100644 index 0000000000..f64bd7b1fc --- /dev/null +++ b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/scanner/ScannerToArrayUnitTest.java @@ -0,0 +1,107 @@ +package com.baeldung.scanner; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +import org.junit.jupiter.api.Test; + +import com.google.common.collect.Lists; +import com.google.common.collect.ObjectArrays; + +public class ScannerToArrayUnitTest { + + @Test + void whenMultipleElementsInOneLine_thenGetExpectedArray() { + String input = "Java Kotlin Ruby Python Go\n"; + String[] expected = new String[] { "Java", "Kotlin", "Ruby", "Python", "Go" }; + + // scanner.next() + Scanner scanner1 = new Scanner(input); + String[] result1 = new String[5]; + int i = 0; + while (i < result1.length) { + result1[i] = scanner1.next(); + i++; + } + assertArrayEquals(expected, result1); + + //split() + Scanner scanner2 = new Scanner(input); + String[] result2 = scanner2.nextLine() + .split("\\s+"); + assertArrayEquals(expected, result2); + } + + @Test + void whenOneElementPerLine_thenGetExpectedArray() { + String input = new StringBuilder().append("Baeldung Java\n") + .append("Baeldung Kotlin\n") + .append("Baeldung Linux\n") + .toString(); + + String[] expected = new String[] { "Baeldung Java", "Baeldung Kotlin", "Baeldung Linux" }; + + String[] result = new String[3]; + Scanner scanner = new Scanner(input); + int i = 0; + while (i < result.length) { + result[i] = scanner.nextLine(); + i++; + } + assertArrayEquals(expected, result); + } + + @Test + void whenOneElementPerLine_thenGetExpectedList() { + String input = new StringBuilder().append("Baeldung Java\n") + .append("Baeldung Kotlin\n") + .append("Baeldung Linux\n") + .toString(); + + List expected = Lists.newArrayList("Baeldung Java", "Baeldung Kotlin", "Baeldung Linux"); + + List result = new ArrayList<>(); + Scanner scanner = new Scanner(input); + while (scanner.hasNextLine()) { + result.add(scanner.nextLine()); + } + assertEquals(expected, result); + } + + @Test + void whenEveryTokenIsAnElement_thenGetExpectedList() { + String input = new StringBuilder().append("Linux Windows MacOS\n") + .append("Java Kotlin Python Go\n") + .toString(); + + List expected = Lists.newArrayList("Linux", "Windows", "MacOS", "Java", "Kotlin", "Python", "Go"); + List result = new ArrayList<>(); + Scanner scanner = new Scanner(input); + while (scanner.hasNext()) { + result.add(scanner.next()); + } + assertEquals(expected, result); + } + + @Test + void whenEveryTokenIsAnElement_thenGetExpectedArray() { + String input = new StringBuilder().append("Linux Windows MacOS\n") + .append("Java Kotlin Python Go\n") + .toString(); + + String[] expected = new String[] { "Linux", "Windows", "MacOS", "Java", "Kotlin", "Python", "Go" }; + String[] result = new String[] {}; + + Scanner scanner = new Scanner(input); + while (scanner.hasNextLine()) { + String[] lineInArray = scanner.nextLine() + .split("\\s+"); + result = ObjectArrays.concat(result, lineInArray, String.class); + } + assertArrayEquals(expected, result); + } +} \ No newline at end of file From 4192bf3bdc6f9557bc8e593497fe5bb513536b88 Mon Sep 17 00:00:00 2001 From: brokenhardisk Date: Thu, 11 May 2023 05:53:11 +0200 Subject: [PATCH 105/141] BAEL-6342 JUnit Test Class for Null and Empty String (#13963) --- .../NullAndEmptyStringUnitTest.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/nullandempty/NullAndEmptyStringUnitTest.java diff --git a/core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/nullandempty/NullAndEmptyStringUnitTest.java b/core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/nullandempty/NullAndEmptyStringUnitTest.java new file mode 100644 index 0000000000..332a16fd84 --- /dev/null +++ b/core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/nullandempty/NullAndEmptyStringUnitTest.java @@ -0,0 +1,27 @@ +package com.baeldung.nullandempty; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertFalse; + +import org.junit.jupiter.api.Test; + +public class NullAndEmptyStringUnitTest { + + @Test + void givenANullAndEmptyString_whenUsingStringMethods_thenShouldGetExpectedResult() { + String nullString = null; + String emptyString = ""; + assertTrue(emptyString.equals("")); + assertThrows(NullPointerException.class, () -> nullString.length()); + } + + @Test + void givenANullAndEmptyString_whenCheckingEquality_thenShouldGetExpectedResult() { + String nullString = null; + String emptyString = ""; + assertFalse(emptyString.equals(nullString)); + assertFalse(emptyString == nullString); + } + +} From 167a3f53ed09464c79c070cff015d20016b80354 Mon Sep 17 00:00:00 2001 From: Kasra Madadipouya Date: Thu, 11 May 2023 07:35:28 +0200 Subject: [PATCH 106/141] JAVA-20630 upgrade maven war plugin to be compatible with JDK 11 and 17 (#13945) * JAVA-20630 upgrade maven war plugin to be compatible with JDK 11 and 17 * JAVA-20630 code format * JAVA-20630 don't fail if there's no web.xml and using Java based configuration while building a war file * JAVA-20630 avoid unneeded formatting * JAVA-20630 change order of modules to solve flaky tests --- jws/pom.xml | 2 +- maven-modules/dependency-exclusion/pom.xml | 2 +- pom.xml | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/jws/pom.xml b/jws/pom.xml index 8c14a16cff..2f01f90721 100644 --- a/jws/pom.xml +++ b/jws/pom.xml @@ -65,4 +65,4 @@ 3.0.2 - \ No newline at end of file + diff --git a/maven-modules/dependency-exclusion/pom.xml b/maven-modules/dependency-exclusion/pom.xml index 13de16a57c..1e0afe28b8 100644 --- a/maven-modules/dependency-exclusion/pom.xml +++ b/maven-modules/dependency-exclusion/pom.xml @@ -19,8 +19,8 @@ - dummy-surefire-junit47 core-java-exclusions + dummy-surefire-junit47 diff --git a/pom.xml b/pom.xml index 7bca64c424..483955fcee 100644 --- a/pom.xml +++ b/pom.xml @@ -222,6 +222,9 @@ maven-war-plugin ${maven-war-plugin.version} + + false + @@ -1258,7 +1261,7 @@ 2.6 3.12.0 1.5.0 - 3.0.0 + 3.3.2 4.0.1 1.2 2.3.3 From 93ae71ce9cf14742ce626439be9376d8646a01f4 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 11 May 2023 12:38:16 +0300 Subject: [PATCH 107/141] fix module order --- maven-modules/dependency-exclusion/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven-modules/dependency-exclusion/pom.xml b/maven-modules/dependency-exclusion/pom.xml index 1e0afe28b8..13de16a57c 100644 --- a/maven-modules/dependency-exclusion/pom.xml +++ b/maven-modules/dependency-exclusion/pom.xml @@ -19,8 +19,8 @@ - core-java-exclusions dummy-surefire-junit47 + core-java-exclusions From f3a6c36979f0d7edb6ab1045a70187e7e83e3491 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 11 May 2023 12:54:56 +0300 Subject: [PATCH 108/141] add dependent module --- .../dependency-exclusion/core-java-exclusions/pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/maven-modules/dependency-exclusion/core-java-exclusions/pom.xml b/maven-modules/dependency-exclusion/core-java-exclusions/pom.xml index 69701a2ead..4ca342cae6 100644 --- a/maven-modules/dependency-exclusion/core-java-exclusions/pom.xml +++ b/maven-modules/dependency-exclusion/core-java-exclusions/pom.xml @@ -19,6 +19,13 @@ junit test + + + org.apache.maven.surefire + surefire-junit47 + dummy + + From 30c76d83c92a5f906bc50b39c212197d60442017 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 11 May 2023 13:16:21 +0300 Subject: [PATCH 109/141] add parent --- .../dependency-exclusion/core-java-exclusions/pom.xml | 6 ------ .../dependency-exclusion/dummy-surefire-junit47/pom.xml | 6 ++++++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/maven-modules/dependency-exclusion/core-java-exclusions/pom.xml b/maven-modules/dependency-exclusion/core-java-exclusions/pom.xml index 4ca342cae6..9a652d7093 100644 --- a/maven-modules/dependency-exclusion/core-java-exclusions/pom.xml +++ b/maven-modules/dependency-exclusion/core-java-exclusions/pom.xml @@ -20,12 +20,6 @@ test - - org.apache.maven.surefire - surefire-junit47 - dummy - - diff --git a/maven-modules/dependency-exclusion/dummy-surefire-junit47/pom.xml b/maven-modules/dependency-exclusion/dummy-surefire-junit47/pom.xml index 7332d8deb1..93c5f7591f 100644 --- a/maven-modules/dependency-exclusion/dummy-surefire-junit47/pom.xml +++ b/maven-modules/dependency-exclusion/dummy-surefire-junit47/pom.xml @@ -6,4 +6,10 @@ org.apache.maven.surefire surefire-junit47 dummy + + + com.baeldung.dependency-exclusion + dependency-exclusion + 0.0.1-SNAPSHOT + From 70a53558b9a3c555e6878fe4b4f402d79c9e3ba3 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 11 May 2023 18:17:51 +0530 Subject: [PATCH 110/141] JAVA-20828 Fixing the core-java-exclusions module (#13997) --- .../dependency-exclusion/core-java-exclusions/pom.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/maven-modules/dependency-exclusion/core-java-exclusions/pom.xml b/maven-modules/dependency-exclusion/core-java-exclusions/pom.xml index 9a652d7093..9fd09f83e2 100644 --- a/maven-modules/dependency-exclusion/core-java-exclusions/pom.xml +++ b/maven-modules/dependency-exclusion/core-java-exclusions/pom.xml @@ -38,14 +38,15 @@ - + + + Deactivate JUnit 4.7 engine by overriding it with an empty dummy org.apache.maven.surefire surefire-junit47 dummy - + --> From c428c8316d45f0f5a2ef275e0cd9bf71ad8cc84c Mon Sep 17 00:00:00 2001 From: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Date: Thu, 11 May 2023 17:04:55 +0200 Subject: [PATCH 111/141] Upgrade spring.vault.core from 2.3.2 to 3.0.2 (#13977) --- pom.xml | 4 ++-- spring-vault/pom.xml | 3 ++- .../java/com/baeldung/springvault/VaultEnvironmentConfig.java | 4 ---- .../java/com/baeldung/springvault/SpringContextLiveTest.java | 1 - 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 483955fcee..445d3f3174 100644 --- a/pom.xml +++ b/pom.xml @@ -429,7 +429,6 @@ spring-spel spring-static-resources spring-swagger-codegen - spring-vault spring-web-modules spring-websockets static-analysis @@ -606,7 +605,6 @@ spring-spel spring-static-resources spring-swagger-codegen - spring-vault spring-web-modules spring-websockets static-analysis @@ -927,6 +925,7 @@ spring-state-machine spring-threads + spring-vault tensorflow-java xstream webrtc @@ -1179,6 +1178,7 @@ spring-state-machine spring-threads + spring-vault tensorflow-java xstream webrtc diff --git a/spring-vault/pom.xml b/spring-vault/pom.xml index faf4b33e08..7b89db2302 100644 --- a/spring-vault/pom.xml +++ b/spring-vault/pom.xml @@ -54,7 +54,8 @@ - 2.3.2 + 3.0.2 + 17 \ No newline at end of file diff --git a/spring-vault/src/main/java/com/baeldung/springvault/VaultEnvironmentConfig.java b/spring-vault/src/main/java/com/baeldung/springvault/VaultEnvironmentConfig.java index 4f5777e94c..91c1062131 100644 --- a/spring-vault/src/main/java/com/baeldung/springvault/VaultEnvironmentConfig.java +++ b/spring-vault/src/main/java/com/baeldung/springvault/VaultEnvironmentConfig.java @@ -3,10 +3,6 @@ package com.baeldung.springvault; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.PropertySource; -import org.springframework.vault.authentication.ClientAuthentication; -import org.springframework.vault.authentication.TokenAuthentication; -import org.springframework.vault.client.VaultEndpoint; -import org.springframework.vault.config.AbstractVaultConfiguration; import org.springframework.vault.config.EnvironmentVaultConfiguration; /** diff --git a/spring-vault/src/test/java/com/baeldung/springvault/SpringContextLiveTest.java b/spring-vault/src/test/java/com/baeldung/springvault/SpringContextLiveTest.java index 6e2a61ca40..4b7a4e2c1c 100644 --- a/spring-vault/src/test/java/com/baeldung/springvault/SpringContextLiveTest.java +++ b/spring-vault/src/test/java/com/baeldung/springvault/SpringContextLiveTest.java @@ -1,6 +1,5 @@ package com.baeldung.springvault; -import com.baeldung.springvault.SpringVaultApplication; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; From b22707d69e9b681d474d1df03888a4eeb43f625a Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 11 May 2023 23:33:10 +0800 Subject: [PATCH 112/141] Update README.md [skip ci] --- core-java-modules/core-java-concurrency-basic-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-concurrency-basic-3/README.md b/core-java-modules/core-java-concurrency-basic-3/README.md index 46480c6b01..da148599b0 100644 --- a/core-java-modules/core-java-concurrency-basic-3/README.md +++ b/core-java-modules/core-java-concurrency-basic-3/README.md @@ -6,4 +6,5 @@ This module contains articles about basic Java concurrency. - [How to Handle InterruptedException in Java](https://www.baeldung.com/java-interrupted-exception) - [Thread.sleep() vs Awaitility.await()](https://www.baeldung.com/java-thread-sleep-vs-awaitility-await) +- [Is CompletableFuture Non-blocking?](https://www.baeldung.com/java-completablefuture-non-blocking) - [[<-- Prev]](../core-java-concurrency-basic-2) From 52e8c27f86e9f84779b7fb5a6ef8c33b4362779b Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 11 May 2023 23:39:19 +0800 Subject: [PATCH 113/141] Update README.md [skip ci] --- spring-boot-modules/spring-boot-cli/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-cli/README.md b/spring-boot-modules/spring-boot-cli/README.md index 79e259c855..4ed50d3f56 100644 --- a/spring-boot-modules/spring-boot-cli/README.md +++ b/spring-boot-modules/spring-boot-cli/README.md @@ -4,3 +4,4 @@ This module contains articles about Spring Boot CLI ### Relevant Articles: - [Introduction to Spring Boot CLI](https://www.baeldung.com/spring-boot-cli) +- [Encode Passwords With Spring Boot CLI](https://www.baeldung.com/spring-boot-cli-encode-passwords) From 03cc9c90b7c515264f9af93e425675404f4184e0 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 11 May 2023 23:42:17 +0800 Subject: [PATCH 114/141] Update README.md [skip ci] --- core-java-modules/core-java-string-operations-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-operations-5/README.md b/core-java-modules/core-java-string-operations-5/README.md index 70a4f5607e..dffd3c1ab6 100644 --- a/core-java-modules/core-java-string-operations-5/README.md +++ b/core-java-modules/core-java-string-operations-5/README.md @@ -10,3 +10,4 @@ - [Guide to Splitting a String by Whitespace in Java](https://www.baeldung.com/java-splitting-a-string-by-whitespace) - [Check if the First Letter of a String Is a Number](https://www.baeldung.com/java-check-if-string-starts-with-number) - [Print “” Quotes Around a String in Java](https://www.baeldung.com/java-string-print-quotes) +- [Remove Punctuation From a String in Java](https://www.baeldung.com/java-remove-punctuation-from-string) From e796547df369ca29d99c1ee1ee53409f20ce546f Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 11 May 2023 23:44:54 +0800 Subject: [PATCH 115/141] Update README.md [skip ci] --- apache-kafka-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apache-kafka-2/README.md b/apache-kafka-2/README.md index ec9e8e2adc..157078f023 100644 --- a/apache-kafka-2/README.md +++ b/apache-kafka-2/README.md @@ -7,3 +7,4 @@ You can build the project from the command line using: *mvn clean install*, or i ### Relevant Articles: - [Guide to Check if Apache Kafka Server Is Running](https://www.baeldung.com/apache-kafka-check-server-is-running) +- [Add Custom Headers to a Kafka Message](https://www.baeldung.com/java-kafka-custom-headers) From 68af213dfec62ca45a2357524ffb8b783711991c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 11 May 2023 23:47:20 +0800 Subject: [PATCH 116/141] Update README.md [skip ci] --- persistence-modules/hibernate-mapping-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/hibernate-mapping-2/README.md b/persistence-modules/hibernate-mapping-2/README.md index 4fba6691cf..36c9f8c304 100644 --- a/persistence-modules/hibernate-mapping-2/README.md +++ b/persistence-modules/hibernate-mapping-2/README.md @@ -6,3 +6,4 @@ This module contains articles about Hibernate Mappings. - [Hibernate Many to Many Annotation Tutorial](https://www.baeldung.com/hibernate-many-to-many) - [Boolean Converters in Hibernate 6](https://www.baeldung.com/java-hibernate-6-boolean-converters) +- [Generate UUIDs as Primary Keys With Hibernate](https://www.baeldung.com/java-hibernate-uuid-primary-key) From 7eba847b93a0c40493ddb743684353767549deaa Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 11 May 2023 23:50:18 +0800 Subject: [PATCH 117/141] Update README.md [skip ci] --- persistence-modules/spring-boot-persistence-h2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-boot-persistence-h2/README.md b/persistence-modules/spring-boot-persistence-h2/README.md index 1d47907a98..7f6e243677 100644 --- a/persistence-modules/spring-boot-persistence-h2/README.md +++ b/persistence-modules/spring-boot-persistence-h2/README.md @@ -5,3 +5,4 @@ - [Hibernate @NotNull vs @Column(nullable = false)](https://www.baeldung.com/hibernate-notnull-vs-nullable) - [Quick Guide to Hibernate enable_lazy_load_no_trans Property](https://www.baeldung.com/hibernate-lazy-loading-workaround) - [Where Does H2’s Embedded Database Store The Data?](https://www.baeldung.com/h2-embedded-db-data-storage) +- [Spring Boot H2 JdbcSQLSyntaxErrorException expected “identifier”](https://www.baeldung.com/spring-boot-h2-jdbcsqlsyntaxerrorexception-expected-identifier) From 2556be758db7a1939a874a197eacd83d69b05dc4 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 11 May 2023 23:52:22 +0800 Subject: [PATCH 118/141] Update README.md [skip ci] --- core-java-modules/core-java-arrays-operations-basic/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-arrays-operations-basic/README.md b/core-java-modules/core-java-arrays-operations-basic/README.md index eed64c0cae..76f4044355 100644 --- a/core-java-modules/core-java-arrays-operations-basic/README.md +++ b/core-java-modules/core-java-arrays-operations-basic/README.md @@ -12,3 +12,4 @@ This module contains articles about Java array fundamentals. They assume no prev - [Extending an Array’s Length](https://www.baeldung.com/java-array-add-element-at-the-end) - [Initializing a Boolean Array in Java](https://www.baeldung.com/java-initializing-boolean-array) - [Find the Index of an Element in a Java Array](https://www.baeldung.com/java-array-find-index) +- [Comparing Two Byte Arrays in Java](https://www.baeldung.com/java-comparing-byte-arrays) From 4d1d7e01bfd3d70c968e7d83db4682939326e3da Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 11 May 2023 23:54:53 +0800 Subject: [PATCH 119/141] Update README.md [skip ci] --- testing-modules/selenium-webdriver/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/testing-modules/selenium-webdriver/README.md b/testing-modules/selenium-webdriver/README.md index 7d843af9ea..055144998e 100644 --- a/testing-modules/selenium-webdriver/README.md +++ b/testing-modules/selenium-webdriver/README.md @@ -1 +1,2 @@ ### Relevant Articles: +- [Uploading File Using Selenium Webdriver in Java](https://www.baeldung.com/java-selenium-upload-file) From ed85cba5ba8a758f20f2bea3c197e57694fec136 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 11 May 2023 23:57:08 +0800 Subject: [PATCH 120/141] Update README.md [skip ci] --- lombok-modules/lombok-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/lombok-modules/lombok-2/README.md b/lombok-modules/lombok-2/README.md index 9aaff32315..fcee23fc82 100644 --- a/lombok-modules/lombok-2/README.md +++ b/lombok-modules/lombok-2/README.md @@ -11,4 +11,5 @@ This module contains articles about Project Lombok. - [Jackson’s Deserialization With Lombok](https://www.baeldung.com/java-jackson-deserialization-lombok) - [Constructor Injection in Spring with Lombok](https://www.baeldung.com/spring-injection-lombok) - [@StandardException Annotation in Lombok](https://www.baeldung.com/lombok-standardexception-annotation) +- [Lombok EqualsAndHashCode Annotation](https://www.baeldung.com/java-lombok-equalsandhashcode) - More articles: [[<-- prev]](../lombok) From 035717faa71f8cba01a96c780f85437a0c533867 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 11 May 2023 23:59:08 +0800 Subject: [PATCH 121/141] Update README.md [skip ci] --- core-java-modules/core-java-io-apis-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-io-apis-2/README.md b/core-java-modules/core-java-io-apis-2/README.md index 031ff3c7fc..1633dc4828 100644 --- a/core-java-modules/core-java-io-apis-2/README.md +++ b/core-java-modules/core-java-io-apis-2/README.md @@ -7,3 +7,4 @@ This module contains articles about core Java input/output(IO) APIs. - [Java Scanner Taking a Character Input](https://www.baeldung.com/java-scanner-character-input) - [Get the Desktop Path in Java](https://www.baeldung.com/java-desktop-path) - [Integer.parseInt(scanner.nextLine()) and scanner.nextInt() in Java](https://www.baeldung.com/java-scanner-integer) +- [Difference Between FileReader and BufferedReader in Java](https://www.baeldung.com/java-filereader-vs-bufferedreader) From aba6f36ac74cbc6fc4ec3a4e8f5ad298c7ab17f1 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 12 May 2023 00:01:07 +0800 Subject: [PATCH 122/141] Create README.md [skip ci] --- core-java-modules/core-java-records/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 core-java-modules/core-java-records/README.md diff --git a/core-java-modules/core-java-records/README.md b/core-java-modules/core-java-records/README.md new file mode 100644 index 0000000000..2e7ad00cd3 --- /dev/null +++ b/core-java-modules/core-java-records/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Overridding hashCode() And equals() For Records](https://www.baeldung.com/java-override-hashcode-equals-records) From 11ecd39504d216a94f6f87325a4bc0e670934d0b Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 12 May 2023 00:02:53 +0800 Subject: [PATCH 123/141] Update README.md [skip ci] --- core-java-modules/core-java-string-operations-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-operations-5/README.md b/core-java-modules/core-java-string-operations-5/README.md index dffd3c1ab6..3a09c8a585 100644 --- a/core-java-modules/core-java-string-operations-5/README.md +++ b/core-java-modules/core-java-string-operations-5/README.md @@ -11,3 +11,4 @@ - [Check if the First Letter of a String Is a Number](https://www.baeldung.com/java-check-if-string-starts-with-number) - [Print “” Quotes Around a String in Java](https://www.baeldung.com/java-string-print-quotes) - [Remove Punctuation From a String in Java](https://www.baeldung.com/java-remove-punctuation-from-string) +- [Find the Longest Word in a Given String in Java](https://www.baeldung.com/java-longest-word-string) From 1bf1ad2a3afbfed6b0ebeb79fad96cb95047ffca Mon Sep 17 00:00:00 2001 From: Bahaa El-Din Helmy Date: Thu, 11 May 2023 19:18:45 +0300 Subject: [PATCH 124/141] Title: Regular Expression: \z vs \Z Anchors in Java (#13994) Hello, This commit related to the article entitled "Regular Expression: \z vs \Z Anchors in Java" --- .../z_regexp/ZRegularExpressionUnitTest.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 core-java-modules/core-java-regex-2/src/test/java/com/baeldung/regex/z_regexp/ZRegularExpressionUnitTest.java diff --git a/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/regex/z_regexp/ZRegularExpressionUnitTest.java b/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/regex/z_regexp/ZRegularExpressionUnitTest.java new file mode 100644 index 0000000000..90bbbb6540 --- /dev/null +++ b/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/regex/z_regexp/ZRegularExpressionUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.regex.z_regexp; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ZRegularExpressionUnitTest { + @Test + public void givenCreditCardNumber_thenReturnIfMatched() { + String creditCardNumber = "1234567890123456"; + String pattern = "\\d{16}\\z"; + Assertions.assertTrue(creditCardNumber.matches(pattern)); + } + + @Test + public void givenLogOutput_thenReturnIfMatched() { + String logLine = "2022-05-01 14:30:00,123 INFO Some log message"; + String pattern = ".*message\\z"; + Assertions.assertTrue(logLine.matches(pattern)); + } + + @Test + public void givenEmailMessage_thenReturnIfMatched() { + String myMessage = "Hello HR, I hope i can write to Baeldung\n"; + String pattern = ".*Baeldung\\s*\\Z"; + Assertions.assertTrue(myMessage.matches(pattern)); + } + + @Test + public void givenFileExtension_thenReturnIfMatched() { + String fileName = "image.jpeg"; + String pattern = ".*\\.jpeg\\Z"; + Assertions.assertTrue(fileName.matches(pattern)); + } + +} From dbf40dc272f2a6a517a24b9068843cb424f53342 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Fri, 12 May 2023 15:27:42 +0530 Subject: [PATCH 125/141] JAVA-20828: Changes made for updating blade module to java 11 (#13929) * JAVA-20828: Changes made for updating blade module to java 11 * JAVA-20828: Changes made for updating bootique,dropwizard,google-web-toolkit module to java 11 * JAVA-20828: Changes made for updating bootique,dropwizard,google-web-toolkit module to java 11 * JAVA-20828: Adding jakarta-ee to jdk-9 profile --- pom.xml | 10 ++++++++++ web-modules/jakarta-ee/pom.xml | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 445d3f3174..060f3a0738 100644 --- a/pom.xml +++ b/pom.xml @@ -937,6 +937,11 @@ vaadin libraries-3 web-modules/apache-tapestry + web-modules/blade + web-modules/bootique + web-modules/dropwizard + web-modules/google-web-toolkit + web-modules/jakarta-ee @@ -1190,6 +1195,11 @@ vaadin libraries-3 web-modules/apache-tapestry + web-modules/blade + web-modules/bootique + web-modules/dropwizard + web-modules/google-web-toolkit + web-modules/google-jakarta-ee diff --git a/web-modules/jakarta-ee/pom.xml b/web-modules/jakarta-ee/pom.xml index 82993103c8..066bc14766 100644 --- a/web-modules/jakarta-ee/pom.xml +++ b/web-modules/jakarta-ee/pom.xml @@ -78,8 +78,8 @@ maven-compiler-plugin 3.8.0 - 1.8 - 1.8 + 11 + 11 From 000149dd337140dd12e6ae81ce3df685b1ecc488 Mon Sep 17 00:00:00 2001 From: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Date: Fri, 12 May 2023 16:07:21 +0300 Subject: [PATCH 126/141] JAVA-20610 Upgraded parent-boot-2 to 2.7.11 (#13944) --- parent-boot-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parent-boot-2/pom.xml b/parent-boot-2/pom.xml index a1f16c4a64..3f6ad8ef8a 100644 --- a/parent-boot-2/pom.xml +++ b/parent-boot-2/pom.xml @@ -94,7 +94,7 @@ 3.3.0 1.0.22.RELEASE - 2.7.8 + 2.7.11 1.9.1 8.0.31 From e7d1d56c47c10868d90a98255928f620b696b4c0 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Fri, 12 May 2023 16:36:06 +0300 Subject: [PATCH 127/141] JAVA-20163 Upgrade hibernate specific modules to JDK 11 (#13817) * JAVA-20163 Migration hibernate-annotations * JAVA-20163 Migrate hibernate-queries * JAVA-20163 Migrating hibernate-mapping * JAVA-20163 rename reserved keywords, update inheritance example * JAVA-20163 Migrate hibernate-ogm module to the jdk 8 because hibernate-ogm doesn't support jakarta API * JAVA-20163 Migrate hibernate-enterprise module * JAVA-20163 Add update to HibernateExceptionUnitTest#whenQueryExecutedWithUnmappedEntity_thenMappingException * JAVA-20163 Set explicit version for hibernate 6.1.7.Final in the hibernate-queries module * JAVA-20163 Fix failed test with port that already exists (giving another port 8088) * JAVA-20163 Fix other location after changing the port * JAVA-20163 Remove duplicate Unit Test --------- Co-authored-by: n Co-authored-by: Loredana Crusoveanu --- .../hibernate-annotations/pom.xml | 11 +- .../creationupdatetimestamp/model/Book.java | 6 +- .../hibernate/customtypes/AddressType.java | 142 ++++++++---------- .../LocalDateStringJavaDescriptor.java | 18 +-- .../customtypes/LocalDateStringType.java | 16 +- .../hibernate/customtypes/OfficeEmployee.java | 54 ++++--- .../hibernate/customtypes/PhoneNumber.java | 8 +- .../customtypes/PhoneNumberType.java | 49 +++--- .../hibernate/customtypes/SalaryType.java | 112 ++++++-------- .../hibernate/immutable/entities/Event.java | 2 +- .../immutable/entities/EventGeneratedId.java | 2 +- .../baeldung/hibernate/joincolumn/Email.java | 14 +- .../baeldung/hibernate/joincolumn/Office.java | 16 +- .../hibernate/joincolumn/OfficeAddress.java | 10 +- .../joincolumn/OfficialEmployee.java | 12 +- .../lazycollection/model/Branch.java | 12 +- .../lazycollection/model/Employee.java | 11 +- .../config/HibernateAnnotationUtil.java | 4 +- .../hibernate/oneToMany/model/Cart.java | 14 +- .../hibernate/oneToMany/model/CartOIO.java | 14 +- .../hibernate/oneToMany/model/Item.java | 16 +- .../hibernate/oneToMany/model/ItemOIO.java | 14 +- .../com/baeldung/hibernate/pojo/Phone.java | 8 +- .../hibernate/wherejointable/Group.java | 8 +- .../hibernate/wherejointable/User.java | 12 +- .../wherejointable/UserGroupRelation.java | 10 +- .../main/resources/META-INF/persistence.xml | 10 +- ...reationUpdateTimestampIntegrationTest.java | 14 +- .../HibernateCustomTypesIntegrationTest.java | 9 +- .../HibernateImmutableIntegrationTest.java | 2 +- .../joincolumn/JoinColumnIntegrationTest.java | 4 +- .../hibernate-enterprise/pom.xml | 7 +- .../hibernate/exception/EntityWithNoId.java | 2 +- .../baeldung/hibernate/exception/Product.java | 8 +- .../hibernate/exception/ProductEntity.java | 6 +- .../hibernate/exception/ProductNotMapped.java | 32 ++++ .../baeldung/hibernate/logging/Employee.java | 8 +- .../baeldung/hibernate/pojo/PointEntity.java | 10 +- .../hibernate/pojo/PolygonEntity.java | 8 +- .../com/baeldung/hibernate/pojo/Student.java | 8 +- .../baeldung/persistence/model/Person.java | 6 +- .../main/resources/META-INF/persistence.xml | 10 +- .../HibernateSpatialIntegrationTest.java | 22 ++- .../exception/HibernateExceptionUnitTest.java | 48 +++--- .../baeldung/hibernate/multitenancy/Car.java | 6 +- .../MultitenancyIntegrationTest.java | 4 +- ...seApproachMultitenancyIntegrationTest.java | 4 +- .../MapMultiTenantConnectionProvider.java | 7 +- .../SchemaMultiTenantConnectionProvider.java | 9 +- .../save/SaveMethodsIntegrationTest.java | 2 +- .../resources/hibernate-exception.properties | 2 - .../resources/hibernate-spatial.properties | 2 +- persistence-modules/hibernate-mapping/pom.xml | 31 ++-- .../com/baeldung/hibernate/HibernateUtil.java | 3 +- .../arraymapping/CustomIntegerArrayType.java | 57 ++++--- .../arraymapping/CustomStringArrayType.java | 57 ++++--- .../baeldung/hibernate/arraymapping/User.java | 20 +-- .../hibernate/basicannotation/Course.java | 9 +- .../hibernate/entities/Department.java | 2 +- .../hibernate/entities/DeptEmployee.java | 12 +- .../hibernate/fetchMode/Customer.java | 8 +- .../baeldung/hibernate/fetchMode/Order.java | 2 +- .../baeldung/hibernate/lob/model/User.java | 12 +- .../hibernate/persistmaps/mapkey/Item.java | 18 +-- .../hibernate/persistmaps/mapkey/Order.java | 20 +-- .../hibernate/persistmaps/mapkey/User.java | 13 +- .../persistmaps/mapkeycolumn/Order.java | 18 +-- .../persistmaps/mapkeyenumerated/Order.java | 22 +-- .../persistmaps/mapkeyjoincolumn/Item.java | 24 +-- .../persistmaps/mapkeyjoincolumn/Order.java | 20 +-- .../persistmaps/mapkeyjoincolumn/Seller.java | 10 +- .../persistmaps/mapkeytemporal/Order.java | 22 +-- .../com/baeldung/hibernate/pojo/Employee.java | 6 +- .../hibernate/pojo/EntityDescription.java | 15 +- .../com/baeldung/hibernate/pojo/Phone.java | 8 +- .../hibernate/pojo/TemporalValues.java | 11 +- .../hibernate/pojo/inheritance/Animal.java | 8 +- .../hibernate/pojo/inheritance/Bag.java | 4 +- .../hibernate/pojo/inheritance/Book.java | 4 +- .../hibernate/pojo/inheritance/Car.java | 2 +- .../hibernate/pojo/inheritance/Laptop.java | 39 +++++ .../pojo/inheritance/MyEmployee.java | 2 +- .../hibernate/pojo/inheritance/MyProduct.java | 14 +- .../hibernate/pojo/inheritance/Pen.java | 4 +- .../hibernate/pojo/inheritance/Person.java | 4 +- .../hibernate/pojo/inheritance/Pet.java | 4 +- .../hibernate/pojo/inheritance/Vehicle.java | 8 +- .../baeldung/hibernate/pojo/package-info.java | 9 -- .../DynamicMappingIntegrationTest.java | 4 +- .../InheritanceMappingIntegrationTest.java | 6 +- .../BasicAnnotationIntegrationTest.java | 2 +- .../UserAdditionalValidationUnitTest.java | 11 +- .../validation/UserValidationUnitTest.java | 10 +- persistence-modules/hibernate-queries/pom.xml | 14 +- .../hibernate/criteria/model/Employee.java | 2 +- .../criteria/view/ApplicationView.java | 8 +- .../view/EmployeeCriteriaQueries.java | 6 +- .../hibernate/criteriaquery/Student.java | 12 +- .../LocalDateStringJavaDescriptor.java | 25 +-- .../customtypes/LocalDateStringType.java | 16 +- .../hibernate/distinct/entities/Comment.java | 8 +- .../hibernate/distinct/entities/Post.java | 11 +- .../hibernate/entities/Department.java | 2 +- .../hibernate/entities/DeptEmployee.java | 12 +- .../baeldung/hibernate/findall/FindAll.java | 8 +- .../hibernate/keywords/BrokenPhoneOrder.java | 8 +- .../hibernate/keywords/PhoneOrder.java | 8 +- .../com/baeldung/hibernate/pojo/Student.java | 8 +- .../main/resources/META-INF/persistence.xml | 10 +- .../HibernateCriteriaIntegrationTest.java | 8 +- .../TypeSafeCriteriaIntegrationTest.java | 7 +- .../entities/DistinctHqlQueriesUnitTest.java | 7 +- persistence-modules/pom.xml | 11 +- pom.xml | 2 + .../client/ProductClient.java | 2 +- .../client/ProductClientUnitTest.java | 4 +- .../controller/ProductControllerUnitTest.java | 4 +- 117 files changed, 816 insertions(+), 787 deletions(-) create mode 100644 persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/ProductNotMapped.java create mode 100644 persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Laptop.java delete mode 100644 persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/package-info.java diff --git a/persistence-modules/hibernate-annotations/pom.xml b/persistence-modules/hibernate-annotations/pom.xml index 310b409a00..6417421fed 100644 --- a/persistence-modules/hibernate-annotations/pom.xml +++ b/persistence-modules/hibernate-annotations/pom.xml @@ -76,13 +76,18 @@ ${org.springframework.version} test + + io.hypersistence + hypersistence-utils-hibernate-60 + 3.3.1 + - 5.0.2.RELEASE - 1.10.6.RELEASE - 5.6.7.Final + 6.0.6 + 3.0.3 + 6.1.7.Final true 9.0.0.M26 diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/creationupdatetimestamp/model/Book.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/creationupdatetimestamp/model/Book.java index 0677b46690..0484c31ced 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/creationupdatetimestamp/model/Book.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/creationupdatetimestamp/model/Book.java @@ -2,9 +2,9 @@ package com.baeldung.hibernate.creationupdatetimestamp.model; import java.time.Instant; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java index c10c67df9a..f50d8fd7cc 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java @@ -1,11 +1,11 @@ package com.baeldung.hibernate.customtypes; import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.type.IntegerType; -import org.hibernate.type.StringType; -import org.hibernate.type.Type; +import org.hibernate.metamodel.spi.ValueAccess; import org.hibernate.usertype.CompositeUserType; +import org.hibernate.usertype.UserType; import java.io.Serializable; import java.sql.PreparedStatement; @@ -14,74 +14,51 @@ import java.sql.SQLException; import java.sql.Types; import java.util.Objects; -public class AddressType implements CompositeUserType { +public class AddressType implements CompositeUserType

, UserType
{ @Override - public String[] getPropertyNames() { - return new String[]{"addressLine1", "addressLine2", - "city", "country", "zipcode"}; - } - - @Override - public Type[] getPropertyTypes() { - return new Type[]{StringType.INSTANCE, StringType.INSTANCE, - StringType.INSTANCE, StringType.INSTANCE, IntegerType.INSTANCE}; - } - - @Override - public Object getPropertyValue(Object component, int property) throws HibernateException { - - Address empAdd = (Address) component; + public Object getPropertyValue(Address component, int property) throws HibernateException { switch (property) { case 0: - return empAdd.getAddressLine1(); + return component.getAddressLine1(); case 1: - return empAdd.getAddressLine2(); + return component.getAddressLine2(); case 2: - return empAdd.getCity(); + return component.getCity(); case 3: - return empAdd.getCountry(); + return component.getCountry(); case 4: - return Integer.valueOf(empAdd.getZipCode()); + return component.getZipCode(); + default: + throw new IllegalArgumentException(property + + " is an invalid property index for class type " + + component.getClass().getName()); } - - throw new IllegalArgumentException(property + - " is an invalid property index for class type " + - component.getClass().getName()); } @Override - public void setPropertyValue(Object component, int property, Object value) throws HibernateException { - - Address empAdd = (Address) component; - - switch (property) { - case 0: - empAdd.setAddressLine1((String) value); - case 1: - empAdd.setAddressLine2((String) value); - case 2: - empAdd.setCity((String) value); - case 3: - empAdd.setCountry((String) value); - case 4: - empAdd.setZipCode((Integer) value); - } - - throw new IllegalArgumentException(property + - " is an invalid property index for class type " + - component.getClass().getName()); - + public Address instantiate(ValueAccess values, SessionFactoryImplementor sessionFactory) { + return null; } @Override - public Class returnedClass() { + public Class embeddable() { return Address.class; } @Override - public boolean equals(Object x, Object y) throws HibernateException { + public int getSqlType() { + return Types.VARCHAR; + } + + @Override + public Class
returnedClass() { + return Address.class; + } + + @Override + public boolean equals(Address x, Address y) { if (x == y) return true; @@ -92,57 +69,52 @@ public class AddressType implements CompositeUserType { } @Override - public int hashCode(Object x) throws HibernateException { + public int hashCode(Address x) { return x.hashCode(); } @Override - public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException { - + public Address nullSafeGet(ResultSet rs, int position, SharedSessionContractImplementor session, Object owner) throws SQLException { Address empAdd = new Address(); - empAdd.setAddressLine1(rs.getString(names[0])); + empAdd.setAddressLine1(rs.getString(position)); if (rs.wasNull()) return null; - empAdd.setAddressLine2(rs.getString(names[1])); - empAdd.setCity(rs.getString(names[2])); - empAdd.setCountry(rs.getString(names[3])); - empAdd.setZipCode(rs.getInt(names[4])); + empAdd.setAddressLine2(rs.getString(position)); + empAdd.setCity(rs.getString(position)); + empAdd.setCountry(rs.getString(position)); + empAdd.setZipCode(rs.getInt(position)); return empAdd; } @Override - public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException { - + public void nullSafeSet(PreparedStatement st, Address value, int index, SharedSessionContractImplementor session) throws SQLException { if (Objects.isNull(value)) st.setNull(index, Types.VARCHAR); else { - Address empAdd = (Address) value; - st.setString(index, empAdd.getAddressLine1()); - st.setString(index + 1, empAdd.getAddressLine2()); - st.setString(index + 2, empAdd.getCity()); - st.setString(index + 3, empAdd.getCountry()); - st.setInt(index + 4, empAdd.getZipCode()); + st.setString(index, value.getAddressLine1()); + st.setString(index + 1, value.getAddressLine2()); + st.setString(index + 2, value.getCity()); + st.setString(index + 3, value.getCountry()); + st.setInt(index + 4, value.getZipCode()); } } @Override - public Object deepCopy(Object value) throws HibernateException { - + public Address deepCopy(Address value) { if (Objects.isNull(value)) return null; - Address oldEmpAdd = (Address) value; Address newEmpAdd = new Address(); - newEmpAdd.setAddressLine1(oldEmpAdd.getAddressLine1()); - newEmpAdd.setAddressLine2(oldEmpAdd.getAddressLine2()); - newEmpAdd.setCity(oldEmpAdd.getCity()); - newEmpAdd.setCountry(oldEmpAdd.getCountry()); - newEmpAdd.setZipCode(oldEmpAdd.getZipCode()); + newEmpAdd.setAddressLine1(value.getAddressLine1()); + newEmpAdd.setAddressLine2(value.getAddressLine2()); + newEmpAdd.setCity(value.getCity()); + newEmpAdd.setCountry(value.getCountry()); + newEmpAdd.setZipCode(value.getZipCode()); return newEmpAdd; } @@ -153,17 +125,27 @@ public class AddressType implements CompositeUserType { } @Override - public Serializable disassemble(Object value, SharedSessionContractImplementor session) throws HibernateException { + public Serializable disassemble(Address value) { return (Serializable) deepCopy(value); } @Override - public Object assemble(Serializable cached, SharedSessionContractImplementor session, Object owner) throws HibernateException { - return deepCopy(cached); + public Address assemble(Serializable cached, Object owner) { + return deepCopy((Address) cached); } @Override - public Object replace(Object original, Object target, SharedSessionContractImplementor session, Object owner) throws HibernateException { - return original; + public Address replace(Address detached, Address managed, Object owner) { + return detached; + } + + @Override + public boolean isInstance(Object object, SessionFactoryImplementor sessionFactory) { + return CompositeUserType.super.isInstance(object, sessionFactory); + } + + @Override + public boolean isSameClass(Object object, SessionFactoryImplementor sessionFactory) { + return CompositeUserType.super.isSameClass(object, sessionFactory); } } diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java index 56be9e693f..8f1794b979 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java @@ -1,14 +1,14 @@ package com.baeldung.hibernate.customtypes; -import org.hibernate.type.LocalDateType; import org.hibernate.type.descriptor.WrapperOptions; -import org.hibernate.type.descriptor.java.AbstractTypeDescriptor; import org.hibernate.type.descriptor.java.ImmutableMutabilityPlan; -import org.hibernate.type.descriptor.java.MutabilityPlan; import java.time.LocalDate; +import java.time.format.DateTimeFormatter; -public class LocalDateStringJavaDescriptor extends AbstractTypeDescriptor { +import io.hypersistence.utils.hibernate.type.array.internal.AbstractArrayTypeDescriptor; + +public class LocalDateStringJavaDescriptor extends AbstractArrayTypeDescriptor { public static final LocalDateStringJavaDescriptor INSTANCE = new LocalDateStringJavaDescriptor(); @@ -18,12 +18,12 @@ public class LocalDateStringJavaDescriptor extends AbstractTypeDescriptor implements DiscriminatorType { +public class LocalDateStringType extends AbstractSingleColumnStandardBasicType { public static final LocalDateStringType INSTANCE = new LocalDateStringType(); public LocalDateStringType() { - super(VarcharTypeDescriptor.INSTANCE, LocalDateStringJavaDescriptor.INSTANCE); + super(VarcharJdbcType.INSTANCE, LocalDateStringJavaDescriptor.INSTANCE); } @Override @@ -21,14 +19,12 @@ public class LocalDateStringType extends AbstractSingleColumnStandardBasicType { -public class PhoneNumberType implements UserType { @Override - public int[] sqlTypes() { - return new int[]{Types.INTEGER, Types.INTEGER, Types.INTEGER}; + public int getSqlType() { + return Types.INTEGER; } @Override @@ -24,7 +23,7 @@ public class PhoneNumberType implements UserType { } @Override - public boolean equals(Object x, Object y) throws HibernateException { + public boolean equals(PhoneNumber x, PhoneNumber y) { if (x == y) return true; if (Objects.isNull(x) || Objects.isNull(y)) @@ -34,48 +33,42 @@ public class PhoneNumberType implements UserType { } @Override - public int hashCode(Object x) throws HibernateException { + public int hashCode(PhoneNumber x) { return x.hashCode(); } @Override - public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException { - int countryCode = rs.getInt(names[0]); + public PhoneNumber nullSafeGet(ResultSet rs, int position, SharedSessionContractImplementor session, Object owner) throws SQLException { + int countryCode = rs.getInt(position); if (rs.wasNull()) return null; - int cityCode = rs.getInt(names[1]); - int number = rs.getInt(names[2]); - PhoneNumber employeeNumber = new PhoneNumber(countryCode, cityCode, number); + int cityCode = rs.getInt(position); + int number = rs.getInt(position); - return employeeNumber; + return new PhoneNumber(countryCode, cityCode, number); } @Override - public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException { - + public void nullSafeSet(PreparedStatement st, PhoneNumber value, int index, SharedSessionContractImplementor session) throws SQLException { if (Objects.isNull(value)) { st.setNull(index, Types.INTEGER); st.setNull(index+1, Types.INTEGER); st.setNull(index+2, Types.INTEGER); } else { - PhoneNumber employeeNumber = (PhoneNumber) value; - st.setInt(index,employeeNumber.getCountryCode()); - st.setInt(index+1,employeeNumber.getCityCode()); - st.setInt(index+2,employeeNumber.getNumber()); + st.setInt(index, value.getCountryCode()); + st.setInt(index+1, value.getCityCode()); + st.setInt(index+2, value.getNumber()); } } @Override - public Object deepCopy(Object value) throws HibernateException { + public PhoneNumber deepCopy(PhoneNumber value) { if (Objects.isNull(value)) return null; - PhoneNumber empNumber = (PhoneNumber) value; - PhoneNumber newEmpNumber = new PhoneNumber(empNumber.getCountryCode(),empNumber.getCityCode(),empNumber.getNumber()); - - return newEmpNumber; + return new PhoneNumber(value.getCountryCode(), value.getCityCode(), value.getNumber()); } @Override @@ -84,17 +77,17 @@ public class PhoneNumberType implements UserType { } @Override - public Serializable disassemble(Object value) throws HibernateException { + public Serializable disassemble(PhoneNumber value) { return (Serializable) value; } @Override - public Object assemble(Serializable cached, Object owner) throws HibernateException { - return cached; + public PhoneNumber assemble(Serializable cached, Object owner) { + return (PhoneNumber) cached; } @Override - public Object replace(Object original, Object target, Object owner) throws HibernateException { - return original; + public PhoneNumber replace(PhoneNumber detached, PhoneNumber managed, Object owner) { + return detached; } } diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java index 266b85140b..69e34c1363 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java @@ -1,12 +1,12 @@ package com.baeldung.hibernate.customtypes; import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.type.LongType; -import org.hibernate.type.StringType; -import org.hibernate.type.Type; +import org.hibernate.metamodel.spi.ValueAccess; import org.hibernate.usertype.CompositeUserType; import org.hibernate.usertype.DynamicParameterizedType; +import org.hibernate.usertype.UserType; import java.io.Serializable; import java.sql.PreparedStatement; @@ -16,65 +16,47 @@ import java.sql.Types; import java.util.Objects; import java.util.Properties; -public class SalaryType implements CompositeUserType, DynamicParameterizedType { +public class SalaryType implements UserType, CompositeUserType, DynamicParameterizedType { private String localCurrency; @Override - public String[] getPropertyNames() { - return new String[]{"amount", "currency"}; - } - - @Override - public Type[] getPropertyTypes() { - return new Type[]{LongType.INSTANCE, StringType.INSTANCE}; - } - - @Override - public Object getPropertyValue(Object component, int property) throws HibernateException { - - Salary salary = (Salary) component; + public Object getPropertyValue(Salary component, int property) throws HibernateException { switch (property) { case 0: - return salary.getAmount(); + return component.getAmount(); case 1: - return salary.getCurrency(); + return component.getCurrency(); + default: + throw new IllegalArgumentException(property + + " is an invalid property index for class type " + + component.getClass().getName()); } - - throw new IllegalArgumentException(property + - " is an invalid property index for class type " + - component.getClass().getName()); - - } - - - @Override - public void setPropertyValue(Object component, int property, Object value) throws HibernateException { - - Salary salary = (Salary) component; - - switch (property) { - case 0: - salary.setAmount((Long) value); - case 1: - salary.setCurrency((String) value); - } - - throw new IllegalArgumentException(property + - " is an invalid property index for class type " + - component.getClass().getName()); - } @Override - public Class returnedClass() { + public Salary instantiate(ValueAccess values, SessionFactoryImplementor sessionFactory) { + return null; + } + + @Override + public Class embeddable() { return Salary.class; } @Override - public boolean equals(Object x, Object y) throws HibernateException { + public int getSqlType() { + return Types.BIGINT; + } + @Override + public Class returnedClass() { + return Salary.class; + } + + @Override + public boolean equals(Salary x, Salary y) { if (x == y) return true; @@ -82,54 +64,48 @@ public class SalaryType implements CompositeUserType, DynamicParameterizedType { return false; return x.equals(y); - } @Override - public int hashCode(Object x) throws HibernateException { + public int hashCode(Salary x) { return x.hashCode(); } @Override - public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException { - + public Salary nullSafeGet(ResultSet rs, int position, SharedSessionContractImplementor session, Object owner) throws SQLException { Salary salary = new Salary(); - salary.setAmount(rs.getLong(names[0])); + salary.setAmount(rs.getLong(position)); if (rs.wasNull()) return null; - salary.setCurrency(rs.getString(names[1])); + salary.setCurrency(rs.getString(position)); return salary; } @Override - public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException { - - + public void nullSafeSet(PreparedStatement st, Salary value, int index, SharedSessionContractImplementor session) throws SQLException { if (Objects.isNull(value)) st.setNull(index, Types.BIGINT); else { - Salary salary = (Salary) value; - st.setLong(index, SalaryCurrencyConvertor.convert(salary.getAmount(), - salary.getCurrency(), localCurrency)); - st.setString(index + 1, salary.getCurrency()); + st.setLong(index, SalaryCurrencyConvertor.convert( + value.getAmount(), + value.getCurrency(), localCurrency)); + st.setString(index + 1, value.getCurrency()); } } @Override - public Object deepCopy(Object value) throws HibernateException { - + public Salary deepCopy(Salary value) { if (Objects.isNull(value)) return null; - Salary oldSal = (Salary) value; Salary newSal = new Salary(); - newSal.setAmount(oldSal.getAmount()); - newSal.setCurrency(oldSal.getCurrency()); + newSal.setAmount(value.getAmount()); + newSal.setCurrency(value.getCurrency()); return newSal; } @@ -140,18 +116,18 @@ public class SalaryType implements CompositeUserType, DynamicParameterizedType { } @Override - public Serializable disassemble(Object value, SharedSessionContractImplementor session) throws HibernateException { + public Serializable disassemble(Salary value) { return (Serializable) deepCopy(value); } @Override - public Object assemble(Serializable cached, SharedSessionContractImplementor session, Object owner) throws HibernateException { - return deepCopy(cached); + public Salary assemble(Serializable cached, Object owner) { + return deepCopy((Salary) cached); } @Override - public Object replace(Object original, Object target, SharedSessionContractImplementor session, Object owner) throws HibernateException { - return original; + public Salary replace(Salary detached, Salary managed, Object owner) { + return detached; } @Override diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java index ec88d629a6..f16aa68475 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java @@ -4,7 +4,7 @@ import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; import org.hibernate.annotations.Immutable; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.Set; @Entity diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/immutable/entities/EventGeneratedId.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/immutable/entities/EventGeneratedId.java index 33af9313ae..6bf4006550 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/immutable/entities/EventGeneratedId.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/immutable/entities/EventGeneratedId.java @@ -3,7 +3,7 @@ package com.baeldung.hibernate.immutable.entities; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Immutable; -import javax.persistence.*; +import jakarta.persistence.*; @Entity @Immutable diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Email.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Email.java index df07c3cf69..096faf7984 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Email.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Email.java @@ -1,12 +1,12 @@ package com.baeldung.hibernate.joincolumn; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; @Entity public class Email { diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Office.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Office.java index 9940577761..3c6e5f4642 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Office.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Office.java @@ -1,13 +1,13 @@ package com.baeldung.hibernate.joincolumn; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.JoinColumns; -import javax.persistence.ManyToOne; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinColumns; +import jakarta.persistence.ManyToOne; @Entity public class Office { diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficeAddress.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficeAddress.java index cc723db6a2..d80a8be026 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficeAddress.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficeAddress.java @@ -1,10 +1,10 @@ package com.baeldung.hibernate.joincolumn; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; @Entity public class OfficeAddress { diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficialEmployee.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficialEmployee.java index 49c63c7578..551b522700 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficialEmployee.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficialEmployee.java @@ -1,12 +1,12 @@ package com.baeldung.hibernate.joincolumn; import java.util.List; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToMany; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; @Entity public class OfficialEmployee { diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/lazycollection/model/Branch.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/lazycollection/model/Branch.java index de88647546..9957e2ce75 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/lazycollection/model/Branch.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/lazycollection/model/Branch.java @@ -3,12 +3,12 @@ package com.baeldung.hibernate.lazycollection.model; import org.hibernate.annotations.LazyCollection; import org.hibernate.annotations.LazyCollectionOption; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OrderColumn; -import javax.persistence.OneToMany; -import javax.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OrderColumn; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Entity; import java.util.ArrayList; import java.util.List; diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/lazycollection/model/Employee.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/lazycollection/model/Employee.java index 831518a365..edf89696f5 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/lazycollection/model/Employee.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/lazycollection/model/Employee.java @@ -1,11 +1,10 @@ package com.baeldung.hibernate.lazycollection.model; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OrderColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Entity; @Entity public class Employee { diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java index ef82c1c9ad..99410e1f76 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java @@ -43,8 +43,8 @@ public class HibernateAnnotationUtil { return metadata.buildSessionFactory(); } - private static Map dbSettings() { - Map dbSettings = new HashMap<>(); + private static Map dbSettings() { + Map dbSettings = new HashMap<>(); dbSettings.put(Environment.URL, "jdbc:h2:mem:spring_hibernate_one_to_many"); dbSettings.put(Environment.USER, "sa"); dbSettings.put(Environment.PASS, ""); diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java index 53878af445..f07f3d3887 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java @@ -2,13 +2,13 @@ package com.baeldung.hibernate.oneToMany.model; import java.util.Set; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToMany; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; @Entity @Table(name = "CART") diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java index 27b28a6753..f279cc4ea6 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java @@ -1,13 +1,13 @@ package com.baeldung.hibernate.oneToMany.model; import java.util.Set; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; @Entity @Table(name = "CARTOIO") diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Item.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Item.java index a055682d0d..5babe9c545 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Item.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Item.java @@ -1,13 +1,13 @@ package com.baeldung.hibernate.oneToMany.model; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; @Entity @Table(name = "ITEMS") diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemOIO.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemOIO.java index baaf57b106..78139da19e 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemOIO.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemOIO.java @@ -1,12 +1,12 @@ package com.baeldung.hibernate.oneToMany.model; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; @Entity @Table(name = "ITEMSOIO") diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/pojo/Phone.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/pojo/Phone.java index d923bda5de..e173aa8b47 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/pojo/Phone.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/pojo/Phone.java @@ -1,9 +1,9 @@ package com.baeldung.hibernate.pojo; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; import java.io.Serializable; @Entity diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/Group.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/Group.java index 04684eceac..2b17c9218d 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/Group.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/Group.java @@ -3,10 +3,10 @@ package com.baeldung.hibernate.wherejointable; import java.util.ArrayList; import java.util.List; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.ManyToMany; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToMany; @Entity(name = "e_group") public class Group { diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java index 3029aae640..a517de3cca 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java @@ -3,12 +3,12 @@ package com.baeldung.hibernate.wherejointable; import java.util.ArrayList; import java.util.List; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.ManyToMany; import org.hibernate.annotations.WhereJoinTable; diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java index 00dd19699c..21a0a443c6 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java @@ -2,11 +2,11 @@ package com.baeldung.hibernate.wherejointable; import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.Id; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Id; @Entity(name = "r_user_group") public class UserGroupRelation implements Serializable { diff --git a/persistence-modules/hibernate-annotations/src/main/resources/META-INF/persistence.xml b/persistence-modules/hibernate-annotations/src/main/resources/META-INF/persistence.xml index 474eeb7a44..2915125295 100644 --- a/persistence-modules/hibernate-annotations/src/main/resources/META-INF/persistence.xml +++ b/persistence-modules/hibernate-annotations/src/main/resources/META-INF/persistence.xml @@ -7,12 +7,12 @@ Hibernate EntityManager Demo true - + - - - - + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/creationupdatetimestamp/HibernateCreationUpdateTimestampIntegrationTest.java b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/creationupdatetimestamp/HibernateCreationUpdateTimestampIntegrationTest.java index f309e9e22f..bab51dab72 100644 --- a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/creationupdatetimestamp/HibernateCreationUpdateTimestampIntegrationTest.java +++ b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/creationupdatetimestamp/HibernateCreationUpdateTimestampIntegrationTest.java @@ -1,5 +1,6 @@ package com.baeldung.hibernate.creationupdatetimestamp; +import static org.hibernate.FlushMode.MANUAL; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -71,22 +72,22 @@ class HibernateCreationUpdateTimestampIntegrationTest { } @Test - void whenCreatingEntity_ThenCreatedOnAndLastUpdatedOnAreNotEqual() { + void whenCreatingEntity_ThenCreatedOnAndLastUpdatedOnAreEqual() { session = sessionFactory.openSession(); session.beginTransaction(); Book book = new Book(); session.save(book); - session.getTransaction() - .commit(); + session.getTransaction().commit(); session.close(); - assertNotEquals(book.getCreatedOn(), book.getLastUpdatedOn()); + assertEquals(book.getCreatedOn(), book.getLastUpdatedOn()); } @Test void whenUpdatingEntity_ThenLastUpdatedOnIsUpdatedAndCreatedOnStaysTheSame() { session = sessionFactory.openSession(); + session.setHibernateFlushMode(MANUAL); session.beginTransaction(); Book book = new Book(); session.save(book); @@ -96,8 +97,9 @@ class HibernateCreationUpdateTimestampIntegrationTest { String newName = "newName"; book.setTitle(newName); - session.getTransaction() - .commit(); + session.save(book); + session.flush(); + session.getTransaction().commit(); session.close(); Instant createdOnAfterUpdate = book.getCreatedOn(); Instant lastUpdatedOnAfterUpdate = book.getLastUpdatedOn(); diff --git a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesIntegrationTest.java b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesIntegrationTest.java index 460b65ee12..9da3a90034 100644 --- a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesIntegrationTest.java +++ b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesIntegrationTest.java @@ -6,10 +6,9 @@ import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Environment; import org.hibernate.service.ServiceRegistry; -import org.junit.Assert; import org.junit.Test; -import javax.persistence.TypedQuery; +import jakarta.persistence.TypedQuery; import java.time.LocalDate; import java.util.HashMap; import java.util.Map; @@ -76,7 +75,7 @@ public class HibernateCustomTypesIntegrationTest { doInHibernate(this::sessionFactory, session -> { session.save(e); - TypedQuery query = session.createQuery("FROM OfficeEmployee OE WHERE OE.empAddress.zipcode = :pinCode", OfficeEmployee.class); + TypedQuery query = session.createQuery("FROM OfficeEmployee OE WHERE OE.empAddress.zipCode = :pinCode", OfficeEmployee.class); query.setParameter("pinCode",100); int size = query.getResultList().size(); @@ -100,8 +99,8 @@ public class HibernateCustomTypesIntegrationTest { return metadata.buildSessionFactory(); } - private static Map getProperties() { - Map dbSettings = new HashMap<>(); + private static Map getProperties() { + Map dbSettings = new HashMap<>(); dbSettings.put(Environment.URL, "jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1"); dbSettings.put(Environment.USER, "sa"); dbSettings.put(Environment.PASS, ""); diff --git a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java index 270a235ef0..f038d2b16d 100644 --- a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java +++ b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java @@ -8,7 +8,7 @@ import org.hibernate.Session; import org.junit.*; import org.junit.rules.ExpectedException; -import javax.persistence.PersistenceException; +import jakarta.persistence.PersistenceException; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.IsEqual.equalTo; diff --git a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java index 37125e8b15..04f0613811 100644 --- a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java +++ b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java @@ -78,8 +78,8 @@ public class JoinColumnIntegrationTest { return metadata.buildSessionFactory(); } - private static Map getProperties() { - Map dbSettings = new HashMap<>(); + private static Map getProperties() { + Map dbSettings = new HashMap<>(); dbSettings.put(Environment.URL, "jdbc:h2:mem:mydbJoinColumn;DB_CLOSE_DELAY=-1"); dbSettings.put(Environment.USER, "sa"); dbSettings.put(Environment.PASS, ""); diff --git a/persistence-modules/hibernate-enterprise/pom.xml b/persistence-modules/hibernate-enterprise/pom.xml index 833f19c673..eaa7b0e765 100644 --- a/persistence-modules/hibernate-enterprise/pom.xml +++ b/persistence-modules/hibernate-enterprise/pom.xml @@ -78,10 +78,11 @@ - 5.3.7.Final - 6.0.6 - 2.2.3 + 6.1.7.Final + 8.0.32 + 2.6.0 0.9 + 1.14.2 \ No newline at end of file diff --git a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java index 989fa1281a..8ef7487804 100644 --- a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java +++ b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java @@ -1,6 +1,6 @@ package com.baeldung.hibernate.exception; -import javax.persistence.Entity; +import jakarta.persistence.Entity; @Entity public class EntityWithNoId { diff --git a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/Product.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/Product.java index 0724ced56b..b7e80511e6 100644 --- a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/Product.java +++ b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/Product.java @@ -1,9 +1,9 @@ package com.baeldung.hibernate.exception; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "PRODUCT") diff --git a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/ProductEntity.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/ProductEntity.java index b9c5f5010d..a2dcec61e9 100644 --- a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/ProductEntity.java +++ b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/ProductEntity.java @@ -1,8 +1,8 @@ package com.baeldung.hibernate.exception; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "PRODUCT") diff --git a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/ProductNotMapped.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/ProductNotMapped.java new file mode 100644 index 0000000000..827ad15e5b --- /dev/null +++ b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/ProductNotMapped.java @@ -0,0 +1,32 @@ +package com.baeldung.hibernate.exception; + +public class ProductNotMapped { + + private int id; + private String name; + private String description; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/logging/Employee.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/logging/Employee.java index 9dcf4058a7..bc50c11d81 100644 --- a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/logging/Employee.java +++ b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/logging/Employee.java @@ -1,9 +1,9 @@ package com.baeldung.hibernate.logging; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; @Entity public class Employee { diff --git a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java index 736abde866..23b9a87eef 100644 --- a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java +++ b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java @@ -1,11 +1,11 @@ package com.baeldung.hibernate.pojo; -import com.vividsolutions.jts.geom.Point; +import org.locationtech.jts.geom.Point; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; @Entity public class PointEntity { diff --git a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java index 69208c8cd4..32cb146f23 100644 --- a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java +++ b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java @@ -1,10 +1,10 @@ package com.baeldung.hibernate.pojo; -import com.vividsolutions.jts.geom.Polygon; +import org.locationtech.jts.geom.Polygon; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; @Entity public class PolygonEntity { diff --git a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/pojo/Student.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/pojo/Student.java index 9b26c117eb..263908a5fc 100644 --- a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/pojo/Student.java +++ b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/pojo/Student.java @@ -1,9 +1,9 @@ package com.baeldung.hibernate.pojo; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; @Entity public class Student { diff --git a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/persistence/model/Person.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/persistence/model/Person.java index 6a95a7acf5..3766639975 100644 --- a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/persistence/model/Person.java +++ b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/persistence/model/Person.java @@ -1,8 +1,8 @@ package com.baeldung.persistence.model; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; @Entity public class Person { diff --git a/persistence-modules/hibernate-enterprise/src/main/resources/META-INF/persistence.xml b/persistence-modules/hibernate-enterprise/src/main/resources/META-INF/persistence.xml index 474eeb7a44..2915125295 100644 --- a/persistence-modules/hibernate-enterprise/src/main/resources/META-INF/persistence.xml +++ b/persistence-modules/hibernate-enterprise/src/main/resources/META-INF/persistence.xml @@ -7,12 +7,12 @@ Hibernate EntityManager Demo true - + - - - - + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/HibernateSpatialIntegrationTest.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/HibernateSpatialIntegrationTest.java index 74f752ab8c..e0f13582ab 100644 --- a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/HibernateSpatialIntegrationTest.java +++ b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/HibernateSpatialIntegrationTest.java @@ -9,23 +9,23 @@ import java.io.IOException; import java.net.URL; import java.util.Properties; -import javax.persistence.Query; +import jakarta.persistence.Query; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.io.ParseException; +import org.locationtech.jts.io.WKTReader; +import org.locationtech.jts.geom.Geometry; +import org.locationtech.jts.geom.Point; +import org.locationtech.jts.geom.Polygon; +import org.locationtech.jts.util.GeometricShapeFactory; import com.baeldung.hibernate.pojo.PointEntity; import com.baeldung.hibernate.pojo.PolygonEntity; -import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.Geometry; -import com.vividsolutions.jts.geom.Point; -import com.vividsolutions.jts.geom.Polygon; -import com.vividsolutions.jts.io.ParseException; -import com.vividsolutions.jts.io.WKTReader; -import com.vividsolutions.jts.util.GeometricShapeFactory; import geodb.GeoDB; @@ -39,7 +39,7 @@ public class HibernateSpatialIntegrationTest { session = HibernateUtil.getSessionFactory("hibernate-spatial.properties") .openSession(); transaction = session.beginTransaction(); - session.doWork(conn -> { GeoDB.InitGeoDB(conn); }); + session.doWork(GeoDB::InitGeoDB); } @After @@ -135,9 +135,7 @@ public class HibernateSpatialIntegrationTest { private Geometry wktToGeometry(String wellKnownText) throws ParseException { WKTReader fromText = new WKTReader(); - Geometry geom = null; - geom = fromText.read(wellKnownText); - return geom; + return fromText.read(wellKnownText); } private static Geometry createCircle(double x, double y, double radius) { diff --git a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java index 891352843d..37c21d1899 100644 --- a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java +++ b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java @@ -6,28 +6,25 @@ import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.util.List; -import javax.persistence.OptimisticLockException; -import javax.persistence.PersistenceException; +import jakarta.persistence.OptimisticLockException; +import jakarta.persistence.PersistenceException; -import org.hibernate.AnnotationException; import org.hibernate.HibernateException; import org.hibernate.MappingException; import org.hibernate.NonUniqueObjectException; import org.hibernate.PropertyValueException; import org.hibernate.Session; import org.hibernate.SessionFactory; -import org.hibernate.StaleObjectStateException; import org.hibernate.StaleStateException; import org.hibernate.Transaction; -import org.hibernate.TransactionException; import org.hibernate.cfg.AvailableSettings; import org.hibernate.cfg.Configuration; import org.hibernate.exception.ConstraintViolationException; import org.hibernate.exception.DataException; import org.hibernate.exception.SQLGrammarException; -import org.hibernate.hql.internal.ast.QuerySyntaxException; import org.hibernate.id.IdentifierGenerationException; import org.hibernate.query.NativeQuery; +import org.hibernate.query.sqm.UnknownEntityException; import org.hibernate.tool.schema.spi.CommandAcceptanceException; import org.hibernate.tool.schema.spi.SchemaManagementException; import org.junit.Before; @@ -63,12 +60,15 @@ public class HibernateExceptionUnitTest { @Test public void whenQueryExecutedWithUnmappedEntity_thenMappingException() { - thrown.expectCause(isA(MappingException.class)); - thrown.expectMessage("Unknown entity: java.lang.String"); + thrown.expect(isA(MappingException.class)); + thrown.expectMessage("Unable to locate persister: com.baeldung.hibernate.exception.ProductNotMapped"); + + ProductNotMapped product = new ProductNotMapped(); + product.setId(1); + product.setName("test"); Session session = sessionFactory.openSession(); - NativeQuery query = session.createNativeQuery("select name from PRODUCT", String.class); - query.getResultList(); + session.save(product); } @Test @@ -82,8 +82,8 @@ public class HibernateExceptionUnitTest { @Test public void whenQueryExecutedWithInvalidClassName_thenQuerySyntaxException() { - thrown.expectCause(isA(QuerySyntaxException.class)); - thrown.expectMessage("PRODUCT is not mapped [from PRODUCT]"); + thrown.expectCause(isA(UnknownEntityException.class)); + thrown.expectMessage("Could not resolve root entity 'PRODUCT"); Session session = sessionFactory.openSession(); List results = session.createQuery("from PRODUCT", Product.class) @@ -92,8 +92,8 @@ public class HibernateExceptionUnitTest { @Test public void givenEntityWithoutId_whenSessionFactoryCreated_thenAnnotationException() { - thrown.expect(AnnotationException.class); - thrown.expectMessage("No identifier specified for entity"); + thrown.expect(isA(HibernateException.class)); + thrown.expectMessage("Entity 'com.baeldung.hibernate.exception.EntityWithNoId' has no identifier (every '@Entity' class must declare or inherit at least one '@Id' or '@EmbeddedId' property)"); Configuration cfg = getConfiguration(); cfg.addAnnotatedClass(EntityWithNoId.class); @@ -132,9 +132,8 @@ public class HibernateExceptionUnitTest { @Test public void givenMissingTable_whenEntitySaved_thenSQLGrammarException() { - thrown.expect(isA(PersistenceException.class)); thrown.expectCause(isA(SQLGrammarException.class)); - thrown.expectMessage("SQLGrammarException: could not prepare statement"); + thrown.expectMessage("could not prepare statement"); Configuration cfg = getConfiguration(); cfg.addAnnotatedClass(Product.class); @@ -162,9 +161,8 @@ public class HibernateExceptionUnitTest { @Test public void givenMissingTable_whenQueryExecuted_thenSQLGrammarException() { - thrown.expect(isA(PersistenceException.class)); thrown.expectCause(isA(SQLGrammarException.class)); - thrown.expectMessage("SQLGrammarException: could not prepare statement"); + thrown.expectMessage("could not prepare statement"); Session session = sessionFactory.openSession(); NativeQuery query = session.createNativeQuery("select * from NON_EXISTING_TABLE", Product.class); @@ -173,9 +171,8 @@ public class HibernateExceptionUnitTest { @Test public void whenDuplicateIdSaved_thenConstraintViolationException() { - thrown.expect(isA(PersistenceException.class)); thrown.expectCause(isA(ConstraintViolationException.class)); - thrown.expectMessage("ConstraintViolationException: could not execute statement"); + thrown.expectMessage("could not execute statement"); Session session = null; Transaction transaction = null; @@ -253,7 +250,7 @@ public class HibernateExceptionUnitTest { @Test public void givenQueryWithDataTypeMismatch_WhenQueryExecuted_thenDataException() { thrown.expectCause(isA(DataException.class)); - thrown.expectMessage("org.hibernate.exception.DataException: could not prepare statement"); + thrown.expectMessage("could not prepare statement"); Session session = sessionFactory.openSession(); NativeQuery query = session.createNativeQuery("select * from PRODUCT where id='wrongTypeId'", Product.class); @@ -330,9 +327,8 @@ public class HibernateExceptionUnitTest { @Test public void whenUpdatingNonExistingObject_thenStaleStateException() { - thrown.expect(isA(OptimisticLockException.class)); - thrown.expectMessage("Row was updated or deleted by another transaction"); - thrown.expectCause(isA(StaleObjectStateException.class)); + thrown.expectCause(isA(StaleStateException.class)); + thrown.expectMessage("Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; statement executed: update PRODUCT set description=?, name=? where id=?"); Session session = null; Transaction transaction = null; @@ -356,7 +352,8 @@ public class HibernateExceptionUnitTest { @Test public void givenTxnMarkedRollbackOnly_whenCommitted_thenTransactionException() { - thrown.expect(isA(TransactionException.class)); + thrown.expect(isA(IllegalStateException.class)); + thrown.expectMessage("Transaction already active"); Session session = null; Transaction transaction = null; @@ -368,6 +365,7 @@ public class HibernateExceptionUnitTest { product1.setId(15); product1.setName("Product1"); session.save(product1); + transaction = session.beginTransaction(); transaction.setRollbackOnly(); transaction.commit(); diff --git a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/Car.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/Car.java index 1b6cee7e67..3e4895e5e6 100644 --- a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/Car.java +++ b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/Car.java @@ -2,9 +2,9 @@ package com.baeldung.hibernate.multitenancy; import java.io.Serializable; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity(name = "Car") @Table(name = "Car") diff --git a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java index fdc3f9fa81..2dc94172b1 100644 --- a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java +++ b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java @@ -79,9 +79,9 @@ public abstract class MultitenancyIntegrationTest { private void createCarTable() { Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); - session.createSQLQuery("drop table Car if exists") + session.createNativeQuery("drop table Car if exists") .executeUpdate(); - session.createSQLQuery("create table Car (brand varchar(255) primary key)") + session.createNativeQuery("create table Car (brand varchar(255) primary key)") .executeUpdate(); tx.commit(); } diff --git a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java index 92f477a646..904805f2ce 100644 --- a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java +++ b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java @@ -1,7 +1,5 @@ package com.baeldung.hibernate.multitenancy.database; -import java.io.IOException; - import org.junit.Test; import com.baeldung.hibernate.multitenancy.MultitenancyIntegrationTest; @@ -14,7 +12,7 @@ public class DatabaseApproachMultitenancyIntegrationTest extends MultitenancyInt } @Test - public void givenDatabaseApproach_whenAddingEntries_thenOnlyAddedToConcreteDatabase() throws IOException { + public void givenDatabaseApproach_whenAddingEntries_thenOnlyAddedToConcreteDatabase() { whenCurrentTenantIs(TenantIdNames.MYDB1); whenAddCar("myCar"); thenCarFound("myCar"); diff --git a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java index eb1f410622..47abf6ff85 100644 --- a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java +++ b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java @@ -34,8 +34,13 @@ public class MapMultiTenantConnectionProvider extends AbstractMultiTenantConnect private void initConnectionProviderForTenant(String tenantId) throws IOException { Properties properties = new Properties(); properties.load(getClass().getResourceAsStream(String.format("/hibernate-database-%s.properties", tenantId))); + Map configProperties = new HashMap<>(); + for (String key : properties.stringPropertyNames()) { + String value = properties.getProperty(key); + configProperties.put(key, value); + } DriverManagerConnectionProviderImpl connectionProvider = new DriverManagerConnectionProviderImpl(); - connectionProvider.configure(properties); + connectionProvider.configure(configProperties); this.connectionProviderMap.put(tenantId, connectionProvider); } diff --git a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java index 601eba651c..67b838fdf1 100644 --- a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java +++ b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java @@ -3,6 +3,8 @@ package com.baeldung.hibernate.multitenancy.schema; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; import java.util.Properties; import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl; @@ -39,9 +41,14 @@ public class SchemaMultiTenantConnectionProvider extends AbstractMultiTenantConn private ConnectionProvider initConnectionProvider() throws IOException { Properties properties = new Properties(); properties.load(getClass().getResourceAsStream("/hibernate-schema-multitenancy.properties")); + Map configProperties = new HashMap<>(); + for (String key : properties.stringPropertyNames()) { + String value = properties.getProperty(key); + configProperties.put(key, value); + } DriverManagerConnectionProviderImpl connectionProvider = new DriverManagerConnectionProviderImpl(); - connectionProvider.configure(properties); + connectionProvider.configure(configProperties); return connectionProvider; } diff --git a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/persistence/save/SaveMethodsIntegrationTest.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/persistence/save/SaveMethodsIntegrationTest.java index 8c571428b4..c3d2362339 100644 --- a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/persistence/save/SaveMethodsIntegrationTest.java +++ b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/persistence/save/SaveMethodsIntegrationTest.java @@ -7,7 +7,7 @@ import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; -import javax.persistence.PersistenceException; +import jakarta.persistence.PersistenceException; import org.hibernate.HibernateException; import org.hibernate.Session; diff --git a/persistence-modules/hibernate-enterprise/src/test/resources/hibernate-exception.properties b/persistence-modules/hibernate-enterprise/src/test/resources/hibernate-exception.properties index e08a23166d..1e086f60d4 100644 --- a/persistence-modules/hibernate-enterprise/src/test/resources/hibernate-exception.properties +++ b/persistence-modules/hibernate-enterprise/src/test/resources/hibernate-exception.properties @@ -12,5 +12,3 @@ hibernate.c3p0.min_size=5 hibernate.c3p0.max_size=20 hibernate.c3p0.acquire_increment=5 hibernate.c3p0.timeout=1800 - -hibernate.transaction.factory_class=org.hibernate.transaction.JTATransactionFactory diff --git a/persistence-modules/hibernate-enterprise/src/test/resources/hibernate-spatial.properties b/persistence-modules/hibernate-enterprise/src/test/resources/hibernate-spatial.properties index c16666cbf5..e156965ce7 100644 --- a/persistence-modules/hibernate-enterprise/src/test/resources/hibernate-spatial.properties +++ b/persistence-modules/hibernate-enterprise/src/test/resources/hibernate-spatial.properties @@ -4,7 +4,7 @@ hibernate.connection.username=sa hibernate.connection.autocommit=true jdbc.password= -hibernate.dialect=org.hibernate.spatial.dialect.h2geodb.GeoDBDialect +hibernate.dialect=org.hibernate.dialect.H2Dialect hibernate.show_sql=true hibernate.hbm2ddl.auto=create-drop diff --git a/persistence-modules/hibernate-mapping/pom.xml b/persistence-modules/hibernate-mapping/pom.xml index 506283a4fb..1e3dc8be5f 100644 --- a/persistence-modules/hibernate-mapping/pom.xml +++ b/persistence-modules/hibernate-mapping/pom.xml @@ -26,7 +26,7 @@ com.vladmihalcea - hibernate-types-52 + hibernate-types-60 ${hibernate-types.version} @@ -41,9 +41,9 @@ ${hibernate-validator.version} - org.glassfish - javax.el - ${org.glassfish.javax.el.version} + org.glassfish.expressly + expressly + 5.0.0 javax.money @@ -66,16 +66,27 @@ commons-io ${commons-io.version} + + com.fasterxml.jackson.module + jackson-module-jakarta-xmlbind-annotations + ${jackson-module-jakarta-xmlbind-annotation} + + + org.openjdk.nashorn + nashorn-core + 15.4 + - 1.4.197 - 5.4.12.Final - 2.10.4 - 6.0.16.Final + 2.1.214 + 6.1.7.Final + 2.21.1 + 8.0.0.Final 3.0.1-b11 - 1.0.3 - 1.3 + 1.1 + 1.4.2 + 2.14.2 \ No newline at end of file diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/HibernateUtil.java index fbd8bd487b..cbd73832a4 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/HibernateUtil.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/HibernateUtil.java @@ -21,6 +21,7 @@ import com.baeldung.hibernate.pojo.inheritance.Animal; import com.baeldung.hibernate.pojo.inheritance.Bag; import com.baeldung.hibernate.pojo.inheritance.Book; import com.baeldung.hibernate.pojo.inheritance.Car; +import com.baeldung.hibernate.pojo.inheritance.Laptop; import com.baeldung.hibernate.pojo.inheritance.MyEmployee; import com.baeldung.hibernate.pojo.inheritance.MyProduct; import com.baeldung.hibernate.pojo.inheritance.Pen; @@ -79,6 +80,7 @@ public class HibernateUtil { metadataSources.addAnnotatedClass(com.baeldung.hibernate.entities.Department.class); metadataSources.addAnnotatedClass(Animal.class); metadataSources.addAnnotatedClass(Bag.class); + metadataSources.addAnnotatedClass(Laptop.class); metadataSources.addAnnotatedClass(Book.class); metadataSources.addAnnotatedClass(Car.class); metadataSources.addAnnotatedClass(MyEmployee.class); @@ -86,7 +88,6 @@ public class HibernateUtil { metadataSources.addAnnotatedClass(Pen.class); metadataSources.addAnnotatedClass(Pet.class); metadataSources.addAnnotatedClass(Vehicle.class); - Metadata metadata = metadataSources.getMetadataBuilder() .build(); diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/CustomIntegerArrayType.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/CustomIntegerArrayType.java index 1155a59a57..5d3e22bf05 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/CustomIntegerArrayType.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/CustomIntegerArrayType.java @@ -7,60 +7,57 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import java.util.Arrays; -import java.util.Objects; -import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.usertype.UserType; -public class CustomIntegerArrayType implements UserType { +public class CustomIntegerArrayType implements UserType { @Override - public int[] sqlTypes() { - return new int[]{Types.ARRAY}; + public int getSqlType() { + return Types.ARRAY; } @Override - public Class returnedClass() { + public Class returnedClass() { return Integer[].class; } @Override - public boolean equals(Object x, Object y) throws HibernateException { + public boolean equals(Integer[] x, Integer[] y) { if (x instanceof Integer[] && y instanceof Integer[]) { - return Arrays.deepEquals((Integer[])x, (Integer[])y); + return Arrays.deepEquals(x, y); } else { return false; } } @Override - public int hashCode(Object x) throws HibernateException { - return Arrays.hashCode((Integer[])x); + public int hashCode(Integer[] x) { + return Arrays.hashCode(x); } @Override - public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) - throws HibernateException, SQLException { - Array array = rs.getArray(names[0]); - return array != null ? array.getArray() : null; + public Integer[] nullSafeGet(ResultSet rs, int position, SharedSessionContractImplementor session, Object owner) throws SQLException { + Array array = rs.getArray(position); + return array != null ? (Integer[]) array.getArray() : null; } @Override - public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) - throws HibernateException, SQLException { - if (value != null && st != null) { - Array array = session.connection().createArrayOf("int", (Integer[])value); - st.setArray(index, array); - } else { - st.setNull(index, sqlTypes()[0]); + public void nullSafeSet(PreparedStatement st, Integer[] value, int index, SharedSessionContractImplementor session) throws SQLException { + if (st != null) { + if (value != null) { + Array array = session.getJdbcConnectionAccess().obtainConnection().createArrayOf("int", value); + st.setArray(index, array); + } else { + st.setNull(index, Types.ARRAY); + } } } @Override - public Object deepCopy(Object value) throws HibernateException { - Integer[] arr = (Integer[]) value; - return arr != null ? Arrays.copyOf(arr, arr.length) : null; + public Integer[] deepCopy(Integer[] value) { + return value != null ? Arrays.copyOf(value, value.length) : null; } @Override @@ -69,18 +66,18 @@ public class CustomIntegerArrayType implements UserType { } @Override - public Serializable disassemble(Object value) throws HibernateException { - return (Serializable) value; + public Serializable disassemble(Integer[] value) { + return value; } @Override - public Object assemble(Serializable cached, Object owner) throws HibernateException { - return cached; + public Integer[] assemble(Serializable cached, Object owner) { + return (Integer[]) cached; } @Override - public Object replace(Object original, Object target, Object owner) throws HibernateException { - return original; + public Integer[] replace(Integer[] detached, Integer[] managed, Object owner) { + return detached; } } diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/CustomStringArrayType.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/CustomStringArrayType.java index ce50196513..31a082fb05 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/CustomStringArrayType.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/CustomStringArrayType.java @@ -7,60 +7,57 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import java.util.Arrays; -import java.util.Objects; -import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.usertype.UserType; -public class CustomStringArrayType implements UserType { +public class CustomStringArrayType implements UserType { @Override - public int[] sqlTypes() { - return new int[]{Types.ARRAY}; + public int getSqlType() { + return Types.ARRAY; } @Override - public Class returnedClass() { + public Class returnedClass() { return String[].class; } @Override - public boolean equals(Object x, Object y) throws HibernateException { + public boolean equals(String[] x, String[] y) { if (x instanceof String[] && y instanceof String[]) { - return Arrays.deepEquals((String[])x, (String[])y); + return Arrays.deepEquals(x, y); } else { return false; } } @Override - public int hashCode(Object x) throws HibernateException { - return Arrays.hashCode((String[])x); + public int hashCode(String[] x) { + return Arrays.hashCode(x); } @Override - public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) - throws HibernateException, SQLException { - Array array = rs.getArray(names[0]); - return array != null ? array.getArray() : null; + public String[] nullSafeGet(ResultSet rs, int position, SharedSessionContractImplementor session, Object owner) throws SQLException { + Array array = rs.getArray(position); + return array != null ? (String[]) array.getArray() : null; } @Override - public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) - throws HibernateException, SQLException { - if (value != null && st != null) { - Array array = session.connection().createArrayOf("text", (String[])value); - st.setArray(index, array); - } else { - st.setNull(index, sqlTypes()[0]); + public void nullSafeSet(PreparedStatement st, String[] value, int index, SharedSessionContractImplementor session) throws SQLException { + if (st != null) { + if (value != null) { + Array array = session.getJdbcConnectionAccess().obtainConnection().createArrayOf("text", value); + st.setArray(index, array); + } else { + st.setNull(index, Types.ARRAY); + } } } @Override - public Object deepCopy(Object value) throws HibernateException { - String[] arr = (String[]) value; - return arr != null ? Arrays.copyOf(arr, arr.length) : null; + public String[] deepCopy(String[] value) { + return value != null ? Arrays.copyOf(value, value.length) : null; } @Override @@ -69,18 +66,18 @@ public class CustomStringArrayType implements UserType { } @Override - public Serializable disassemble(Object value) throws HibernateException { - return (Serializable) value; + public Serializable disassemble(String[] value) { + return value; } @Override - public Object assemble(Serializable cached, Object owner) throws HibernateException { - return cached; + public String[] assemble(Serializable cached, Object owner) { + return (String[]) cached; } @Override - public Object replace(Object original, Object target, Object owner) throws HibernateException { - return original; + public String[] replace(String[] detached, String[] managed, Object owner) { + return detached; } } diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/User.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/User.java index 018bedc349..81f2ee89f7 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/User.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/User.java @@ -1,21 +1,13 @@ package com.baeldung.hibernate.arraymapping; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; import org.hibernate.annotations.Type; import com.vladmihalcea.hibernate.type.array.StringArrayType; -import org.hibernate.annotations.*; - -@TypeDefs({ - @TypeDef( - name = "string-array", - typeClass = StringArrayType.class - ) -}) @Entity public class User { @@ -25,14 +17,14 @@ public class User { private String name; @Column(columnDefinition = "text[]") - @Type(type = "com.baeldung.hibernate.arraymapping.CustomStringArrayType") + @Type(value = com.baeldung.hibernate.arraymapping.CustomStringArrayType.class) private String[] roles; @Column(columnDefinition = "int[]") - @Type(type = "com.baeldung.hibernate.arraymapping.CustomIntegerArrayType") + @Type(value = com.baeldung.hibernate.arraymapping.CustomIntegerArrayType.class) private Integer[] locations; - @Type(type = "string-array") + @Type(StringArrayType.class) @Column( name = "phone_numbers", columnDefinition = "text[]" diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/basicannotation/Course.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/basicannotation/Course.java index e816fb0176..ca77888f9b 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/basicannotation/Course.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/basicannotation/Course.java @@ -1,10 +1,9 @@ package com.baeldung.hibernate.basicannotation; -import javax.persistence.Basic; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; +import jakarta.persistence.Basic; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; @Entity public class Course { diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/entities/Department.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/entities/Department.java index ff94f4f849..39e69a2b1c 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/entities/Department.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/entities/Department.java @@ -2,7 +2,7 @@ package com.baeldung.hibernate.entities; import java.util.List; -import javax.persistence.*; +import jakarta.persistence.*; @Entity public class Department { diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java index 6510e70650..3c4f542ce7 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java @@ -1,13 +1,13 @@ package com.baeldung.hibernate.entities; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.ManyToOne; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; @org.hibernate.annotations.NamedQueries({ @org.hibernate.annotations.NamedQuery(name = "DeptEmployee_FindByEmployeeNumber", query = "from DeptEmployee where employeeNumber = :employeeNo"), - @org.hibernate.annotations.NamedQuery(name = "DeptEmployee_FindAllByDesgination", query = "from DeptEmployee where designation = :designation"), + @org.hibernate.annotations.NamedQuery(name = "DeptEmployee_FindAllByDesgination", query = "from DeptEmployee where employeeNumber = :designation"), @org.hibernate.annotations.NamedQuery(name = "DeptEmployee_UpdateEmployeeDepartment", query = "Update DeptEmployee set department = :newDepartment where employeeNumber = :employeeNo"), @org.hibernate.annotations.NamedQuery(name = "DeptEmployee_FindAllByDepartment", query = "from DeptEmployee where department = :department", timeout = 1, fetchSize = 10) }) @org.hibernate.annotations.NamedNativeQueries({ @org.hibernate.annotations.NamedNativeQuery(name = "DeptEmployee_FindByEmployeeName", query = "select * from deptemployee emp where name=:name", resultClass = DeptEmployee.class), diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/fetchMode/Customer.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/fetchMode/Customer.java index 5589601da8..b8937c6692 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/fetchMode/Customer.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/fetchMode/Customer.java @@ -3,10 +3,10 @@ package com.baeldung.hibernate.fetchMode; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.OneToMany; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; import java.util.HashSet; import java.util.Set; diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/fetchMode/Order.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/fetchMode/Order.java index aa9c517321..5be65bac0d 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/fetchMode/Order.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/fetchMode/Order.java @@ -1,6 +1,6 @@ package com.baeldung.hibernate.fetchMode; -import javax.persistence.*; +import jakarta.persistence.*; @Entity public class Order { diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/lob/model/User.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/lob/model/User.java index 21f725b388..3c3b748990 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/lob/model/User.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/lob/model/User.java @@ -1,13 +1,13 @@ package com.baeldung.hibernate.lob.model; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Lob; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import jakarta.persistence.Table; @Entity -@Table(name="user") +@Table(name="users") public class User { @Id diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkey/Item.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkey/Item.java index 385ffe93ea..ff8115f5d9 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkey/Item.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkey/Item.java @@ -2,15 +2,15 @@ package com.baeldung.hibernate.persistmaps.mapkey; import com.baeldung.hibernate.persistmaps.ItemType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; import java.util.Date; import java.util.Objects; diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkey/Order.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkey/Order.java index 8409cacd6b..e42ceda5de 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkey/Order.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkey/Order.java @@ -1,15 +1,15 @@ package com.baeldung.hibernate.persistmaps.mapkey; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.MapKey; -import javax.persistence.OneToMany; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.MapKey; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; import java.util.Map; @Entity diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkey/User.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkey/User.java index b2ee7e85fe..0a9694f43c 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkey/User.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkey/User.java @@ -1,16 +1,15 @@ package com.baeldung.hibernate.persistmaps.mapkey; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.validation.constraints.Size; -import javax.money.MonetaryAmount; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.Size; import org.hibernate.validator.constraints.Length; -import org.hibernate.validator.constraints.CreditCardNumber; -import org.hibernate.validator.constraints.Currency; @Entity +@Table(name="users2") public class User { @Id @Column(length = 3) diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeycolumn/Order.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeycolumn/Order.java index fa092060da..3d24c743d7 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeycolumn/Order.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeycolumn/Order.java @@ -1,14 +1,14 @@ package com.baeldung.hibernate.persistmaps.mapkeycolumn; -import javax.persistence.CollectionTable; -import javax.persistence.Column; -import javax.persistence.ElementCollection; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.MapKeyColumn; -import javax.persistence.Table; +import jakarta.persistence.CollectionTable; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.MapKeyColumn; +import jakarta.persistence.Table; import java.util.Map; @Entity diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeyenumerated/Order.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeyenumerated/Order.java index e1f62599b8..19622ea01d 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeyenumerated/Order.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeyenumerated/Order.java @@ -3,17 +3,17 @@ package com.baeldung.hibernate.persistmaps.mapkeyenumerated; import com.baeldung.hibernate.persistmaps.ItemType; import com.baeldung.hibernate.persistmaps.mapkey.Item; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.MapKeyEnumerated; -import javax.persistence.OneToMany; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.MapKeyEnumerated; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; import java.util.Map; @Entity diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeyjoincolumn/Item.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeyjoincolumn/Item.java index 97bbd5b539..9ed58305da 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeyjoincolumn/Item.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeyjoincolumn/Item.java @@ -2,18 +2,18 @@ package com.baeldung.hibernate.persistmaps.mapkeyjoincolumn; import com.baeldung.hibernate.persistmaps.ItemType; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; import java.util.Date; import java.util.Objects; diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeyjoincolumn/Order.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeyjoincolumn/Order.java index d680d84501..9d20237860 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeyjoincolumn/Order.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeyjoincolumn/Order.java @@ -1,15 +1,15 @@ package com.baeldung.hibernate.persistmaps.mapkeyjoincolumn; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.MapKeyJoinColumn; -import javax.persistence.OneToMany; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.MapKeyJoinColumn; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; import java.util.Map; @Entity diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeyjoincolumn/Seller.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeyjoincolumn/Seller.java index 15b08e9fe6..ca06db241e 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeyjoincolumn/Seller.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeyjoincolumn/Seller.java @@ -1,10 +1,10 @@ package com.baeldung.hibernate.persistmaps.mapkeyjoincolumn; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import java.util.Objects; @Entity diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeytemporal/Order.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeytemporal/Order.java index be602c1e9f..920d693d16 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeytemporal/Order.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/persistmaps/mapkeytemporal/Order.java @@ -2,17 +2,17 @@ package com.baeldung.hibernate.persistmaps.mapkeytemporal; import com.baeldung.hibernate.persistmaps.mapkey.Item; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.MapKeyTemporal; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import javax.persistence.TemporalType; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.MapKeyTemporal; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import jakarta.persistence.TemporalType; import java.util.Date; import java.util.Map; diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/Employee.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/Employee.java index e9732b2b67..7d8a254eec 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/Employee.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/Employee.java @@ -2,15 +2,15 @@ package com.baeldung.hibernate.pojo; import org.hibernate.annotations.*; -import javax.persistence.Entity; -import javax.persistence.*; +import jakarta.persistence.Entity; +import jakarta.persistence.*; import java.io.Serializable; import java.util.HashSet; import java.util.Set; @Entity @Where(clause = "deleted = false") -@FilterDef(name = "incomeLevelFilter", parameters = @ParamDef(name = "incomeLimit", type = "int")) +@FilterDef(name = "incomeLevelFilter", parameters = @ParamDef(name = "incomeLimit", type = Integer.class)) @Filter(name = "incomeLevelFilter", condition = "grossIncome > :incomeLimit") public class Employee implements Serializable { diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/EntityDescription.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/EntityDescription.java index 131bb73a80..29befd80f2 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/EntityDescription.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/EntityDescription.java @@ -1,8 +1,11 @@ package com.baeldung.hibernate.pojo; import org.hibernate.annotations.Any; +import org.hibernate.annotations.AnyDiscriminator; +import org.hibernate.annotations.AnyDiscriminatorValue; +import org.hibernate.annotations.AnyKeyJavaClass; -import javax.persistence.*; +import jakarta.persistence.*; import java.io.Serializable; @Entity @@ -14,10 +17,12 @@ public class EntityDescription implements Serializable { private String description; - @Any( - metaDef = "EntityDescriptionMetaDef", - metaColumn = @Column(name = "entity_type") - ) + @Any + @AnyDiscriminator(DiscriminatorType.STRING) + @AnyDiscriminatorValue(discriminator = "S", entity = Employee.class) + @AnyDiscriminatorValue(discriminator = "I", entity = Phone.class) + @AnyKeyJavaClass(Integer.class) + @Column(name = "entity_type") @JoinColumn(name = "entity_id") private Serializable entity; diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/Phone.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/Phone.java index d923bda5de..e173aa8b47 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/Phone.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/Phone.java @@ -1,9 +1,9 @@ package com.baeldung.hibernate.pojo; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; import java.io.Serializable; @Entity diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/TemporalValues.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/TemporalValues.java index f3fe095cae..0c022884eb 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/TemporalValues.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/TemporalValues.java @@ -1,7 +1,6 @@ package com.baeldung.hibernate.pojo; -import javax.persistence.*; -import java.io.Serializable; +import jakarta.persistence.*; import java.sql.Date; import java.sql.Time; import java.sql.Timestamp; @@ -9,7 +8,7 @@ import java.time.*; import java.util.Calendar; @Entity -public class TemporalValues implements Serializable { +public class TemporalValues { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -48,7 +47,7 @@ public class TemporalValues implements Serializable { private java.time.LocalDate localDate; @Basic - private java.time.LocalTime localTime; + private java.time.LocalTime localTimeField; @Basic private java.time.OffsetTime offsetTime; @@ -146,11 +145,11 @@ public class TemporalValues implements Serializable { } public LocalTime getLocalTime() { - return localTime; + return localTimeField; } public void setLocalTime(LocalTime localTime) { - this.localTime = localTime; + this.localTimeField = localTime; } public OffsetTime getOffsetTime() { diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Animal.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Animal.java index 6fe7f915fc..c44a542b60 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Animal.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Animal.java @@ -1,9 +1,9 @@ package com.baeldung.hibernate.pojo.inheritance; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Inheritance; -import javax.persistence.InheritanceType; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Inheritance; +import jakarta.persistence.InheritanceType; @Entity @Inheritance(strategy = InheritanceType.JOINED) diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Bag.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Bag.java index fa6e1b4bef..707e387866 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Bag.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Bag.java @@ -1,7 +1,7 @@ package com.baeldung.hibernate.pojo.inheritance; -import javax.persistence.Entity; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; import org.hibernate.annotations.Polymorphism; import org.hibernate.annotations.PolymorphismType; diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Book.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Book.java index 36ca8dd77c..286a30cc14 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Book.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Book.java @@ -1,7 +1,7 @@ package com.baeldung.hibernate.pojo.inheritance; -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; @Entity @DiscriminatorValue("1") diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Car.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Car.java index 49d1f7749a..987e299625 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Car.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Car.java @@ -1,6 +1,6 @@ package com.baeldung.hibernate.pojo.inheritance; -import javax.persistence.Entity; +import jakarta.persistence.Entity; @Entity public class Car extends Vehicle { diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Laptop.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Laptop.java new file mode 100644 index 0000000000..cced365d78 --- /dev/null +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Laptop.java @@ -0,0 +1,39 @@ +package com.baeldung.hibernate.pojo.inheritance; + +import org.hibernate.annotations.Polymorphism; +import org.hibernate.annotations.PolymorphismType; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; + +@Entity +@Polymorphism(type = PolymorphismType.IMPLICIT) +public class Laptop implements Item { + + @Id + private Long id; + + private String type; + + public Laptop(Long id, String type) { + this.id = id; + this.type = type; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + +} diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyEmployee.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyEmployee.java index 9a6bce16cf..96958c6e28 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyEmployee.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyEmployee.java @@ -1,6 +1,6 @@ package com.baeldung.hibernate.pojo.inheritance; -import javax.persistence.Entity; +import jakarta.persistence.Entity; @Entity public class MyEmployee extends Person { diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyProduct.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyProduct.java index 13f04d8904..62214fc16e 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyProduct.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyProduct.java @@ -1,13 +1,11 @@ package com.baeldung.hibernate.pojo.inheritance; -import javax.persistence.DiscriminatorColumn; -import javax.persistence.DiscriminatorType; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Inheritance; -import javax.persistence.InheritanceType; - -import org.hibernate.annotations.DiscriminatorFormula; +import jakarta.persistence.DiscriminatorColumn; +import jakarta.persistence.DiscriminatorType; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Inheritance; +import jakarta.persistence.InheritanceType; @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pen.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pen.java index 32b77e52af..2382cab405 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pen.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pen.java @@ -1,7 +1,7 @@ package com.baeldung.hibernate.pojo.inheritance; -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; @Entity @DiscriminatorValue("2") diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Person.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Person.java index 99084b88af..9bf8ac254c 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Person.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Person.java @@ -1,7 +1,7 @@ package com.baeldung.hibernate.pojo.inheritance; -import javax.persistence.Id; -import javax.persistence.MappedSuperclass; +import jakarta.persistence.Id; +import jakarta.persistence.MappedSuperclass; @MappedSuperclass public class Person { diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pet.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pet.java index 870b3cd684..b359eb3a21 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pet.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pet.java @@ -1,7 +1,7 @@ package com.baeldung.hibernate.pojo.inheritance; -import javax.persistence.Entity; -import javax.persistence.PrimaryKeyJoinColumn; +import jakarta.persistence.Entity; +import jakarta.persistence.PrimaryKeyJoinColumn; @Entity @PrimaryKeyJoinColumn(name = "petId") diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Vehicle.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Vehicle.java index b2a920573e..9bdde8c33b 100644 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Vehicle.java +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Vehicle.java @@ -1,9 +1,9 @@ package com.baeldung.hibernate.pojo.inheritance; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Inheritance; -import javax.persistence.InheritanceType; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Inheritance; +import jakarta.persistence.InheritanceType; @Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/package-info.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/package-info.java deleted file mode 100644 index 992cda7c1d..0000000000 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -@AnyMetaDef(name = "EntityDescriptionMetaDef", metaType = "string", idType = "int", - metaValues = { - @MetaValue(value = "Employee", targetEntity = Employee.class), - @MetaValue(value = "Phone", targetEntity = Phone.class) - }) -package com.baeldung.hibernate.pojo; - -import org.hibernate.annotations.AnyMetaDef; -import org.hibernate.annotations.MetaValue; \ No newline at end of file diff --git a/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/DynamicMappingIntegrationTest.java b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/DynamicMappingIntegrationTest.java index 7a112200b5..833c5cc3ff 100644 --- a/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/DynamicMappingIntegrationTest.java +++ b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/DynamicMappingIntegrationTest.java @@ -119,8 +119,8 @@ public class DynamicMappingIntegrationTest { assertThat(employees).hasSize(2); - Employee employee = session.get(Employee.class, 1); - assertThat(employee.getGrossIncome()).isEqualTo(10_000); + Employee employee = session.get(Employee.class, 2); + assertThat(employee.getGrossIncome()).isEqualTo(12_000); session.disableFilter("incomeLevelFilter"); employees = session.createQuery("from Employee").getResultList(); diff --git a/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java index 0f35dbb8af..7f4cac141c 100644 --- a/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java +++ b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java @@ -13,6 +13,7 @@ import org.junit.Test; import com.baeldung.hibernate.pojo.inheritance.Bag; import com.baeldung.hibernate.pojo.inheritance.Book; import com.baeldung.hibernate.pojo.inheritance.Car; +import com.baeldung.hibernate.pojo.inheritance.Laptop; import com.baeldung.hibernate.pojo.inheritance.MyEmployee; import com.baeldung.hibernate.pojo.inheritance.Pen; import com.baeldung.hibernate.pojo.inheritance.Pet; @@ -81,9 +82,12 @@ public class InheritanceMappingIntegrationTest { public void givenSubclasses_whenQueryNonMappedInterface_thenOk() { Bag bag = new Bag(1, "large"); session.save(bag); + + Laptop laptop = new Laptop(1L, "Dell"); + session.save(laptop); assertThat(session.createQuery("from com.baeldung.hibernate.pojo.inheritance.Item") .getResultList() - .size()).isEqualTo(0); + .size()).isEqualTo(1); } } diff --git a/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/basicannotation/BasicAnnotationIntegrationTest.java b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/basicannotation/BasicAnnotationIntegrationTest.java index 930bea60c5..6a9a4f095b 100644 --- a/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/basicannotation/BasicAnnotationIntegrationTest.java +++ b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/basicannotation/BasicAnnotationIntegrationTest.java @@ -2,7 +2,7 @@ package com.baeldung.hibernate.basicannotation; import java.io.IOException; -import javax.persistence.PersistenceException; +import jakarta.persistence.PersistenceException; import org.hibernate.Session; import org.hibernate.SessionFactory; diff --git a/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/validation/UserAdditionalValidationUnitTest.java b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/validation/UserAdditionalValidationUnitTest.java index 0f2a0403e9..17212173ec 100644 --- a/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/validation/UserAdditionalValidationUnitTest.java +++ b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/validation/UserAdditionalValidationUnitTest.java @@ -7,13 +7,12 @@ import java.math.BigDecimal; import java.time.Duration; import java.util.Set; -import javax.money.CurrencyContextBuilder; import javax.money.Monetary; import javax.money.MonetaryAmount; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import org.hibernate.validator.constraints.CodePointLength; import org.hibernate.validator.constraints.CreditCardNumber; @@ -21,12 +20,10 @@ import org.hibernate.validator.constraints.Currency; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.LuhnCheck; import org.hibernate.validator.constraints.Range; -import org.hibernate.validator.constraints.SafeHtml; import org.hibernate.validator.constraints.ScriptAssert; import org.hibernate.validator.constraints.URL; import org.hibernate.validator.constraints.time.DurationMax; import org.hibernate.validator.constraints.time.DurationMin; -import org.javamoney.moneta.CurrencyUnitBuilder; import org.javamoney.moneta.Money; import org.junit.BeforeClass; import org.junit.Test; diff --git a/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/validation/UserValidationUnitTest.java b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/validation/UserValidationUnitTest.java index e39f324856..495ad657be 100644 --- a/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/validation/UserValidationUnitTest.java +++ b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/validation/UserValidationUnitTest.java @@ -2,11 +2,11 @@ package com.baeldung.hibernate.validation; import static org.junit.Assert.assertEquals; import java.util.Set; -import javax.persistence.PersistenceException; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; +import jakarta.persistence.PersistenceException; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.junit.Before; diff --git a/persistence-modules/hibernate-queries/pom.xml b/persistence-modules/hibernate-queries/pom.xml index 68a46b82b1..bb60c7b83a 100644 --- a/persistence-modules/hibernate-queries/pom.xml +++ b/persistence-modules/hibernate-queries/pom.xml @@ -85,15 +85,21 @@ ${testcontainers.mysql.version} test + + io.hypersistence + hypersistence-utils-hibernate-60 + 3.3.1 + - 5.0.2.RELEASE - 1.10.6.RELEASE + 6.0.6 + 3.0.3 9.0.0.M26 - 6.0.6 - 2.2.3 + 8.0.32 + 2.6.0 2.1.214 + 6.1.7.Final 1.17.6 diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/model/Employee.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/model/Employee.java index 8771e02e0b..9041c6727c 100644 --- a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/model/Employee.java +++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/model/Employee.java @@ -1,7 +1,7 @@ package com.baeldung.hibernate.criteria.model; import java.io.Serializable; -import javax.persistence.Entity; +import jakarta.persistence.Entity; @org.hibernate.annotations.NamedQueries({ @org.hibernate.annotations.NamedQuery(name = "Employee_findByEmployeeId", query = "from Employee where id = :employeeId"), diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/ApplicationView.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/ApplicationView.java index 248f64474a..2b782c2a1d 100644 --- a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/ApplicationView.java +++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/ApplicationView.java @@ -12,10 +12,10 @@ package com.baeldung.hibernate.criteria.view; import java.util.List; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Predicate; -import javax.persistence.criteria.Root; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; import org.hibernate.Session; import org.hibernate.query.Query; diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/EmployeeCriteriaQueries.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/EmployeeCriteriaQueries.java index f8c525611b..9303fd893e 100644 --- a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/EmployeeCriteriaQueries.java +++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/EmployeeCriteriaQueries.java @@ -3,9 +3,9 @@ package com.baeldung.hibernate.criteria.view; import com.baeldung.hibernate.criteria.model.Employee; import com.baeldung.hibernate.criteria.util.HibernateUtil; import java.util.List; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Root; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Root; import org.hibernate.Session; import org.hibernate.query.Query; diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java index 314e7ca557..af6b561091 100644 --- a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java +++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java @@ -1,11 +1,11 @@ package com.baeldung.hibernate.criteriaquery; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "students") diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java index 56be9e693f..58d8e8628a 100644 --- a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java +++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java @@ -1,14 +1,15 @@ package com.baeldung.hibernate.customtypes; -import org.hibernate.type.LocalDateType; -import org.hibernate.type.descriptor.WrapperOptions; -import org.hibernate.type.descriptor.java.AbstractTypeDescriptor; -import org.hibernate.type.descriptor.java.ImmutableMutabilityPlan; -import org.hibernate.type.descriptor.java.MutabilityPlan; import java.time.LocalDate; +import java.time.format.DateTimeFormatter; -public class LocalDateStringJavaDescriptor extends AbstractTypeDescriptor { +import org.hibernate.type.descriptor.WrapperOptions; +import org.hibernate.type.descriptor.java.ImmutableMutabilityPlan; + +import io.hypersistence.utils.hibernate.type.array.internal.AbstractArrayTypeDescriptor; + +public class LocalDateStringJavaDescriptor extends AbstractArrayTypeDescriptor { public static final LocalDateStringJavaDescriptor INSTANCE = new LocalDateStringJavaDescriptor(); @@ -18,12 +19,12 @@ public class LocalDateStringJavaDescriptor extends AbstractTypeDescriptor implements DiscriminatorType { +public class LocalDateStringType extends AbstractSingleColumnStandardBasicType { public static final LocalDateStringType INSTANCE = new LocalDateStringType(); public LocalDateStringType() { - super(VarcharTypeDescriptor.INSTANCE, LocalDateStringJavaDescriptor.INSTANCE); + super(VarcharJdbcType.INSTANCE, LocalDateStringJavaDescriptor.INSTANCE); } @Override @@ -21,14 +19,12 @@ public class LocalDateStringType extends AbstractSingleColumnStandardBasicTypeHibernate EntityManager Demo true - + - - - - + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaIntegrationTest.java b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaIntegrationTest.java index a1f88f3387..c405eb9ebd 100644 --- a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaIntegrationTest.java +++ b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaIntegrationTest.java @@ -15,10 +15,10 @@ import com.baeldung.hibernate.criteria.model.Item; import com.baeldung.hibernate.criteria.util.HibernateUtil; import com.baeldung.hibernate.criteria.view.ApplicationView; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaDelete; -import javax.persistence.criteria.CriteriaUpdate; -import javax.persistence.criteria.Root; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaDelete; +import jakarta.persistence.criteria.CriteriaUpdate; +import jakarta.persistence.criteria.Root; public class HibernateCriteriaIntegrationTest { diff --git a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java index cedba412d9..bfcb4301a7 100644 --- a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java +++ b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java @@ -1,6 +1,5 @@ package com.baeldung.hibernate.criteriaquery; -import com.baeldung.hibernate.criteriaquery.HibernateUtil; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.query.Query; @@ -10,9 +9,9 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Root; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Root; import java.io.IOException; import java.util.List; diff --git a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/distinct/entities/DistinctHqlQueriesUnitTest.java b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/distinct/entities/DistinctHqlQueriesUnitTest.java index 799439a51b..3ce384741f 100644 --- a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/distinct/entities/DistinctHqlQueriesUnitTest.java +++ b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/distinct/entities/DistinctHqlQueriesUnitTest.java @@ -8,7 +8,6 @@ import java.util.List; import org.hibernate.Session; import org.hibernate.Transaction; -import org.hibernate.annotations.QueryHints; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -45,12 +44,12 @@ public class DistinctHqlQueriesUnitTest { } @Test - public void whenExecutingSelectQuery_thereWillBeDuplicates() { + public void whenExecutingSelectQuery_thereTheInsertedPosts() { String hql = "SELECT p FROM Post p LEFT JOIN FETCH p.comments"; List posts = session.createQuery(hql, Post.class) .getResultList(); - assertThat(posts).hasSize(3); + assertThat(posts).hasSize(1); } @Test @@ -68,8 +67,8 @@ public class DistinctHqlQueriesUnitTest { @Test public void whenExecutingSelectDistinctQueryWithHint_thereShouldBeNoDuplicates() { String hql = "SELECT DISTINCT p FROM Post p LEFT JOIN FETCH p.comments"; + // From Hibernate ORM 6, distinct is always passed to the SQL query and the flag QueryHints#HINT_PASS_DISTINCT_THROUGH has been removed. List posts = session.createQuery(hql, Post.class) - .setHint(QueryHints.PASS_DISTINCT_THROUGH, false) .getResultList(); assertThat(posts).hasSize(1) diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index ad757d9073..fc83233492 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -26,15 +26,14 @@ flyway-repair hbase hibernate5 - + hibernate-mapping hibernate-mapping-2 - + hibernate-annotations hibernate-exceptions hibernate-libraries hibernate-jpa - - + hibernate-queries + hibernate-enterprise influxdb java-cockroachdb @@ -116,7 +115,7 @@ 6.2.0.Final 42.5.4 - 2.3.4 + 2.7.1 1.16.3 diff --git a/pom.xml b/pom.xml index 060f3a0738..996ebdc459 100644 --- a/pom.xml +++ b/pom.xml @@ -367,6 +367,7 @@ muleesb persistence-modules/deltaspike + persistence-modules/hibernate-ogm @@ -552,6 +553,7 @@ muleesb persistence-modules/deltaspike + persistence-modules/hibernate-ogm diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/client/ProductClient.java b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/client/ProductClient.java index f668e8f2c8..470dd5c929 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/client/ProductClient.java +++ b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/client/ProductClient.java @@ -8,7 +8,7 @@ import org.springframework.web.bind.annotation.RequestMethod; import com.baeldung.cloud.openfeign.customizederrorhandling.config.FeignConfig; import com.baeldung.cloud.openfeign.defaulterrorhandling.model.Product; -@FeignClient(name = "product-client-2", url = "http://localhost:8081/product/", configuration = FeignConfig.class) +@FeignClient(name = "product-client-2", url = "http://localhost:8088/product/", configuration = FeignConfig.class) public interface ProductClient { @RequestMapping(value = "{id}", method = RequestMethod.GET) diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/customizederrorhandling/client/ProductClientUnitTest.java b/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/customizederrorhandling/client/ProductClientUnitTest.java index 5e715265aa..385ce900f5 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/customizederrorhandling/client/ProductClientUnitTest.java +++ b/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/customizederrorhandling/client/ProductClientUnitTest.java @@ -31,8 +31,8 @@ public class ProductClientUnitTest { @Before public void startWireMockServer() { - wireMockServer = new WireMockServer(8081); - configureFor("localhost", 8081); + wireMockServer = new WireMockServer(8088); + configureFor("localhost", 8088); wireMockServer.start(); } diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/customizederrorhandling/controller/ProductControllerUnitTest.java b/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/customizederrorhandling/controller/ProductControllerUnitTest.java index d46c6fd86f..3d103d1333 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/customizederrorhandling/controller/ProductControllerUnitTest.java +++ b/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/customizederrorhandling/controller/ProductControllerUnitTest.java @@ -46,8 +46,8 @@ public class ProductControllerUnitTest { @Before public void startWireMockServer() { - wireMockServer = new WireMockServer(8081); - configureFor("localhost", 8081); + wireMockServer = new WireMockServer(8088); + configureFor("localhost", 8088); wireMockServer.start(); } From bb9e5b65b4044f430aa59e23113cc8f2f2676d7b Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Fri, 12 May 2023 16:44:03 +0300 Subject: [PATCH 128/141] JAVA-20165 Upgrade spring-boot hibernate specific modules to JDK 11 (#13952) * JAVA-20165 Upgrade spring-boot hibernate specific modules to JDK 11 * JAVA-20165 Migrating spring-boot-persistence-mongodb * JAVA-20165 Migrating spring-boot-persistence-mongodb-2 * JAVA-20165 Migrating spring-boot-persistence-mongodb-3 * JAVA-20165 Adding latest version for jdbi in spring-boot-persistence-2 module --------- Co-authored-by: timis1 --- persistence-modules/pom.xml | 6 ++--- .../spring-boot-persistence-2/pom.xml | 24 +++++++++---------- .../baeldung/boot/jdbi/JdbiConfiguration.java | 4 ++-- .../baeldung/boot/jdbi/domain/CarModel.java | 2 +- .../boot/jdbi/mapper/CarModelMapper.java | 2 +- .../java/com/baeldung/db/indexing/Image.java | 8 +++---- .../spring/oracle/pooling/entity/Book.java | 8 +++---- .../application/entities/Customer.java | 10 ++++---- .../java/com/baeldung/states/UserEntity.java | 6 ++--- .../states/UserEntityWithCascade.java | 8 +++---- .../application/entities/Customer.java | 12 +++++----- .../boot/jdbi/dao/CarMakerDao/insert.sql | 2 +- .../boot/jdbi/dao/CarModelDao/insert.sql | 4 ++-- ...ingBootJdbiApplicationIntegrationTest.java | 8 +++---- .../FileSystemImageIntegrationTest.java | 15 ++++++++---- .../db/indexing/ImageIntegrationTest.java | 16 +++++++++---- .../CustomerControllerIntegrationTest.java | 3 +-- .../states/UserEntityIntegrationTest.java | 2 +- .../src/test/resources/data.sql | 16 ++++++------- .../src/test/resources/schema.sql | 4 ++-- .../spring-boot-persistence-mongodb-2/pom.xml | 1 - .../spring-boot-persistence-mongodb-3/pom.xml | 1 - .../spring-boot-persistence-mongodb/pom.xml | 1 - 23 files changed, 84 insertions(+), 79 deletions(-) diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index fc83233492..b92fb45e6f 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -58,14 +58,14 @@ solr - + spring-boot-persistence-2 spring-boot-persistence-3 spring-boot-mysql spring-boot-persistence spring-boot-persistence-h2 - + spring-boot-persistence-mongodb-3 spring-data-arangodb spring-data-cassandra spring-data-cassandra-test diff --git a/persistence-modules/spring-boot-persistence-2/pom.xml b/persistence-modules/spring-boot-persistence-2/pom.xml index 1a02b18e50..260c558875 100644 --- a/persistence-modules/spring-boot-persistence-2/pom.xml +++ b/persistence-modules/spring-boot-persistence-2/pom.xml @@ -17,13 +17,6 @@ - - org.junit - junit-bom - ${junit-jupiter.version} - pom - import - org.springframework.boot spring-boot-dependencies @@ -33,7 +26,7 @@ org.jdbi - jdbi3-spring4 + jdbi3-spring5 ${jdbi.version} @@ -55,7 +48,7 @@ org.jdbi - jdbi3-spring4 + jdbi3-spring5 org.jdbi @@ -103,6 +96,7 @@ mysql mysql-connector-java + ${mysql-connector-java.version} org.xerial @@ -143,10 +137,14 @@ - 3.9.1 - 2.1.8.RELEASE - 0.9.5.2 - 21.1.0.0 + 3.38.0 + 3.0.5 + 0.9.5.5 + 21.9.0.0 + + 2.0.7 + 1.4.6 + 8.0.33 \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/boot/jdbi/JdbiConfiguration.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/boot/jdbi/JdbiConfiguration.java index ddbe6cc118..d744a46f3f 100644 --- a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/boot/jdbi/JdbiConfiguration.java +++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/boot/jdbi/JdbiConfiguration.java @@ -31,11 +31,11 @@ public class JdbiConfiguration { // Register all available plugins log.info("[I27] Installing plugins... ({} found)", jdbiPlugins.size()); - jdbiPlugins.forEach(plugin -> jdbi.installPlugin(plugin)); + jdbiPlugins.forEach(jdbi::installPlugin); // Register all available rowMappers log.info("[I31] Installing rowMappers... ({} found)", rowMappers.size()); - rowMappers.forEach(mapper -> jdbi.registerRowMapper(mapper)); + rowMappers.forEach(jdbi::registerRowMapper); return jdbi; } diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/boot/jdbi/domain/CarModel.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/boot/jdbi/domain/CarModel.java index 80b615801b..36cfd59b6d 100644 --- a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/boot/jdbi/domain/CarModel.java +++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/boot/jdbi/domain/CarModel.java @@ -8,7 +8,7 @@ import lombok.Data; public class CarModel { private Long id; private String name; - private Integer year; + private Integer yearDate; private String sku; private Long makerId; } diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/boot/jdbi/mapper/CarModelMapper.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/boot/jdbi/mapper/CarModelMapper.java index eeceafd649..b2311ef6a9 100644 --- a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/boot/jdbi/mapper/CarModelMapper.java +++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/boot/jdbi/mapper/CarModelMapper.java @@ -18,7 +18,7 @@ public class CarModelMapper implements RowMapper{ .id(rs.getLong("id")) .name(rs.getString("name")) .sku(rs.getString("sku")) - .year(rs.getInt("year")) + .yearDate(rs.getInt("year")) .build(); } diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/db/indexing/Image.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/db/indexing/Image.java index e3fcf53f81..7c7a558777 100644 --- a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/db/indexing/Image.java +++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/db/indexing/Image.java @@ -1,9 +1,9 @@ package com.baeldung.db.indexing; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Lob; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; @Entity class Image { diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/entity/Book.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/entity/Book.java index fb2c3fcf6a..af4199e65b 100644 --- a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/entity/Book.java +++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/entity/Book.java @@ -1,9 +1,9 @@ package com.baeldung.spring.oracle.pooling.entity; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; @Entity public class Book { diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/springboothsqldb/application/entities/Customer.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/springboothsqldb/application/entities/Customer.java index ee2735abb8..cd4fafb60f 100644 --- a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/springboothsqldb/application/entities/Customer.java +++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/springboothsqldb/application/entities/Customer.java @@ -1,10 +1,10 @@ package com.baeldung.springboothsqldb.application.entities; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "customers") diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/states/UserEntity.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/states/UserEntity.java index 90bd275240..8c3494d1e4 100644 --- a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/states/UserEntity.java +++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/states/UserEntity.java @@ -5,9 +5,9 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.ManyToOne; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; @Entity @AllArgsConstructor diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/states/UserEntityWithCascade.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/states/UserEntityWithCascade.java index de0d62bfe2..ada6b87ae3 100644 --- a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/states/UserEntityWithCascade.java +++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/states/UserEntityWithCascade.java @@ -5,10 +5,10 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.ManyToOne; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; @Entity @AllArgsConstructor diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/tomcatconnectionpool/application/entities/Customer.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/tomcatconnectionpool/application/entities/Customer.java index 712506eb98..02af097dc0 100644 --- a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/tomcatconnectionpool/application/entities/Customer.java +++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/tomcatconnectionpool/application/entities/Customer.java @@ -1,11 +1,11 @@ package com.baeldung.tomcatconnectionpool.application.entities; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "customers") diff --git a/persistence-modules/spring-boot-persistence-2/src/main/resources/com/baeldung/boot/jdbi/dao/CarMakerDao/insert.sql b/persistence-modules/spring-boot-persistence-2/src/main/resources/com/baeldung/boot/jdbi/dao/CarMakerDao/insert.sql index 0e045d7274..0b1a93158b 100644 --- a/persistence-modules/spring-boot-persistence-2/src/main/resources/com/baeldung/boot/jdbi/dao/CarMakerDao/insert.sql +++ b/persistence-modules/spring-boot-persistence-2/src/main/resources/com/baeldung/boot/jdbi/dao/CarMakerDao/insert.sql @@ -1,4 +1,4 @@ -- -- Insert -- -insert into car_maker(id,name) values (:id,:name); +insert into car_maker(name) values (:name); diff --git a/persistence-modules/spring-boot-persistence-2/src/main/resources/com/baeldung/boot/jdbi/dao/CarModelDao/insert.sql b/persistence-modules/spring-boot-persistence-2/src/main/resources/com/baeldung/boot/jdbi/dao/CarModelDao/insert.sql index b277213584..6bca3a0d6d 100644 --- a/persistence-modules/spring-boot-persistence-2/src/main/resources/com/baeldung/boot/jdbi/dao/CarModelDao/insert.sql +++ b/persistence-modules/spring-boot-persistence-2/src/main/resources/com/baeldung/boot/jdbi/dao/CarModelDao/insert.sql @@ -1,8 +1,8 @@ -- -- Insert -- -insert into car_model(maker_fk,name,sku,year) values ( +insert into car_model(maker_fk,name,sku,yearDate) values ( :makerId, :name, :sku, - :year ); + :yearDate ); diff --git a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationIntegrationTest.java b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationIntegrationTest.java index ac5661afbc..948d197f14 100644 --- a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationIntegrationTest.java +++ b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationIntegrationTest.java @@ -76,7 +76,7 @@ public class SpringBootJdbiApplicationIntegrationTest { @Test public void givenExistingCarMaker_whenFindById_thenReturnExistingCarMaker() { - CarMaker maker = carMakerDao.findById(1l); + CarMaker maker = carMakerDao.findById(1L); assertThat(maker).isNotNull(); assertThat(maker.getId()).isEqualTo(1); @@ -85,12 +85,12 @@ public class SpringBootJdbiApplicationIntegrationTest { @Test public void givenExistingCarMaker_whenBulkInsertFails_thenRollback() { - CarMaker maker = carMakerDao.findById(1l); + CarMaker maker = carMakerDao.findById(1L); CarModel m1 = CarModel.builder() .makerId(maker.getId()) .name("Model X1") .sku("1-M1") - .year(2019) + .yearDate(2019) .build(); maker.getModels().add(m1); @@ -98,7 +98,7 @@ public class SpringBootJdbiApplicationIntegrationTest { .makerId(maker.getId()) .name("Model X1") .sku("1-M1") - .year(2019) + .yearDate(2019) .build(); maker.getModels().add(m2); diff --git a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/db/indexing/FileSystemImageIntegrationTest.java b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/db/indexing/FileSystemImageIntegrationTest.java index 83f5bae095..809d04cc96 100644 --- a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/db/indexing/FileSystemImageIntegrationTest.java +++ b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/db/indexing/FileSystemImageIntegrationTest.java @@ -4,8 +4,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import java.io.File; import java.io.InputStream; -import java.nio.file.Paths; +import java.net.URISyntaxException; +import java.net.URL; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -64,10 +66,13 @@ class FileSystemImageIntegrationTest { private FileSystemResource baeldungJpegResource() { ClassLoader classLoader = ClassLoader.getSystemClassLoader(); - String imagePath = classLoader.getResource("baeldung.jpeg") - .getFile(); - - return new FileSystemResource(Paths.get(imagePath)); + try { + final URL resource = classLoader.getResource("baeldung.jpeg"); + if (resource != null) { + return new FileSystemResource(new File(resource.toURI()).getAbsolutePath()); + } + } catch (URISyntaxException ignore) {} + return null; } } diff --git a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/db/indexing/ImageIntegrationTest.java b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/db/indexing/ImageIntegrationTest.java index e38e0a21a9..09e13aefd4 100644 --- a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/db/indexing/ImageIntegrationTest.java +++ b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/db/indexing/ImageIntegrationTest.java @@ -7,6 +7,8 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import java.io.IOException; import java.io.InputStream; +import java.net.URISyntaxException; +import java.net.URL; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Optional; @@ -68,11 +70,15 @@ class ImageIntegrationTest { private Image baeldungImage() throws IOException { ClassLoader classLoader = ClassLoader.getSystemClassLoader(); - - Image mockImage = new Image(); - mockImage.setContent(Files.readAllBytes(Paths.get(classLoader.getResource("baeldung.jpeg") - .getFile()))); - return mockImage; + try { + final URL resource = classLoader.getResource("baeldung.jpeg"); + if (resource != null) { + Image mockImage = new Image(); + mockImage.setContent(Files.readAllBytes(Paths.get(resource.toURI()))); + return mockImage; + } + } catch (URISyntaxException ignore) {} + return null; } } diff --git a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerIntegrationTest.java b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerIntegrationTest.java index 6956df0b13..bdd9a19b68 100644 --- a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerIntegrationTest.java +++ b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerIntegrationTest.java @@ -29,8 +29,7 @@ public class CustomerControllerIntegrationTest { @Before public void setUpJsonMediaType() { - MEDIA_TYPE_JSON = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); - + MEDIA_TYPE_JSON = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype()); } @Test diff --git a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/states/UserEntityIntegrationTest.java b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/states/UserEntityIntegrationTest.java index 5d0dc99ad7..0ce3ff34ce 100644 --- a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/states/UserEntityIntegrationTest.java +++ b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/states/UserEntityIntegrationTest.java @@ -9,7 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import javax.persistence.EntityManagerFactory; +import jakarta.persistence.EntityManagerFactory; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; diff --git a/persistence-modules/spring-boot-persistence-2/src/test/resources/data.sql b/persistence-modules/spring-boot-persistence-2/src/test/resources/data.sql index e3e1f4ae32..fb97140b48 100644 --- a/persistence-modules/spring-boot-persistence-2/src/test/resources/data.sql +++ b/persistence-modules/spring-boot-persistence-2/src/test/resources/data.sql @@ -1,12 +1,12 @@ -insert into car_maker(id,name) values (1,'Special Motors'); -insert into car_maker(id,name) values (2,'BWM'); -insert into car_maker(id,name) values (3,'Dolores'); +insert into car_maker(id,name) values (99,'Special Motors'); +insert into car_maker(id,name) values (100,'BWM'); +insert into car_maker(id,name) values (102,'Dolores'); -insert into car_model(id,maker_fk,name,sku,year) values(1,1,'Muze','SM001',2018); -insert into car_model(id,maker_fk,name,sku,year) values(2,1,'Empada','SM002',2008); +insert into car_model(id,maker_fk,name,sku,yearDate) values(132,99,'Muze','SM001',2018); +insert into car_model(id,maker_fk,name,sku,yearDate) values(145,99,'Empada','SM002',2008); -insert into car_model(id,maker_fk,name,sku,year) values(4,2,'BWM-100','BWM100',2008); -insert into car_model(id,maker_fk,name,sku,year) values(5,2,'BWM-200','BWM200',2009); -insert into car_model(id,maker_fk,name,sku,year) values(6,2,'BWM-300','BWM300',2008); +insert into car_model(id,maker_fk,name,sku,yearDate) values(43,100,'BWM-100','BWM100',2008); +insert into car_model(id,maker_fk,name,sku,yearDate) values(564,100,'BWM-200','BWM200',2009); +insert into car_model(id,maker_fk,name,sku,yearDate) values(343,100,'BWM-300','BWM300',2008); diff --git a/persistence-modules/spring-boot-persistence-2/src/test/resources/schema.sql b/persistence-modules/spring-boot-persistence-2/src/test/resources/schema.sql index 8d7db6c9f3..72f9e606de 100644 --- a/persistence-modules/spring-boot-persistence-2/src/test/resources/schema.sql +++ b/persistence-modules/spring-boot-persistence-2/src/test/resources/schema.sql @@ -19,9 +19,9 @@ create table car_model( maker_fk int not null, name varchar(128) not null, sku varchar(128) not null, - year int not null + yearDate int not null ); create unique index ui_car_model_01 on car_model(maker_fk,sku); -create unique index ui_car_model_02 on car_model(maker_fk,name,year); +create unique index ui_car_model_02 on car_model(maker_fk,name,yearDate); diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/pom.xml b/persistence-modules/spring-boot-persistence-mongodb-2/pom.xml index cd7198b931..121581498a 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-2/pom.xml +++ b/persistence-modules/spring-boot-persistence-mongodb-2/pom.xml @@ -5,7 +5,6 @@ 4.0.0 spring-boot-persistence-mongodb-2 spring-boot-persistence-mongodb-2 - war This is simple boot application for Spring boot persistence mongodb test diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/pom.xml b/persistence-modules/spring-boot-persistence-mongodb-3/pom.xml index 484e0c0f7e..b699a33559 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/pom.xml +++ b/persistence-modules/spring-boot-persistence-mongodb-3/pom.xml @@ -5,7 +5,6 @@ 4.0.0 spring-boot-persistence-mongodb-3 spring-boot-persistence-mongodb-3 - war This is simple boot application for Spring boot persistence mongodb diff --git a/persistence-modules/spring-boot-persistence-mongodb/pom.xml b/persistence-modules/spring-boot-persistence-mongodb/pom.xml index 724fa38f7e..aae307f7f8 100644 --- a/persistence-modules/spring-boot-persistence-mongodb/pom.xml +++ b/persistence-modules/spring-boot-persistence-mongodb/pom.xml @@ -5,7 +5,6 @@ 4.0.0 spring-boot-persistence-mongodb spring-boot-persistence-mongodb - war This is simple boot application for Spring boot persistence mongodb test From 97bff9fd50b9db91ec5a993598cb696cb58b629a Mon Sep 17 00:00:00 2001 From: Dmytro Budym <46810751+dbudim@users.noreply.github.com> Date: Sat, 13 May 2023 03:12:38 +0200 Subject: [PATCH 129/141] [Check If a Specified Key Exists in a Given S3 Bucket using Java] added code examples (#13775) * [Check If a Specified Key Exists in a Given S3 Bucket using Java]] added code examples for change test name remove link from README.md * - used env variables for AWS credentials - used codestyle profile of baledung --- .../com/baeldung/s3/AWSS3ObjectUtils.java | 42 ++++++++++++++++++ .../s3/AWSS3ObjectIntegrationTest.java | 44 +++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 aws-modules/aws-s3/src/main/java/com/baeldung/s3/AWSS3ObjectUtils.java create mode 100644 aws-modules/aws-s3/src/test/java/com/baeldung/s3/AWSS3ObjectIntegrationTest.java diff --git a/aws-modules/aws-s3/src/main/java/com/baeldung/s3/AWSS3ObjectUtils.java b/aws-modules/aws-s3/src/main/java/com/baeldung/s3/AWSS3ObjectUtils.java new file mode 100644 index 0000000000..1c31218ff9 --- /dev/null +++ b/aws-modules/aws-s3/src/main/java/com/baeldung/s3/AWSS3ObjectUtils.java @@ -0,0 +1,42 @@ +package com.baeldung.s3; + +import org.apache.http.HttpStatus; + +import com.amazonaws.AmazonServiceException; +import com.amazonaws.services.s3.AmazonS3; + +public class AWSS3ObjectUtils { + + private AmazonS3 s3Client; + + public AWSS3ObjectUtils(AmazonS3 s3client) { + this.s3Client = s3client; + } + + public boolean doesObjectExistByDefaultMethod(String bucket, String key) { + return s3Client.doesObjectExist(bucket, key); + } + + public boolean doesObjectExistByListObjects(String bucket, String key) { + return s3Client.listObjects(bucket) + .getObjectSummaries() + .stream() + .filter(s3ObjectSummary -> s3ObjectSummary.getKey() + .equals(key)) + .findFirst() + .isPresent(); + } + + public boolean doesObjectExistByMetaData(String bucket, String key) { + try { + s3Client.getObjectMetadata(bucket, key); + return true; + } catch (AmazonServiceException e) { + if (e.getStatusCode() == HttpStatus.SC_NOT_FOUND) { + return false; + } else { + throw e; + } + } + } +} \ No newline at end of file diff --git a/aws-modules/aws-s3/src/test/java/com/baeldung/s3/AWSS3ObjectIntegrationTest.java b/aws-modules/aws-s3/src/test/java/com/baeldung/s3/AWSS3ObjectIntegrationTest.java new file mode 100644 index 0000000000..7fe9081fe3 --- /dev/null +++ b/aws-modules/aws-s3/src/test/java/com/baeldung/s3/AWSS3ObjectIntegrationTest.java @@ -0,0 +1,44 @@ +package com.baeldung.s3; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.Before; +import org.junit.Test; + +import com.amazonaws.auth.EnvironmentVariableCredentialsProvider; +import com.amazonaws.regions.Regions; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; + +public class AWSS3ObjectIntegrationTest { + + private static final String BUCKET = "your-bucket"; + private static final String KEY_THAT_EXIST = "your-key-that-exist"; + private AWSS3ObjectUtils s3ObjectUtils; + + @Before + public void setUp() { + AmazonS3 client = AmazonS3ClientBuilder.standard() + .withRegion(Regions.DEFAULT_REGION) + .withCredentials(new EnvironmentVariableCredentialsProvider()) + .build(); + + s3ObjectUtils = new AWSS3ObjectUtils(client); + } + + @Test + public void whenVerifyIfObjectExistByDefaultMethod_thenCorrect() { + assertTrue(s3ObjectUtils.doesObjectExistByDefaultMethod(BUCKET, KEY_THAT_EXIST), "Key: " + KEY_THAT_EXIST + " doesn't exist"); + + } + + @Test + public void whenVerifyIfObjectExistByListObjects_thenCorrect() { + assertTrue(s3ObjectUtils.doesObjectExistByListObjects(BUCKET, KEY_THAT_EXIST), "Key: " + KEY_THAT_EXIST + " doesn't exist"); + } + + @Test + public void whenVerifyIfObjectExistByMetaData_thenCorrect() { + assertTrue(s3ObjectUtils.doesObjectExistByMetaData(BUCKET, KEY_THAT_EXIST), "Key: " + KEY_THAT_EXIST + " doesn't exist"); + } +} From 535d967fd963417565154e20fa72513dd738b264 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sat, 13 May 2023 17:09:08 +0200 Subject: [PATCH 130/141] [os-to-is] Convert an OutputStream to an InputStream (#13992) --- ...vertOutputStreamToInputStreamUnitTest.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/outputstreamtoinputstream/ConvertOutputStreamToInputStreamUnitTest.java diff --git a/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/outputstreamtoinputstream/ConvertOutputStreamToInputStreamUnitTest.java b/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/outputstreamtoinputstream/ConvertOutputStreamToInputStreamUnitTest.java new file mode 100644 index 0000000000..53e9da6dbb --- /dev/null +++ b/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/outputstreamtoinputstream/ConvertOutputStreamToInputStreamUnitTest.java @@ -0,0 +1,53 @@ +package com.baeldung.outputstreamtoinputstream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; + +import org.junit.jupiter.api.Test; + +public class ConvertOutputStreamToInputStreamUnitTest { + + @Test + void whenUsingByteArray_thenGetExpectedInputStream() throws IOException { + String content = "I'm an important message."; + try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { + out.write(content.getBytes()); + try (ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray())) { + String inContent = new String(in.readAllBytes()); + + assertEquals(content, inContent); + } + } + } + + @Test + void whenUsingPipeStream_thenGetExpectedInputStream() throws IOException { + String content = "I'm going through the pipe."; + + ByteArrayOutputStream originOut = new ByteArrayOutputStream(); + originOut.write(content.getBytes()); + + //connect the pipe + PipedInputStream in = new PipedInputStream(); + PipedOutputStream out = new PipedOutputStream(in); + + try (in) { + new Thread(() -> { + try (out) { + originOut.writeTo(out); + } catch (IOException iox) { + // handle IOExceptions + } + }).start(); + + String inContent = new String(in.readAllBytes()); + assertEquals(content, inContent); + } + } + +} \ No newline at end of file From e1272ca8fecfb7feb76571a5b09c91aec8e799e0 Mon Sep 17 00:00:00 2001 From: Vartika Nigam <63852792+vnigam2702@users.noreply.github.com> Date: Sat, 13 May 2023 21:02:14 +0530 Subject: [PATCH 131/141] =?UTF-8?q?BAEL-6264=20added=20class=20to=20show?= =?UTF-8?q?=20how=20to=20instantiate=20ArrayBlockingQueue=20a=E2=80=A6=20(?= =?UTF-8?q?#13851)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * BAEL-6264 added class to show how to instantiate ArrayBlockingQueue and LinkedBlockingQueue * BAEL-6264 added unit test case * modified test case * BAEL-6264 deleted BlockingQueueImplExample file not needed anymore * BAEL-6264 code review changes moved class file to different module --------- Co-authored-by: Vartika_Nigam --- .../queue/BlockingQueueUnitTest.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrent/queue/BlockingQueueUnitTest.java diff --git a/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrent/queue/BlockingQueueUnitTest.java b/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrent/queue/BlockingQueueUnitTest.java new file mode 100644 index 0000000000..e913747f2d --- /dev/null +++ b/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrent/queue/BlockingQueueUnitTest.java @@ -0,0 +1,26 @@ +package com.baeldung.concurrent.queue; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; + +import org.junit.Test; +import static org.junit.Assert.assertEquals; + +public class BlockingQueueUnitTest { + + @Test + public void givenArrayBlockingQueue_whenAddedElements_thenReturnQueueRemainingCapacity() { + BlockingQueue arrayBlockingQueue = new ArrayBlockingQueue<>(10); + arrayBlockingQueue.add("TestString1"); + arrayBlockingQueue.add("TestString2"); + assertEquals(8, arrayBlockingQueue.remainingCapacity()); + } + + @Test + public void givenLinkedBlockingQueue_whenAddedElements_thenReturnQueueRemainingCapacity() { + BlockingQueue linkedBlockingQueue = new LinkedBlockingQueue<>(10); + linkedBlockingQueue.add("TestString1"); + assertEquals(9, linkedBlockingQueue.remainingCapacity()); + } +} \ No newline at end of file From 0a634dfa0322527c2850357f5c01d5860a14a160 Mon Sep 17 00:00:00 2001 From: Dmytro Budym <46810751+dbudim@users.noreply.github.com> Date: Sun, 14 May 2023 04:59:37 +0200 Subject: [PATCH 132/141] Add code examples for "Opening a New Tab Using Selenium WebDriver in Java" (#14001) Add code examples for "Opening a New Tab Using Selenium WebDriver in Java" --- .../SeleniumOpenNewTabIntegrationTest.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/tabs/SeleniumOpenNewTabIntegrationTest.java diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/tabs/SeleniumOpenNewTabIntegrationTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/tabs/SeleniumOpenNewTabIntegrationTest.java new file mode 100644 index 0000000000..4316fedebf --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/tabs/SeleniumOpenNewTabIntegrationTest.java @@ -0,0 +1,53 @@ +package com.baeldung.selenium.tabs; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WindowType; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.time.Duration; + +public class SeleniumOpenNewTabIntegrationTest { + + private WebDriver driver; + private static final int TIMEOUT = 10; + private static final int EXPECTED_TABS_COUNT = 2; + + @BeforeMethod + public void initDriver() { + WebDriverManager.chromedriver().setup(); + driver = new ChromeDriver(); + } + + @Test + public void whenUseTabsApiOpenWindow_thenNewTabOpened() { + driver.switchTo().newWindow(WindowType.TAB); + waitTabsCount(EXPECTED_TABS_COUNT); + } + + @Test + public void whenExecuteOpenWindowJsScript_thenNewTabOpened() { + ((JavascriptExecutor) driver).executeScript("window.open()"); + waitTabsCount(EXPECTED_TABS_COUNT); + } + + + @AfterMethod + public void closeBrowser() { + driver.quit(); + } + + + private void waitTabsCount(int tabsCount) { + new WebDriverWait(driver, Duration.ofSeconds(TIMEOUT)) + .withMessage("Tabs count should be: " + tabsCount) + .until(ExpectedConditions.numberOfWindowsToBe(tabsCount)); + } + +} From 4fb65f5c6e41e73f183def7cabbca393d1a5e856 Mon Sep 17 00:00:00 2001 From: Ehsan Sasanianno Date: Sun, 14 May 2023 19:13:06 +0200 Subject: [PATCH 133/141] JAVA-16946 Upgrade h2 database version for remaining modules (#13976) --- core-java-modules/core-java-lang-oop-modifiers/pom.xml | 2 +- core-java-modules/pom.xml | 2 +- persistence-modules/java-jpa-2/pom.xml | 2 +- .../src/main/java/com/baeldung/jpa/defaultvalues/User.java | 2 +- .../java-jpa-2/src/main/resources/META-INF/persistence.xml | 2 +- .../java-jpa-2/src/test/resources/META-INF/persistence.xml | 2 +- persistence-modules/pom.xml | 2 +- persistence-modules/spring-jooq/pom.xml | 4 ++-- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/core-java-modules/core-java-lang-oop-modifiers/pom.xml b/core-java-modules/core-java-lang-oop-modifiers/pom.xml index c193073a0e..459aa21721 100644 --- a/core-java-modules/core-java-lang-oop-modifiers/pom.xml +++ b/core-java-modules/core-java-lang-oop-modifiers/pom.xml @@ -23,7 +23,7 @@ - 1.4.197 + 2.1.214 \ No newline at end of file diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 66456d2045..91f0dbfc28 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -97,7 +97,7 @@ core-java-lang-oop-constructors core-java-lang-oop-patterns core-java-lang-oop-generics - + core-java-lang-oop-modifiers core-java-lang-oop-types core-java-lang-oop-types-2 core-java-lang-oop-inheritance diff --git a/persistence-modules/java-jpa-2/pom.xml b/persistence-modules/java-jpa-2/pom.xml index b736b50dd1..38dd64d7b2 100644 --- a/persistence-modules/java-jpa-2/pom.xml +++ b/persistence-modules/java-jpa-2/pom.xml @@ -137,7 +137,7 @@ 3.3.3 3.0.0 4.3.1 - 1.4.200 + 2.1.214 \ No newline at end of file diff --git a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/defaultvalues/User.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/defaultvalues/User.java index 436c708d40..83b05fbc59 100644 --- a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/defaultvalues/User.java +++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/defaultvalues/User.java @@ -5,7 +5,7 @@ import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; -@Entity +@Entity(name = "users") public class User { @Id diff --git a/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml b/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml index 3bc81910d9..1e3d3470ed 100644 --- a/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml +++ b/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml @@ -197,7 +197,7 @@ + value="jdbc:h2:mem:test;MODE=LEGACY" /> + value="jdbc:h2:mem:test;MODE=LEGACY" /> spring-jpa spring-jpa-2 FAILED --> spring-jdbc - + spring-jooq spring-mybatis spring-persistence-simple diff --git a/persistence-modules/spring-jooq/pom.xml b/persistence-modules/spring-jooq/pom.xml index 9848c726c5..d12a921212 100644 --- a/persistence-modules/spring-jooq/pom.xml +++ b/persistence-modules/spring-jooq/pom.xml @@ -195,11 +195,11 @@ - 3.14.15 + 3.16.18 1.0.0 1.5 1.0.0 - 1.4.200 + 2.1.214 \ No newline at end of file From 65f6f416c57c4fff6eb10e72881cd3817f1badec Mon Sep 17 00:00:00 2001 From: Dileesha Rajapakse Date: Sun, 14 May 2023 22:45:57 +0530 Subject: [PATCH 134/141] Add java interface single implementation examples (#13972) --- .../baeldung/interfacesingleimpl/Animal.java | 5 ++ .../interfacesingleimpl/AnimalCare.java | 13 +++++ .../com/baeldung/interfacesingleimpl/Cat.java | 21 ++++++++ .../com/baeldung/interfacesingleimpl/Dog.java | 22 ++++++++ .../InterfaceSingleImplUnitTest.java | 51 +++++++++++++++++++ .../interfacesingleimpl/MockAnimal.java | 8 +++ 6 files changed, 120 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacesingleimpl/Animal.java create mode 100644 core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacesingleimpl/AnimalCare.java create mode 100644 core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacesingleimpl/Cat.java create mode 100644 core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacesingleimpl/Dog.java create mode 100644 core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/interfacesingleimpl/InterfaceSingleImplUnitTest.java create mode 100644 core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/interfacesingleimpl/MockAnimal.java diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacesingleimpl/Animal.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacesingleimpl/Animal.java new file mode 100644 index 0000000000..b20c01cac9 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacesingleimpl/Animal.java @@ -0,0 +1,5 @@ +package com.baeldung.interfacesingleimpl; + +public interface Animal { + String makeSound(); +} diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacesingleimpl/AnimalCare.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacesingleimpl/AnimalCare.java new file mode 100644 index 0000000000..0d7b732056 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacesingleimpl/AnimalCare.java @@ -0,0 +1,13 @@ +package com.baeldung.interfacesingleimpl; + +public class AnimalCare { + private Animal animal; + + public AnimalCare(Animal animal) { + this.animal = animal; + } + + public String animalSound() { + return animal.makeSound(); + } +} diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacesingleimpl/Cat.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacesingleimpl/Cat.java new file mode 100644 index 0000000000..7540e0823b --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacesingleimpl/Cat.java @@ -0,0 +1,21 @@ +package com.baeldung.interfacesingleimpl; + +public class Cat { + private String name; + + public Cat(String name) { + this.name = name; + } + + public String makeSound() { + return "Meow! My name is " + name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacesingleimpl/Dog.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacesingleimpl/Dog.java new file mode 100644 index 0000000000..1dfd3bea0d --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacesingleimpl/Dog.java @@ -0,0 +1,22 @@ +package com.baeldung.interfacesingleimpl; + +public class Dog implements Animal { + private String name; + + public Dog(String name) { + this.name = name; + } + + @Override + public String makeSound() { + return "Woof! My name is " + name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/interfacesingleimpl/InterfaceSingleImplUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/interfacesingleimpl/InterfaceSingleImplUnitTest.java new file mode 100644 index 0000000000..4044a554a3 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/interfacesingleimpl/InterfaceSingleImplUnitTest.java @@ -0,0 +1,51 @@ +package com.baeldung.interfacesingleimpl; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; + +public class InterfaceSingleImplUnitTest { + @Test + public void whenUsingMockAnimal_thenAnimalSoundIsCorrect() { + MockAnimal mockAnimal = new MockAnimal(); + String expected = "Mock animal sound!"; + AnimalCare animalCare = new AnimalCare(mockAnimal); + assertThat(animalCare.animalSound()).isEqualTo(expected); + } + + @Test + public void whenCreatingDog_thenDogMakesWoofSound() { + Dog dog = new Dog("Buddy"); + String expected = "Woof! My name is Buddy"; + assertThat(dog.makeSound()).isEqualTo(expected); + } + + @Test + public void whenCreatingCat_thenCatMakesMeowSound() { + Cat cat = new Cat("FuzzBall"); + String expected = "Meow! My name is FuzzBall"; + assertThat(cat.makeSound()).isEqualTo(expected); + } + + @Test + public void whenCreatingAnimalCareWithDog_thenDogMakesWoofSound() { + Animal dog = new Dog("Ham"); + AnimalCare animalCare = new AnimalCare(dog); + String expected = "Woof! My name is Ham"; + assertThat(animalCare.animalSound()).isEqualTo(expected); + } + + @Test + public void whenCreatingCatCareWithCat_thenCatMakesMeowSound() { + Cat cat = new Cat("Grumpy"); + String expected = "Meow! My name is Grumpy"; + assertThat(cat.makeSound()).isEqualTo(expected); + } + + @Test + public void whenCreatingMockAnimal_thenMockAnimalMakesMockAnimalSound() { + MockAnimal mockAnimal = new MockAnimal(); + String expected = "Mock animal sound!"; + assertThat(mockAnimal.makeSound()).isEqualTo(expected); + } +} diff --git a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/interfacesingleimpl/MockAnimal.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/interfacesingleimpl/MockAnimal.java new file mode 100644 index 0000000000..1d3b264f45 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/interfacesingleimpl/MockAnimal.java @@ -0,0 +1,8 @@ +package com.baeldung.interfacesingleimpl; + +public class MockAnimal implements Animal { + @Override + public String makeSound() { + return "Mock animal sound!"; + } +} From 2da5d14e25cb9e31911d7d428d1c1136a5356e12 Mon Sep 17 00:00:00 2001 From: Bahaa El-Din Helmy Date: Mon, 15 May 2023 18:14:21 +0300 Subject: [PATCH 135/141] Add files via upload (#14006) --- .../core-java-collections-list-5/pom.xml | 73 ++++++++++--------- .../ArrayAndArrayListPerformance.java | 65 +++++++++++++++++ 2 files changed, 105 insertions(+), 33 deletions(-) create mode 100644 core-java-modules/core-java-collections-list-5/src/main/java/com/baeldung/arrayandlistperformance/ArrayAndArrayListPerformance.java diff --git a/core-java-modules/core-java-collections-list-5/pom.xml b/core-java-modules/core-java-collections-list-5/pom.xml index b51dda4091..c7ee3c3efd 100644 --- a/core-java-modules/core-java-collections-list-5/pom.xml +++ b/core-java-modules/core-java-collections-list-5/pom.xml @@ -1,34 +1,41 @@ - - - 4.0.0 - core-java-collections-list-5 - core-java-collections-list-5 - jar - - - com.baeldung.core-java-modules - core-java-modules - 0.0.1-SNAPSHOT - - - - - commons-lang - commons-lang - ${commons-lang.version} - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - - - 2.2 - 3.12.0 - - + + + 4.0.0 + core-java-collections-list-5 + core-java-collections-list-5 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + org.openjdk.jmh + jmh-core + 1.36 + + + + commons-lang + commons-lang + ${commons-lang.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + + 1.21 + 2.2 + 3.12.0 + + \ No newline at end of file diff --git a/core-java-modules/core-java-collections-list-5/src/main/java/com/baeldung/arrayandlistperformance/ArrayAndArrayListPerformance.java b/core-java-modules/core-java-collections-list-5/src/main/java/com/baeldung/arrayandlistperformance/ArrayAndArrayListPerformance.java new file mode 100644 index 0000000000..3b8fa8c9f3 --- /dev/null +++ b/core-java-modules/core-java-collections-list-5/src/main/java/com/baeldung/arrayandlistperformance/ArrayAndArrayListPerformance.java @@ -0,0 +1,65 @@ +package com.baeldung.arrayandlistperformance; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.runner.options.OptionsBuilder; +import java.util.ArrayList; +import java.util.concurrent.TimeUnit; +@State(Scope.Benchmark) +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +public class ArrayAndArrayListPerformance { + + @Benchmark + public void arrayCreation() { + int[] array = new int[1000000]; + } + + @Benchmark + public void arrayListCreation() { + ArrayList list = new ArrayList<>(1000000); + } + + @Benchmark + public void arrayItemSetting() { + int[] array = new int[1000000]; + array[0] = 10; + } + + @Benchmark + public void arrayListItemSetting() { + ArrayList list = new ArrayList<>(1000000); + list.add(0, 10); + } + + @Benchmark + public void arrayItemRetrieval() { + int[] array = new int[1000000]; + array[0] = 10; + int item = array[0]; + } + + @Benchmark + public void arrayListItemRetrieval() { + ArrayList list = new ArrayList<>(1000000); + list.add(0, 10); + int item2 = list.get(0); + } + + @Benchmark + public void arrayCloning() { + int[] array = new int[1000000]; + int[] newArray = array.clone(); + } + + @Benchmark + public void arrayListCloning() { + ArrayList list = new ArrayList<>(1000000); + ArrayList newList = new ArrayList<>(list); + } + public static void main(String[] args) throws Exception { + org.openjdk.jmh.runner.Runner runner = new org.openjdk.jmh.runner.Runner(new OptionsBuilder() + .include(ArrayAndArrayListPerformance.class.getSimpleName()) + .forks(1) + .build()); + runner.run(); + } + } \ No newline at end of file From 7750bafc1d091829e45c824accd0eb4511c8d342 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Mon, 15 May 2023 23:10:14 +0530 Subject: [PATCH 136/141] JAVA-20828 Fixed module name (#14018) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 996ebdc459..0744823446 100644 --- a/pom.xml +++ b/pom.xml @@ -1201,7 +1201,7 @@ web-modules/bootique web-modules/dropwizard web-modules/google-web-toolkit - web-modules/google-jakarta-ee + web-modules/jakarta-ee From f07f239d8df64dfd22217d55b1c9806f31538426 Mon Sep 17 00:00:00 2001 From: Dmytro Budym <46810751+dbudim@users.noreply.github.com> Date: Mon, 15 May 2023 19:43:53 +0200 Subject: [PATCH 137/141] fix SeleniumOpenNewTabLiveTest (#14019) --- ...wTabIntegrationTest.java => SeleniumOpenNewTabLiveTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/tabs/{SeleniumOpenNewTabIntegrationTest.java => SeleniumOpenNewTabLiveTest.java} (96%) diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/tabs/SeleniumOpenNewTabIntegrationTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/tabs/SeleniumOpenNewTabLiveTest.java similarity index 96% rename from testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/tabs/SeleniumOpenNewTabIntegrationTest.java rename to testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/tabs/SeleniumOpenNewTabLiveTest.java index 4316fedebf..9e64073cb9 100644 --- a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/tabs/SeleniumOpenNewTabIntegrationTest.java +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/tabs/SeleniumOpenNewTabLiveTest.java @@ -13,7 +13,7 @@ import org.testng.annotations.Test; import java.time.Duration; -public class SeleniumOpenNewTabIntegrationTest { +public class SeleniumOpenNewTabLiveTest { private WebDriver driver; private static final int TIMEOUT = 10; From 3fce001db643195f688fa4eb8af2617b53e25fd8 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Mon, 15 May 2023 21:16:21 +0200 Subject: [PATCH 138/141] BAEL-6493 - Read last N messages from a Kafka Topic (#14020) --- .../kafka/KafaConsumeLastNMessages.java | 138 ++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 apache-kafka-2/src/test/java/com/baeldung/kafka/KafaConsumeLastNMessages.java diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/KafaConsumeLastNMessages.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/KafaConsumeLastNMessages.java new file mode 100644 index 0000000000..94f5907525 --- /dev/null +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/KafaConsumeLastNMessages.java @@ -0,0 +1,138 @@ +package com.baeldung.kafka; + +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.TopicPartition; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.apache.kafka.common.serialization.StringSerializer; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.KafkaContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import java.util.concurrent.ExecutionException; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@Testcontainers +public class KafaConsumeLastNMessages { + + private static String TOPIC1 = "baeldung-github"; + private static String TOPIC2 = "baeldung-blog"; + private static String MESSAGE_KEY = "message"; + private static KafkaProducer producer; + private static KafkaConsumer consumer; + private static KafkaProducer transactionalProducer; + + @Container + private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); + + @BeforeAll + static void setup() { + KAFKA_CONTAINER.addExposedPort(9092); + + Properties producerProperties = new Properties(); + producerProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); + producerProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + producerProperties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + + Properties consumerProperties = new Properties(); + consumerProperties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); + consumerProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + consumerProperties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + consumerProperties.put(ConsumerConfig.GROUP_ID_CONFIG, "ConsumerGroup1"); + + Properties transactionalProducerProprieties = new Properties(); + transactionalProducerProprieties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); + transactionalProducerProprieties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + transactionalProducerProprieties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + transactionalProducerProprieties.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, "true"); + transactionalProducerProprieties.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG, "prod-0"); + + producer = new KafkaProducer<>(producerProperties); + consumer = new KafkaConsumer<>(consumerProperties); + transactionalProducer = new KafkaProducer<>(transactionalProducerProprieties); + } + + @AfterAll + static void destroy() { + KAFKA_CONTAINER.stop(); + } + + @Test + void whenSeekingKafkaTopicCursorToEnd_consumerRetrievesOnlyDesiredNumberOfMessages() throws ExecutionException, InterruptedException { + int messagesInTopic = 100; + int messagesToRetrieve = 20; + + for (int i = 0; i < messagesInTopic; i++) { + producer.send(new ProducerRecord<>(TOPIC1, null, MESSAGE_KEY, String.valueOf(i))) + .get(); + } + + TopicPartition partition = new TopicPartition(TOPIC1, 0); + List partitions = new ArrayList<>(); + partitions.add(partition); + consumer.assign(partitions); + + consumer.seekToEnd(partitions); + long startIndex = consumer.position(partition) - messagesToRetrieve; + consumer.seek(partition, startIndex); + + ConsumerRecords records = consumer.poll(Duration.ofMinutes(1)); + int recordsReceived = 0; + for (ConsumerRecord record : records) { + assertEquals(MESSAGE_KEY, record.key()); + assertTrue(Integer.parseInt(record.value()) >= (messagesInTopic - messagesToRetrieve)); + recordsReceived++; + } + + assertEquals(messagesToRetrieve, recordsReceived); + } + + @Test + void havingTransactionalProducer_whenSeekingKafkaTopicCursorToEnd_consumerRetrievesLessMessages() throws ExecutionException, InterruptedException { + int messagesInTopic = 100; + int messagesToRetrieve = 20; + + transactionalProducer.initTransactions(); + for (int i = 0; i < messagesInTopic; i++) { + transactionalProducer.beginTransaction(); + transactionalProducer.send(new ProducerRecord<>(TOPIC2, null, MESSAGE_KEY, String.valueOf(i))) + .get(); + transactionalProducer.commitTransaction(); + } + + TopicPartition partition = new TopicPartition(TOPIC2, 0); + List partitions = new ArrayList<>(); + partitions.add(partition); + consumer.assign(partitions); + + consumer.seekToEnd(partitions); + long startIndex = consumer.position(partition) - messagesToRetrieve; + consumer.seek(partition, startIndex); + + ConsumerRecords records = consumer.poll(Duration.ofMinutes(1)); + int recordsReceived = 0; + for (ConsumerRecord record : records) { + assertEquals(MESSAGE_KEY, record.key()); + assertTrue(Integer.parseInt(record.value()) >= (messagesInTopic - messagesToRetrieve)); + recordsReceived++; + } + + assertTrue(messagesToRetrieve > recordsReceived); + } + +} From 389a106697fe9e7cc0205df06b39ba3a1164cde4 Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Tue, 16 May 2023 08:28:25 +0200 Subject: [PATCH 139/141] BAEL-6398: Java PrintStream to String (#13998) --- .../PrintStreamToStringUtil.java | 68 +++++++++++++++++++ .../PrintStreamToStringUtilUnitTest.java | 32 +++++++++ 2 files changed, 100 insertions(+) create mode 100644 core-java-modules/core-java-io-conversions-2/src/main/java/com/baeldung/printstreamtostring/PrintStreamToStringUtil.java create mode 100644 core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/printstreamtostring/PrintStreamToStringUtilUnitTest.java diff --git a/core-java-modules/core-java-io-conversions-2/src/main/java/com/baeldung/printstreamtostring/PrintStreamToStringUtil.java b/core-java-modules/core-java-io-conversions-2/src/main/java/com/baeldung/printstreamtostring/PrintStreamToStringUtil.java new file mode 100644 index 0000000000..72bba78db0 --- /dev/null +++ b/core-java-modules/core-java-io-conversions-2/src/main/java/com/baeldung/printstreamtostring/PrintStreamToStringUtil.java @@ -0,0 +1,68 @@ +package com.baeldung.printstreamtostring; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; + +public class PrintStreamToStringUtil { + + public static String usingByteArrayOutputStreamClass(String input) throws IOException { + if (input == null) { + return null; + } + + String output; + try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); PrintStream printStream = new PrintStream(outputStream)) { + printStream.print(input); + + output = outputStream.toString(); + } + + return output; + } + + public static String usingApacheCommonsIO(String input) { + if (input == null) { + return null; + } + + org.apache.commons.io.output.ByteArrayOutputStream outputStream = new org.apache.commons.io.output.ByteArrayOutputStream(); + try (PrintStream printStream = new PrintStream(outputStream)) { + printStream.print(input); + } + + return new String(outputStream.toByteArray()); + } + + public static String usingCustomOutputStream(String input) throws IOException { + if (input == null) { + return null; + } + + String output; + try (CustomOutputStream outputStream = new CustomOutputStream(); PrintStream printStream = new PrintStream(outputStream)) { + printStream.print(input); + + output = outputStream.toString(); + } + + return output; + } + + private static class CustomOutputStream extends OutputStream { + + private StringBuilder stringBuilder = new StringBuilder(); + + @Override + public void write(int b) throws IOException { + this.stringBuilder.append((char) b); + } + + @Override + public String toString() { + return this.stringBuilder.toString(); + } + } + +} diff --git a/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/printstreamtostring/PrintStreamToStringUtilUnitTest.java b/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/printstreamtostring/PrintStreamToStringUtilUnitTest.java new file mode 100644 index 0000000000..4db60b604e --- /dev/null +++ b/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/printstreamtostring/PrintStreamToStringUtilUnitTest.java @@ -0,0 +1,32 @@ +package com.baeldung.printstreamtostring; + +import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; + +import org.junit.Test; + +public class PrintStreamToStringUtilUnitTest { + + @Test + public void whenUsingByteArrayOutputStreamClass_thenConvert() throws IOException { + assertEquals("test", PrintStreamToStringUtil.usingByteArrayOutputStreamClass("test")); + assertEquals("", PrintStreamToStringUtil.usingByteArrayOutputStreamClass("")); + assertNull(PrintStreamToStringUtil.usingByteArrayOutputStreamClass(null)); + } + + @Test + public void whenCustomOutputStream_thenConvert() throws IOException { + assertEquals("world", PrintStreamToStringUtil.usingCustomOutputStream("world")); + assertEquals("", PrintStreamToStringUtil.usingCustomOutputStream("")); + assertNull(PrintStreamToStringUtil.usingCustomOutputStream(null)); + } + + @Test + public void whenUsingApacheCommonsIO_thenConvert() { + assertEquals("hello", PrintStreamToStringUtil.usingApacheCommonsIO("hello")); + assertEquals("", PrintStreamToStringUtil.usingApacheCommonsIO("")); + assertNull(PrintStreamToStringUtil.usingApacheCommonsIO(null)); + } +} From a9a44221fce4bf51bc9294df2e0bddcbf2ff0aba Mon Sep 17 00:00:00 2001 From: Ehsan Sasanianno Date: Tue, 16 May 2023 12:48:03 +0200 Subject: [PATCH 140/141] Revert "JAVA-20280: remove wrong property (#13874)" (#14021) This reverts commit 561e893e86d9c51b1e61818f5450d6194d9959fd. --- .../src/main/resources/application.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spring-reactive-modules/spring-reactive-exceptions/src/main/resources/application.yaml b/spring-reactive-modules/spring-reactive-exceptions/src/main/resources/application.yaml index 935ab2a263..50bcbff433 100644 --- a/spring-reactive-modules/spring-reactive-exceptions/src/main/resources/application.yaml +++ b/spring-reactive-modules/spring-reactive-exceptions/src/main/resources/application.yaml @@ -1,3 +1,7 @@ +spring: + codec: + max-in-memory-size: 500KB + server: port: 8080 host: http://localhost:${server.port} From 43c4e4b3371e7ad5e642fdd7fbed6e96734078be Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Tue, 16 May 2023 15:21:10 +0000 Subject: [PATCH 141/141] Hashing with Argon2 in Java (#14009) * Hashing with Argon2 in Java * Hashing with Argon2 in Java --- .../core-java-security-3/pom.xml | 8 ++- .../hash/argon/HashPasswordUnitTest.java | 65 +++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 core-java-modules/core-java-security-3/src/test/java/com/baeldung/hash/argon/HashPasswordUnitTest.java diff --git a/core-java-modules/core-java-security-3/pom.xml b/core-java-modules/core-java-security-3/pom.xml index fef8b53289..a4f60b4db5 100644 --- a/core-java-modules/core-java-security-3/pom.xml +++ b/core-java-modules/core-java-security-3/pom.xml @@ -30,12 +30,18 @@ jaxb-api ${jaxb-api.version} + + org.springframework.security + spring-security-crypto + ${spring-security-crypto.version} + - 1.60 + 1.70 1.11 2.3.1 + 6.0.3 \ No newline at end of file diff --git a/core-java-modules/core-java-security-3/src/test/java/com/baeldung/hash/argon/HashPasswordUnitTest.java b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/hash/argon/HashPasswordUnitTest.java new file mode 100644 index 0000000000..6e0e326821 --- /dev/null +++ b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/hash/argon/HashPasswordUnitTest.java @@ -0,0 +1,65 @@ +package com.baeldung.hash.argon; + +import static org.junit.jupiter.api.Assertions.*; + +import java.nio.charset.StandardCharsets; +import java.security.SecureRandom; + +import org.bouncycastle.crypto.generators.Argon2BytesGenerator; +import org.bouncycastle.crypto.params.Argon2Parameters; +import org.bouncycastle.util.encoders.Hex; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.security.crypto.argon2.Argon2PasswordEncoder; + +import java.util.Arrays; +import java.util.Base64; + +public class HashPasswordUnitTest { + + @Test + public void givenRawPassword_whenEncodedWithArgon2_thenMatchesEncodedPassword() { + String rawPassword = "Baeldung"; + + Argon2PasswordEncoder arg2SpringSecurity = new Argon2PasswordEncoder(16, 32, 1, 60000, 10); + String hashPassword = arg2SpringSecurity.encode(rawPassword); + + assertTrue(arg2SpringSecurity.matches(rawPassword, hashPassword)); + } + + @Test + public void givenRawPasswordAndSalt_whenArgon2AlgorithmIsUsed_thenHashIsCorrect() { + byte[] salt = generateSalt16Byte(); + String password = "Baeldung"; + + int iterations = 2; + int memLimit = 66536; + int hashLength = 32; + int parallelism = 1; + Argon2Parameters.Builder builder = new Argon2Parameters.Builder(Argon2Parameters.ARGON2_id).withVersion(Argon2Parameters.ARGON2_VERSION_13) + .withIterations(iterations) + .withMemoryAsKB(memLimit) + .withParallelism(parallelism) + .withSalt(salt); + + Argon2BytesGenerator generate = new Argon2BytesGenerator(); + generate.init(builder.build()); + byte[] result = new byte[hashLength]; + generate.generateBytes(password.getBytes(StandardCharsets.UTF_8), result, 0, result.length); + + Argon2BytesGenerator verifier = new Argon2BytesGenerator(); + verifier.init(builder.build()); + byte[] testHash = new byte[hashLength]; + verifier.generateBytes(password.getBytes(StandardCharsets.UTF_8), testHash, 0, testHash.length); + + assertTrue(Arrays.equals(result, testHash)); + } + + private static byte[] generateSalt16Byte() { + SecureRandom secureRandom = new SecureRandom(); + byte[] salt = new byte[16]; + secureRandom.nextBytes(salt); + return salt; + } + +}